У вас є конфігурація параметра ядра, де процесор не буде використовуватися ОС, він називається 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
nice -19 process