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


25

Спочатку питання здається дещо дурним / заплутаним, оскільки ОС виконує завдання управління виконанням процесів.

Однак я хочу оцінити, наскільки деякі процеси пов'язані з процесором / введенням, і я відчуваю, що моя ОС втручається в мої експерименти з, наприклад, запланованими процесами в ОС.

Візьмемо для прикладу наступну ситуацію: я двічі запустив процес A і отримав наступний висновок з інструменту "time" (стовпці часу в секундах):

+---+-------+---------+-----------+---------+
|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 біт.

Я дуже ціную допомогу. Якщо вам потрібна якась недостача інформація, я негайно відредагую своє повідомлення.

Інформація про процесор

$ 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 використовує цю технологію в своїх Linux-контролерах AP, щоб унеможливити перешкоди мережевого трафіку внутрішній роботі ОС, а саме операцій вводу / виводу.

Я також використовую його в дуже напруженому веб-інтернеті з абсолютно тих самих причин: з життєвого досвіду я з'ясував, що занадто регулярно втрачав контроль за своїм смаком цього сервера; довелося її перезавантажувати, поки я не відокремив демон переднього кінця на власних виділених процесорах.

Оскільки у вас є 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 [options] [mask | list ] [pid | command [arg]...]

ОПИС

набір завдань використовується для встановлення або отримання спорідненості процесора до запущеного процесу з урахуванням його PID або для запуску нової COMMAND із заданою спорідненістю до процесора. Спорідненість CPU - це властивість планувальника, яка "зв'язує" процес із заданим набором процесорів у системі. Планувальник Linux буде шанувати задану спорідненість процесора і процес не запускатиметься на будь-яких інших процесорах. Зауважте, що планувальник Linux також підтримує природну спорідненість до процесора: планувальник намагається тримати процеси в тому ж процесорі настільки ж, наскільки це практично, з міркувань продуктивності. Тому форсування певної спорідненості процесора корисно лише в певних програмах.

Докладніше про це див. У розділі: isolcpus, numactl та набір завдань

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

У мене є сервер з центральними процесорами 2 і 3, і, справді, це можна побачити з ps -eєдиним процесом в userland за призначенням, є 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

Я не знав, що це можна зробити :) Я перевірю ваші посилання. З нетерпінням чекаю, щоб позначити цю тему як вирішену;)
Jeanderson Candido

Я майже забув ... чи є спосіб контролювати виконання, щоб перевірити, чи працює ця ізоляція?
Кандидо Джеендерсона

Будь ласка. Додано невелике вступ як другий абзац. Зауважте, що я бачив якийсь підручник у мережі, який розповідає про набір завдань, але часто вони не згадують разом із нимisolcpus
Rui F Ribeiro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.