Jak zapewnić wyłączną dostępność procesora dla uruchomionego procesu?

25

Na początku pytanie wydaje się trochę głupie / mylące, ponieważ system operacyjny wykonuje zadanie zarządzania procesem.

Chcę jednak zmierzyć, jak bardzo niektóre procesy są związane z procesorem / IO i mam wrażenie, że mój system operacyjny zakłóca moje eksperymenty, na przykład z zaplanowanymi procesami systemu operacyjnego.

Weźmy jako przykład następującą sytuację: Uruchomiłem proces A dwa razy i otrzymałem następujące dane wyjściowe z narzędzia „czas” (kolumny czasu w sekundach):

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

Jak widzimy, chociaż czas użytkownika i sys są podobne, upływ czasu obu drastycznie się zmienia (różnica ~ 5 min). Czuję, że coś w moim środowisku wywołało jakąś sprzeczkę.

Chcę zatrzymać każdy możliwy proces / usługi w tle, aby uniknąć jakiegokolwiek szumu podczas moich eksperymentów, ale uważam się za początkującego / pośredniego użytkownika unixa i nie wiem, jak to zagwarantować.

Używam Linux 4.4.0-45-generic z 64-bitowym Ubuntu 14.04 LTS.

Naprawdę doceniam pomoc. Jeśli będziecie potrzebować brakujących informacji, niezwłocznie zmienię mój wpis.

Informacje o procesorze

$ 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
Jeanderson Candido
źródło
Możesz rozpocząć proces z wysokim priorytetemnice -19 process
Dababi

Odpowiedzi:

26

Masz konfigurację opcji jądra, w której procesor nie będzie używany przez system operacyjny, nazywa się to isolcpus.

isolcpus - Izoluj procesory od programu planującego jądro.

Syncisis isolcpus = cpu_number [, cpu_number, ...]

Opis Usuń określone procesory, zdefiniowane przez wartości cpu_number, z ogólnego algorytmu równoważenia SMP jądra i harmonogramu. Jedynym sposobem na przeniesienie procesu na lub z „izolowanego” procesora jest użycie wywołań systemowych powinowactwa procesora. cpu_number zaczyna się od 0, więc maksymalna wartość jest o 1 mniejsza niż liczba procesorów w systemie.

Ta konfiguracja, którą zamierzam opisać, jak skonfigurować, może mieć znacznie więcej zastosowań niż do testowania.

Meru na przykład wykorzystuje tę technologię w swoich kontrolerach AP opartych na systemie Linux, aby uniemożliwić ruch sieciowy zakłócaniu wewnętrznego działania systemu operacyjnego, a mianowicie operacji we / wy.

Używam go również w bardzo zatłoczonym interfejsie internetowym, z tych samych powodów: z doświadczenia życiowego dowiedziałem się, że zbyt często traciłem kontrolę nad moim serwerem; musiałem ponownie uruchomić go mocno, dopóki nie oddzieliłem demona frontonu na jego dedykowanych procesorach.

Ponieważ masz 8 procesorów, które możesz sprawdzić za pomocą polecenia:

$ grep -c proc /proc/cpuinfo
8

lub

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

Dodaj Debian / Ubuntu w pliku /etc/default/grubdo opcji GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(jest to 7, ponieważ zaczyna się od 0, a masz 8 rdzeni)

Następnie uruchomić,

sudo update-grub

Oznacza to, że jądro nie powinno używać jednego z rdzeni.

Uruchom ponownie system.

Następnie rozpocznij proces.

Natychmiast po uruchomieniu możesz zmienić na 8. procesor (7, ponieważ 0 to 1.) i być pewnym, że tylko ty używasz tego procesora.

W tym celu użyj polecenia:

taskset -cp 7 PID_number

zestaw zadań - pobierz lub ustaw koligację procesora w procesach

STRESZCZENIE

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

OPIS

zestaw zadań służy do ustawiania lub pobierania powinowactwa procesora z uruchomionego procesu, biorąc pod uwagę jego PID, lub do uruchamiania nowego polecenia z danym powinowactwem do procesora. Powinowactwo procesora to właściwość harmonogramu, która „wiąże” proces z danym zestawem procesorów w systemie. Program planujący systemu Linux zaakceptuje podobieństwo do procesora, a proces nie będzie działał na żadnym innym procesorze. Zauważ, że harmonogram Linuksa obsługuje również naturalne powinowactwo procesora: harmonogram próbuje utrzymać procesy na tym samym CPU tak długo, jak jest to praktyczne ze względów wydajnościowych. Dlatego wymuszenie określonego powinowactwa procesora jest przydatne tylko w niektórych aplikacjach.

Aby przeczytać więcej na ten temat, zobacz: isolcpus, numactl i zestaw zadań

Używając również ps -eFpowinieneś zobaczyć w kolumnie PSR używany procesor.

Mam serwer z izolowanym procesorem CPU 2 i 3, i rzeczywiście można go zobaczyć z ps -ejedynym procesem w obszarze użytkownika zgodnie z przeznaczeniem 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

Jeśli porównasz to z nieizolowanymi procesorami, uruchomią one o wiele więcej rzeczy (okno poniżej slajdów ):

# 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
Rui F. Ribeiro
źródło
Nie wiedziałem, że można to zrobić :) Sprawdzę twoje referencje. Nie mogę się doczekać, aby oznaczyć ten wątek jako rozwiązany;)
Jeanderson Candido
Prawie zapomniałem ... czy jest jakiś sposób na monitorowanie wykonania, aby sprawdzić, czy ta izolacja działa?
Jeanderson Candido
Zapraszamy. Dodano małe wprowadzenie jako akapit drugi. Zauważ, że widziałem w Internecie tutorial opowiadający o zestawie zadań, ale często nie wspominają o nim razemisolcpus
Rui F Ribeiro,