Я работал над каким-то чувствительным ко времени проектом. Из-за некоторых нежелательных всплесков времени мне пришлось пойти немного глубже.
Сценарий
У меня есть модуль ядра, который прикреплен к ядру процессора. Это ядро процессора также указано в 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.