Come garantire la disponibilità esclusiva della CPU per un processo in esecuzione?


25

Inizialmente, la domanda sembra essere un po 'sciocca / confusa poiché il sistema operativo svolge il compito di gestire l'esecuzione del processo.

Tuttavia, voglio misurare quanto alcuni processi sono legati alla CPU / IO e sento che il mio sistema operativo interferisce con i miei esperimenti con, ad esempio, i processi del sistema operativo pianificati.

Prendiamo ad esempio la seguente situazione: Ho eseguito il processo A due volte e ho ottenuto il seguente output dallo strumento "time" (colonne temporali in secondi):

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

Come possiamo vedere, sebbene il tempo dell'utente e quello del sistema siano simili, il tempo trascorso di entrambi cambia drasticamente (diff. Di ~ 5 min). Sembra che qualcosa nel mio ambiente abbia causato una sorta di contesa.

Voglio interrompere ogni possibile processo / servizio in background per evitare qualsiasi tipo di rumore durante i miei esperimenti, ma mi considero un utente unix principiante / intermedio e non so come garantirlo.

Sto usando Linux 4.4.0-45-generico con Ubuntu 14.04 LTS a 64 bit.

Apprezzo molto l'assistenza. Se avete bisogno di informazioni mancanti, modificherò prontamente il mio post.

Informazioni sulla CPU

$ 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

Puoi iniziare il processo usando nice -19 process
— un'alta

Risposte:


26

Hai una configurazione delle opzioni del kernel in cui una CPU non verrà utilizzata dal sistema operativo, si chiama isolcpus.

isolcpus - Isola le CPU dallo scheduler del kernel.

Sinossi isolcpus = cpu_number [, cpu_number, ...]

Descrizione Rimuovere le CPU specificate, come definite dai valori cpu_number, dagli algroit di scheduler e di bilanciamento SMP del kernel generale. L'unico modo per spostare un processo all'interno o all'esterno di una CPU "isolata" è tramite le syscalls di affinità della CPU. cpu_number inizia da 0, quindi il valore massimo è 1 in meno rispetto al numero di CPU sul sistema.

Questa configurazione che sto per descrivere come impostare, può avere molti più usi che per i test.

Meru, ad esempio, utilizza questa tecnologia nei propri controller AP basati su Linux, per impedire al traffico di rete di interferire con il funzionamento interno del sistema operativo, vale a dire le operazioni di I / O.

Lo uso anche in un frontend Web molto impegnato, per gli stessi motivi: ho scoperto dall'esperienza di vita che ho perso il controllo troppo regolarmente per i miei gusti di quel server; ho dovuto riavviarlo forzatamente fino a quando non ho separato il demone front-end sulle sue CPU dedicate.

Poiché hai 8 CPU, puoi verificare con l'output del comando:

$ grep -c proc /proc/cpuinfo
8

o

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

Aggiungi in Debian / Ubuntu nel file /etc/default/gruball'opzione GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(è 7, perché inizia tra 0 e hai 8 core)

Quindi corri,

sudo update-grub

Questo sta dicendo al kernel di non usare uno dei tuoi core.

Riavvia il sistema.

Quindi avviare il processo.

Immediatamente dopo averlo avviato, è possibile cambiare per l'ottava CPU (7 perché 0 è il primo) ed essere abbastanza sicuri di essere l'unico a utilizzare quella CPU.

Per questo, usa il comando:

taskset -cp 7 PID_number

tasket: recupera o imposta l'affinità della CPU di un processo

SINOSSI

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

DESCRIZIONE

tasket viene utilizzato per impostare o recuperare l'affinità CPU di un processo in esecuzione dato il suo PID o per lanciare un nuovo COMANDO con una determinata affinità CPU. L'affinità della CPU è una proprietà dello scheduler che "lega" un processo a un determinato set di CPU sul sistema. Lo scheduler di Linux rispetterà l'affinità della CPU data e il processo non verrà eseguito su altre CPU. Si noti che lo scheduler Linux supporta anche la naturale affinità della CPU: lo scheduler tenta di mantenere i processi sulla stessa CPU per tutto il tempo pratico per motivi di prestazioni. Pertanto, forzare una specifica affinità della CPU è utile solo in alcune applicazioni.

Per saperne di più, vedi: isolcpus, numactl e tasket

Anche usando ps -eFsi dovrebbe vedere nella colonna PSR il processore in uso.

Ho un server con CPU 2 e 3 isolata, e infatti, può essere visto con ps -el'unico processo in userland come previsto, è 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

Se lo confronti con le CPU non isolate, stanno eseguendo molte più cose (la finestra sotto le diapositive ):

# 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

Non sapevo che fosse possibile farlo :) Controllerò i tuoi riferimenti. In attesa di contrassegnare questo thread come risolto;)
— Jeanderson Candido,

Ho quasi dimenticato ... c'è un modo per monitorare l'esecuzione per verificare se questo isolamento funziona?
— Jeanderson Candido,

Prego. Aggiunta una piccola introduzione come secondo paragrafo. Si noti che ho visto alcuni tutorial in rete che parlano di tasket, ma spesso non menzionano insieme ad essoisolcpus
— Rui F Ribeiro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.