У меня есть однопоточное приложение, которое (вращается и) прикреплено к ядру с набором задач и изоляцией ЦП (то есть isolcpus = 12-23 nohz_full = 21,22,23 rcu_nocbs = 12-23; у меня 2 ЦП и12 ядер каждый - Skylake):
exec taskset -c 22 setuidgid myuser envdir ./env -c = /opt/bin/UtilityServer > /tmp/logs/utility-server.log
Почему-то, после нескольких часов работы, я проверил статистику:
UtilityServer (1934, #threads: 1)
-------------------------------------------------------------------
se.exec_start : 78998944.120048
se.vruntime : 78337609.962134
se.sum_exec_runtime : 78337613.040860
se.nr_migrations : 6
nr_switches : 41
nr_voluntary_switches : 31
nr_involuntary_switches : 10
se.load.weight : 1024
policy : 0
prio : 120
clock-delta : 13
mm->numa_scan_seq : 925
numa_migrations, 0
numa_faults_memory, 0, 0, 0, 0, 1
numa_faults_memory, 1, 0, 0, 0, 1
numa_faults_memory, 0, 1, 1, 1, 0
numa_faults_memory, 1, 1, 0, 1, 9
Вопросы:
- Как я могу остановить переключение и миграцию (т.е.
se.nr_migrations
, nr_switches
, nr_voluntary_switches
, nr_involuntary_switches
равны нулю)?Учитывая, что мое приложение действительно хочет использовать все ядро. - Почему ядро пыталось мигрировать?Учитывая, что я уже изолировал ядро и назначил там только одно однопоточное приложение.
nr_voluntary_switches
отслеживал количество раз, когда мое приложение добровольно отказывалось от ядра?Если да, то при какой ситуации мое приложение отказалось бы от ядра?Мое приложение выполнило некоторые неблокирующие операции ввода-вывода (например, fwrite_unlocked()
и т. Д.), Но не работало с сетью. - При какой ситуации мое приложение будет вынуждено переключаться?Я вижу, что
nr_involuntary_switches
= 10, это означает, что мое приложение было вынуждено переключаться 10 раз? - Что означают цифры после
numa_faults_memory
записей?
Я нахожусь на 3.10.0-862.2.3.el7.x86_64, если это имеет значение.
Спасибо!