Как понять насколько у вас все херово и где вы не успеваете
Это пост, после которого вы сразу побежите пересматривать производительность ваших стратежек, кода и серверов :)
На своих торговых серверах запускаете вот эту штуку
while true; do
cat /proc/pressure/cpu | grep some
sleep 1
done
она начнет выдавать что-то типа такого
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886791
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886791
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886791
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886885
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886885
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887148
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302
Внимательно смотрим на число total, но не на само значение, а на разницу с предыдущей строкой.
В моем случае это
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886791
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886791 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886791 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886885 = 94
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033886885 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887148 = 263
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302 = 154
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302 = 0
some avg10=0.00 avg60=0.00 avg300=0.00 total=2033887302 = 0
Вот эта разница - это то, насколько ваш код неээфективен в микросекундах (us) или если сильно натянуть упрощение - насколько ваш код не успевает.
Чуть подробнее как это работает:
(сразу оговорюсь что это очень упрощенное и не абслютно правильное описание, но так легче понять)
/proc/pressure/cpu - показывает накопленное ожидание CPU процессами.
В моем случае бывают процессы которые хотят cpu, но им его линукс еще не дает, и они могут ждать до 263 us.
Не всегда, но бывают секунды в которых это есть.
Мы не знаем точно какой именно процесс ждал, но как минимум был один который хотел cpu, но ему шедулер его не давал 263 us. Еще раз: это не сумма ожиданий, а условный max.
Этот /proc/pressure/cpu считается слишком жопашно и не прозрачно, но если вы увидите там числа типа 1_000 или 10_000 - то это означает что у вас есть процессы которые опаздывают на 1 ms или на 10 ms. Например, инфа уже прилетела в сокет, ядро уже переложило пакет из NIC в очередь ядра и сказала что есть select(), но процесс еще не разбудился и ждет CPU.
Именно для нашего любимого (или нет) HFT можно понять насколько мы опаздываем: данные уже есть, а мы нихера не делаем.
Мониторить надо долго: может быть ситуация что все время все 0, а потом раз в пару минут начинается жопа: потому что на сервере запускается какая-то хуета типа backup/flush. Например, если вы юзаете redis - то он раз в N времени будет делать disk flush и одно ядро займет на 100%. Это будут миллисекунды, никакой top/htop/cloudwatch этого не покажет в принципе, но в этот момент cpu pressure улетит и ваш код не будет успевать на десятки миллисекунд.
Абсолютно идеальную картину с нулем опозданий можно достичь только если у вас cpu-ядер больше чем процессов. Например, 10 процессов и 100 ядер. В этом случае каждый процесс займет свое ядро и нигде не будет опоздашек. Даже если у вас 10 ядер и 10 процессов - то все равно будут небольшие опопоздания (как у меня в примере).
После этой метрики вы поймете где сколько можно выиграть прежде чем жаловаться на ебучий aws fabric и биржи.
PS: шейрить пост без лайков запрещено
Хз какой тег поставить, наверное это все-таки дурка оптимизации #hellcode
Post #1782
811
- 🤝 28
- 👍 12
- ⚡ 4