Как обеспечить исключительную доступность процессора для запущенного процесса?

25

Сначала вопрос кажется немного глупым / запутанным, поскольку ОС выполняет работу по управлению выполнением процесса.

Однако я хочу измерить, насколько некоторые процессы связаны с процессором / вводом-выводом, и я чувствую, что моя ОС мешает моим экспериментам, например, с запланированными процессами ОС.

Возьмем в качестве примера следующую ситуацию: я дважды запустил процесс A и получил следующий вывод из инструмента «время» (столбцы времени в секундах):

+---+-------+---------+-----------+---------+
|Run|Process|User Time|System Time|Wall time|
+---+-------+---------+-----------+---------+
|1  |A      |196.3    |5.12       |148.86   |
|2  |A      |190.79   |4.93       |475.46   |
+---+-------+---------+-----------+---------+

Как мы видим, хотя время пользователя и системы схожи, истекшее время обоих резко меняется (разница ~ 5 минут). Чувствуется, что что-то в моей среде вызвало какие-то разногласия.

Я хочу остановить все возможные фоновые процессы / сервисы, чтобы избежать какого-либо шума во время моих экспериментов, но я считаю себя новичком / промежуточным пользователем Unix и не знаю, как это гарантировать.

Я использую Linux 4.4.0-45-generic с Ubuntu 14.04 LTS 64 bit.

Я действительно ценю помощь. Если вам, ребята, нужна недостающая информация, я быстро отредактирую свой пост.

Информация о процессоре

$ grep proc /proc/cpuinfo | wc -l
8
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               4002.609
BogoMIPS:              7183.60
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7
Жандерсон Кандидо
источник
Вы можете начать свой процесс, используя nice -19 process
высокий

Ответы:

26

У вас есть конфигурация опций ядра, где ЦП не будет использоваться ОС, это называется isolcpus.

isolcpus - изолировать процессоры от планировщика ядра.

Синопсис isolcpus = cpu_number [, cpu_number, ...]

Описание Удалите указанные процессоры, как определено значениями cpu_number, из общих алгоритмов балансировки SMP ядра и планировщика. Единственный способ переместить процесс на «изолированный» процессор или отключить его - это системные вызовы привязки к процессору. cpu_number начинается с 0, поэтому максимальное значение на 1 меньше числа процессоров в системе.

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

Например, Meru использует эту технологию в своих контроллерах AP на базе Linux, чтобы сетевой трафик не вмешивался во внутреннюю работу ОС, а именно в операции ввода-вывода.

Я также использую его в очень загруженном веб-интерфейсе по тем же причинам: из своего жизненного опыта я узнал, что слишком часто терял контроль над собой на мой вкус этого сервера; пришлось принудительно перезагружать его, пока я не отделил интерфейсный демон на его собственных выделенных процессорах.

Поскольку у вас 8 процессоров, вы можете проверить это с помощью вывода команды:

$ grep -c proc /proc/cpuinfo
8

или

$ lscpu | grep '^CPU.s'
CPU(s):                8

Добавьте в файл Debian / Ubuntu в /etc/default/grubопцию GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(это 7, потому что он начинается с 0, и у вас есть 8 ядер)

Тогда беги,

sudo update-grub

Это говорит ядру не использовать одно из ваших ядер.

Перезагрузите систему.

Тогда начни свой процесс.

Сразу после запуска вы можете перейти на 8-й процессор (7, потому что 0 - 1-й), и быть уверенным, что вы единственный, кто использует этот процессор.

Для этого используйте команду:

taskset -cp 7 PID_number

taskset - получить или установить привязку процессора к процессору

СИНТАКСИС

   taskset [options] [mask | list ] [pid | command [arg]...]

ОПИСАНИЕ

taskset используется для установки или извлечения привязки к ЦПУ запущенного процесса по заданному PID или для запуска новой КОМАНДЫ с заданной привязкой к ЦП. Сродство к процессору - это свойство планировщика, которое «связывает» процесс с заданным набором процессоров в системе. Планировщик Linux будет учитывать заданную привязку к процессору, и процесс не будет выполняться на других процессорах. Обратите внимание, что планировщик Linux также поддерживает естественную привязку к процессору: планировщик пытается сохранить процессы на одном и том же процессоре настолько долго, насколько это практически возможно из соображений производительности. Поэтому форсирование определенного сродства ЦП полезно только в определенных приложениях.

Чтобы узнать больше об этом, смотрите: isolcpus, numactl и taskset

Также используя, ps -eFвы должны увидеть в столбце PSR используемый процессор.

У меня есть сервер с изолированными процессором 2 и 3, и действительно, это можно увидеть с ps -eединственным процессом в пользовательском пространстве, как задумано pound.

# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
 2 [cpuhp/2]
 2 [watchdog/2]
 2 [migration/2]
 2 [ksoftirqd/2]
 2 [kworker/2:0]
 2 [kworker/2:0H]
 3 [cpuhp/3]
 3 [watchdog/3]
 3 [migration/3]
 3 [ksoftirqd/3]
 3 [kworker/3:0]
 3 [kworker/3:0H]
 2 [kworker/2:1]
 3 [kworker/3:1]
 3 [kworker/3:1H]
 3 /usr/sbin/pound

Если вы сравните его с неизолированными процессорами, они работают гораздо больше (окно ниже слайдов ):

# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
 0 init [2]
 0 [kthreadd]
 0 [ksoftirqd/0]
 0 [kworker/0:0H]
 0 [rcu_sched]
 0 [rcu_bh]
 0 [migration/0]
 0 [lru-add-drain]
 0 [watchdog/0]
 0 [cpuhp/0]
 1 [cpuhp/1]
 1 [watchdog/1]
 1 [migration/1]
 1 [ksoftirqd/1]
 1 [kworker/1:0]
 1 [kworker/1:0H]
 1 [kdevtmpfs]
 0 [netns]
 0 [khungtaskd]
 0 [oom_reaper]
 1 [writeback]
 0 [kcompactd0]
 0 [ksmd]
 1 [khugepaged]
 0 [crypto]
 1 [kintegrityd]
 0 [bioset]
 1 [kblockd]
 1 [devfreq_wq]
 0 [watchdogd]
 0 [kswapd0]
 0 [vmstat]
 1 [kthrotld]
 0 [kworker/0:1]
 0 [deferwq]
 0 [scsi_eh_0]
 0 [scsi_tmf_0]
 1 [vmw_pvscsi_wq_0]
 0 [bioset]
 1 [jbd2/sda1-8]
 1 [ext4-rsv-conver]
 0 [kworker/0:1H]
 1 [kworker/1:1H]
 1 [bioset]
 0 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 0 [jbd2/sda3-8]
 1 [ext4-rsv-conver]
 1 /usr/sbin/rsyslogd
 0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
 1 /usr/sbin/cron
 0 /usr/sbin/sshd
 1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
 1 /sbin/getty 38400 tty1
 1 /lib/systemd/systemd-udevd --daemon
 0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
 1 [kworker/1:2]
 0 [kworker/u128:1]
 0 [kworker/0:2]
 0 [bioset]
 1 [xfsalloc]
 1 [xfs_mru_cache]
 1 [jfsIO]
 1 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsSync]
 1 [bioset]
 0 /usr/bin/monit -c /etc/monit/monitrc
 1 /usr/sbin/pound
 0 sshd: rui [priv]
 0 sshd: rui@pts/0,pts/1
 1 -bash
 1 -bash
 1 -bash
 1 [kworker/u128:0]
 1 -bash
 0 sudo su
 1 su
 1 bash
 0 bash
 0 logger -t cmdline root[/home/rui] 
 1 ps -eo psr,command
 0 tr -s 
 0 grep ^ [0|1]
 0 /usr/bin/vmtoolsd
Руи Ф Рибейро
источник
Я не знал, что это можно сделать :) Я проверю ваши рекомендации. С нетерпением жду возможности пометить эту тему как
решенную
Я почти забыл ... есть ли способ контролировать выполнение, чтобы проверить, работает ли эта изоляция?
Жандерсон Кандидо
Добро пожаловать. Добавлено небольшое вступление в качестве 2-го абзаца. Заметьте, что я видел в сети какое-то руководство, рассказывающее о наборе задач, но часто они не упоминают вместе с нимisolcpus
Руи Ф. Рибейро,