Понимание перф отчета - PullRequest
       31

Понимание перф отчета

0 голосов
/ 29 августа 2018

Я работал над каким-то чувствительным ко времени проектом. Из-за некоторых нежелательных всплесков времени мне пришлось пойти немного глубже.

Сценарий

У меня есть модуль ядра, который прикреплен к ядру процессора. Это ядро ​​процессора также указано в isolcpus в параметрах загрузки ядра. Вот что я сделал с параметрами загрузки ядра в cmdline

intel_iommu=on iommu=pt default_hugepagesz=1G hugepagesz=1G hugepages=1 intel_idle.max_cstate=0 processor.max_cstate=0 nohz_full=7-11 isolcpus=7-11 mce=off rcu_nocbs=7-11 nosoftlockup idle=poll cpuidle.off=1 powersave=off nonmi_ipi nowatchdog

Я выполнил следующую команду (сейчас пытаюсь профилировать только CPU 8)

sudo ./perf record -e context-switches -a -g --cpu=8 taskset -c 9 ./test.sh

** EDIT 1 - Дополнительная информация **

Версия ядра: 4.15.12

Мой модуль ядра отправляет синхронные пакеты каждые X единиц времени. В настоящее время я настроил его отправку каждые 50 мс.

В этом случае я упростил test.sh. Он принимает несколько параметров, но важной особенностью этого скрипта является то, что он вызывает модуль ядра.

Например, У моего КМ был процесс фс. Когда событие записи запускается на этом процессе, он создает новый Kthread, связывает его с CPU (8) и начинает генерировать пакет каждые 50 мс.

Чтобы избежать столкновений и переключений контекста, я перенес эту вещь в пространство ядра. Кроме того, я установил привязку моего сценария к другому процессору, нежели модуль ядра.

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

и вот мой вывод после ввода perf report

# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 8  of event 'context-switches'
# Event count (approx.): 39
#
# Children      Self  Command      Shared Object     Symbol
# ........  ........  ...........  ................  .................
#
    69.23%    69.23%  :-1          [kernel.vmlinux]  [k] do_task_dead
            |
            ---do_task_dead

    25.64%    25.64%  swapper      [kernel.vmlinux]  [k] schedule_idle
            |
            ---schedule_idle

     2.56%     2.56%  :2100        [kernel.vmlinux]  [k] _cond_resched
            |
            ---_cond_resched

     2.56%     2.56%  kworker/8:1  [kernel.vmlinux]  [k] schedule
            |
            ---schedule

Там написано, что было 8 переключателей контекста. Кроме того, я не мог понять, что: -1 на самом деле означает в столбце Command первой строки do_task_dead(). Было бы здорово, если бы кто-нибудь дал мне несколько советов, чтобы углубиться в эту проблему.

Редактировать 2 - отчет сценария перфорации и результат анализа cpu_idle

swapper     0 [008] 64409.434193:          1 context-switches:
                  aceea8 schedule_idle (/lib/modules/4.15.12/build/vmlinux)

:-1    -1 [008] 64410.434267:          1 context-switches:
                  2ac066 do_task_dead (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 64410.442240:          1 context-switches:
                  aceea8 schedule_idle (/lib/modules/4.15.12/build/vmlinux)

:29026 29026 [008] 64411.442313:          1 context-switches:
                  acee0d _cond_resched (/lib/modules/4.15.12/build/vmlinux)

kworker/8:1   181 [008] 64411.442318:          1 context-switches:
                  acebf2 schedule (/lib/modules/4.15.12/build/vmlinux)

:-1    -1 [008] 64411.442327:          1 context-switches:
                  2ac066 do_task_dead (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 64411.466238:          8 context-switches:
                  aceea8 schedule_idle (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 64414.538207:         31 context-switches:
                  aceea8 schedule_idle (/lib/modules/4.15.12/build/vmlinux)

работает с power: событие cpu_idle, вот вывод сценария perf

swapper     0 [008] 65787.514565: power:cpu_idle: state=4294967295 cpu_id=8
                  ad3a2f cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 65788.514653: power:cpu_idle: state=0 cpu_id=8
                  ad39d0 cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 65788.522618: power:cpu_idle: state=4294967295 cpu_id=8
                  ad3a2f cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 65789.522693: power:cpu_idle: state=0 cpu_id=8
                  ad39d0 cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 65789.546577: power:cpu_idle: state=4294967295 cpu_id=8
                  ad3a2f cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 65790.546648: power:cpu_idle: state=0 cpu_id=8
                  ad39d0 cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)

swapper     0 [008] 65790.570574: power:cpu_idle: state=4294967295 cpu_id=8
                  ad3a2f cpu_idle_poll (/lib/modules/4.15.12/build/vmlinux)
....

и perf report показывает

# Samples: 22  of event 'power:cpu_idle'
# Event count (approx.): 22
#
# Children      Self  Trace output
# ........  ........  .........................
#
    50.00%    50.00%  state=0 cpu_id=8
            |
            ---cpu_idle_poll

    50.00%    50.00%  state=4294967295 cpu_id=8
            |
            ---cpu_idle_poll

Спасибо,

Cooshal.

1 Ответ

0 голосов
/ 29 августа 2018

Зулан довольно близко, и все его предложения должны быть выполнены.

Со справочной страницы perf report:

Столбец команды в выводе perf report относится к процессу, из которого были отобраны пробы. В режиме для потока / процесса это всегда имя контролируемой команды. Но в режиме всего процессора команда может отличаться.

Поскольку вы измеряете события переключения контекста per-cpu, как видно из вашей команды perf record ... -cpu=8..., команда perf report начнет сообщать PID / TID следующей / предыдущей задачи. Вы можете увидеть это здесь -

записей переключений контекста для каждого процессора pid / tid

Теперь значение -1 относится к мертвому процессу, то есть процесс вышел за пределы состояния зомби-процесса. Это означает, что члены task_struct теперь указывают на уже освобожденную память, и разыменование не должно быть разрешено. Метод do_task_dead должен четко отражать это. Это , где pid процесса возвращается как -1 и одновременно сообщается в perf report.

Существует обширное обсуждение по этой проблеме. Первоначально значение 0 использовалось для ссылки на такое состояние процесса в выводе perf report, но, как вы уже догадались, pid = 0 относится к свободному потоку , и, следовательно, используется значение -1.

...