GNU/Linux >> Znalost Linux >  >> Debian

Debian – Jak zajistit exkluzivní dostupnost CPU pro běžící proces?

Zpočátku se tato otázka zdá být trochu hloupá/matoucí, protože OS řídí provádění procesu.

Chci však změřit, do jaké míry jsou některé procesy vázány na CPU/IO a mám pocit, že můj OS zasahuje do mých experimentů, například s naplánovanými procesy OS.

Vezměte si jako příklad následující situaci:
Spustil jsem proces A dvakrát a získal jsem následující výstup z nástroje „čas“ (časové sloupce v sekundách):

+---+-------+---------+-----------+---------+
|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 vidíme, ačkoliv čas uživatele a sys jsou podobné, uplynulý čas obou se drasticky mění (rozdíl ~5 min). Mám pocit, jako by něco v mém prostředí vyvolalo nějaký spor.

Chci zastavit všechny možné procesy/služby na pozadí, abych se vyhnul jakémukoli druhu hluku během svých experimentů, ale považuji se za začátečníka/středně pokročilého uživatele unixu a nevím, jak to zaručit.

Používám Linux 4.4.0-45-generic s Ubuntu 14.04 LTS 64bit.

Velmi si vážím pomoci. Pokud budete potřebovat nějaké chybějící informace, okamžitě svůj příspěvek upravím.

Informace o 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

Přijatá odpověď:

Máte konfiguraci volby jádra, kde OS nebude používat CPU, nazývá se isolcpus .

isolcpus — Izolujte CPU od plánovače jádra.

Synopse isolcpus=cpu_number [, cpu_number,…]

Popis Odeberte zadané CPU, jak jsou definovány hodnotami cpu_number
, z obecných algoritmů vyvažování SMP a plánovače
jádra. Jediný způsob, jak přesunout proces na nebo z „izolovaného“
CPU, je přes systémová volání CPU afinity. cpu_number začíná 0, takže
maximální hodnota je o 1 menší než počet CPU v systému.

Tato konfigurace, kterou se chystám popsat, jak nastavit, může mít mnohem více použití než pro testování.

Meru například používá tuto technologii ve svých řadičích AP založených na Linuxu, aby zabránil síťovému provozu narušovat vnitřní fungování operačního systému, konkrétně I/O operace.

Používám ho také ve velmi vytíženém webovém frontendu, a to ze zcela stejných důvodů:Z životní zkušenosti jsem zjistil, že na můj vkus nad serverem ztrácím kontrolu příliš často; musel jsem jej násilně restartovat, dokud jsem neoddělil předního démona na jeho vlastních vyhrazených CPU.

Protože máte 8 CPU, můžete to zkontrolovat pomocí výstupu příkazu:

$ grep -c proc /proc/cpuinfo
8

nebo

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

Přidejte Debian/Ubuntu do souboru /etc/default/grub na možnost GRUB_CMDLINE_LINUX :

GRUB_CMDLINE_LINUX="isolcpus=7"

(je to 7, protože začíná na 0 a máte 8 jader)

Pak spusťte,

sudo update-grub

Toto říká jádru, aby nepoužívalo jedno z vašich jader.

Restartujte systém.

Poté spusťte proces.

Ihned po jeho spuštění můžete přejít na 8. CPU (7, protože 0 je 1.) a být si zcela jisti, že jste jediný, kdo tento CPU používá.

Související:Htop CPU% na ~100%, ale sloupcový graf ukazuje každé jádro mnohem nižší?

K tomu použijte příkaz:

taskset -cp 7 PID_number

taskset – načtení nebo nastavení afinity CPU procesu

SYNOPSE

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

POPIS

Sada úloh se používá k nastavení nebo načtení afinity CPU běžícího procesu
dané jeho PID nebo ke spuštění nového PŘÍKAZU s danou afinitou CPU. Afinita CPU je vlastnost plánovače, která „spojuje“ proces s
danou sadou CPU v systému. Plánovač Linuxu bude respektovat
danou afinitu CPU a proces nepoběží na žádném jiném CPU.
Všimněte si, že plánovač Linux také podporuje přirozenou afinitu CPU:plánovač
se pokouší udržet procesy zapnuté stejný CPU, pokud je to praktické z důvodů výkonu. Vynucení konkrétní afinity CPU je proto užitečné pouze v určitých aplikacích.

Chcete-li si o tom přečíst více, viz:isolcpus, numactl a taskset

Také pomocí ps -eF ve sloupci PSR byste měli vidět použitý procesor.

Mám server s izolovaným CPU 2 a 3 a skutečně to lze vidět pomocí ps -e jediný proces v uživatelské zemi jak bylo zamýšleno, je 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

Pokud to porovnáte s neizolovanými CPU, běží na nich mnohem více věcí (okno níže snímky ):

# 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: [email protected]/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

Debian
  1. Jak získat aktualizace LTS pro Debian 6 (Squeeze)

  2. Ujistěte se, že proces vždy běží?

  3. Debian – jak skrýt konkrétní proces?

  1. Jak omezit využití CPU procesu v Linuxu

  2. Jak nastavit afinitu CPU pro proces z C nebo C++ v Linuxu?

  3. jak nainstalovat gui pro debian

  1. Jak obnovit heslo pro sudo v Debianu

  2. Zkontrolovat proces, pokud je stejný?

  3. Jak nastavit afinitu CPU pro proces SYSTEMD v CentOS/RHEL 7