У меня есть пара процессов, которые поглощают много системного процессорного времени (как определено просмотром vmstat). Есть ли простой способ узнать, какие системные вызовы выполняются?
Я знаю, что есть Strace, но есть ли более быстрый и простой способ? Существует ли что-то вроде «top» для системных вызовов?
linux
performance
monitoring
central-processing-unit
strace
bajafresh4life
источник
источник
Ответы:
Я думаю, что Strace с
-c
флагом, вероятно, ближе всего, что я знаю. Если вы не использовали-c
флаг, попробуйте это:Где 12345 - это идентификатор процесса (PID) рассматриваемого процесса. Обратите внимание, что включение процесса добавляет дополнительные издержки, поэтому пока вы его отслеживаете, процесс будет работать медленнее.
После того, как вы продолжите сбор данных, нажмите,
Ctrl-C
чтобы остановить сбор данных и вывести результаты. Это будет производить что-то вроде этого:Как вы можете видеть, это разбивка всех системных вызовов, выполненных приложением, с сортировкой по общему времени, включая среднее время на вызов и количество вызовов для каждого системного вызова. Если вы хотите отсортировать их по-другому, посмотрите страницу руководства для strace, так как есть несколько вариантов.
источник
Возможно, попробуйте один из профилировщиков выборки, например, oprofile или для более новых ядер, perf. Если вам повезет, «perf top» может сказать вам именно то, что вы хотите. Смотрите здесь для некоторых примеров
источник
Тип стринг-переключателей, который я обычно использую, таков.
strace -ffttT -p pid -o /tmp/strace.out
Пример этого будет выглядеть так:
Вы видите разницу во времени с правой стороны системного вызова, показывающую, сколько времени потребовалось для перехода от одного системного вызова к другому.
Он поймает разницу во времени между системными вызовами. Таким образом, когда вы видите, что системный вызов имеет разрыв в несколько секунд со следующим системным вызовом, тогда он создает некоторый шум.
Еще один метод - установить ядро в gcore. Однако это требует небольшого опыта навигации по GDB.
Но, если этот поток является потоком ядра, вы не можете связать его или выполнить дамп. В этом случае мы должны использовать что-то более сложное. В ядре RHEL5 мы используем oprofile. В RHEL6 мы используем перф. Я предпочитаю перф, а не опрофиль. Данные о производительности можно собирать в графическом формате, показывающем системный вызов, в котором используется максимальный процент использования ЦП.
С тестовым перфом я вижу это.
Он показывает функцию ядра, на которую тратится 38% процессорного времени. Теперь мы можем проверить функцию и посмотреть, что она делает и что она должна делать.
С несколькими примерами это не так уж сложно.
источник