Задать вопрос
AshBlade
@AshBlade
Просто хочу быть счастливым

Как обнаружить высокое потребление CPU?

Есть процесс (на линуксе), на который приходят запросы (разные). Я хочу обнаружить какие запросы потребляют слишком много CPU.

Изначально планировал так: в начале запроса получаю текущее время (start_time) и сохраняю текущее значение getrusage (в частности user_start_time - время в режиме пользователя), а в конце запроса высчитываю потребление таким образом:
(end_time - start_time) / (user_end_time - user_start_time)
.

Но:

1. Правильна ли эта формула?
2. Стоит ли учитывать системное время (из того же rusage)?
3. Есть ли другие подходы?
  • Вопрос задан
  • 264 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@vitaly_il1
DevOps Consulting
3 - есть готовые инструменты. Искать APM - например, от New Relic, или OpenTelemetry.
Ответ написан
Комментировать
@rPman
Для определения нагрузки однопоточного не асинхронного приложения достаточно считать время, которое выполняется запрос. Если у тебя несколько процессов, то считать нагрузку для каждого отдельно.

Если тебе нужно понять, какой тип запроса дает какую нагрузку, для каждого типа запроса накапливай свое время... тот тип у которого будет большее значение, тот и дает большую нагрузку.

Но, так как часто бывает, процесс большую часть времени чего то ждет, например IO операции с базой, сетью или диском, то таким образом не получится вычислить нагрузку именно на процессор. Поэтому, либо перед каждой такой операцией отключаешь счетчик (т.е. снова засекаешь время начала и конца) либо используешь средства операционной системы, для определения нагрузки на процессор конкретным процессом/потоком... они для каждой ОС и фреймворков/языков программирования - свои
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Сложно судить о проблемах только по CPU.

Например если у тебя система, которая делатет рендеринг картинок или кодирует видео то она
обычно забирает столько CPU сколько есть в наличии.

Если у тебя event-like система, которая обслуживает события от бизнеса то ты можешь мерять
какие-то бизнес-метрики. Например - сколько сообщений в секунду система пропустила и на основании
этого делать выводы.

А очередь диска или загрузка ядер CPU в данной задаче не говорят ни о чем обычно. Может они - высокие
но бизнес чувствует себя нормально. А может быть 1 % CPU занят но база в блокировках и эта проблема не
видима со стороны системных метрик.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы