web-dev-qa-db-fra.com

Comment garantir la disponibilité exclusive du processeur pour un processus en cours?

Au début, la question semble un peu idiote/déroutante car le système d'exploitation fait le travail de gestion de l'exécution des processus.

Cependant, je veux mesurer à quel point certains processus sont liés au CPU/IO et j'ai l'impression que mon système d'exploitation interfère avec mes expériences avec, par exemple, les processus de système d'exploitation planifiés.

Prenons comme exemple la situation suivante: j'ai exécuté le processus A deux fois et obtenu la sortie suivante de l'outil "time" (colonnes de temps en secondes):

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

Comme nous pouvons le voir, bien que l'utilisateur et le temps système soient similaires, le temps écoulé des deux change radicalement (diff. De ~ 5 min). Se sent comme quelque chose dans mon environnement a provoqué une sorte de dispute.

Je veux arrêter tous les processus/services d'arrière-plan possibles pour éviter tout type de bruit pendant mes expériences mais je me considère comme un utilisateur novice/intermédiaire unix et je ne sais pas comment le garantir.

J'utilise Linux 4.4.0-45-generic avec buntu 14.04 LTS 64 bits.

J'apprécie vraiment l'aide. Si vous avez besoin d'informations manquantes, je modifierai rapidement mon message.

Info CP

$ 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
31
Jeanderson Candido

Vous avez une configuration d'options de noyau où un CPU ne sera pas utilisé par le système d'exploitation, il s'appelle isolcpus.

isolcpus - Isolez les CPU du planificateur du noyau.

Synopsis isolcpus = cpu_number [ cpu_number, ...]

Description Supprimez les CPU spécifiés, tels que définis par les valeurs cpu_number, des algroithmes généraux d'équilibrage SMP du noyau et du planificateur. La seule façon de déplacer un processus vers ou hors d'un CPU "isolé" est via les appels système d'affinité CPU. cpu_number commence à 0, la valeur maximale est donc inférieure de 1 au nombre de CPU sur le système.

Cette configuration que je suis sur le point de décrire comment installer, peut avoir beaucoup plus d'utilisations que pour les tests.

Meru, par exemple, utilise cette technologie dans ses contrôleurs AP basés sur Linux, pour empêcher le trafic réseau d'interférer avec le fonctionnement interne du système d'exploitation, à savoir les opérations d'E/S.

Je l'utilise également dans une interface Web très occupée, pour les mêmes raisons: j'ai découvert par expérience de la vie que j'avais perdu le contrôle trop régulièrement à mon goût de ce serveur; a dû le redémarrer avec force jusqu'à ce que je sépare le démon frontal sur ses propres processeurs dédiés.

Comme vous avez 8 CPU, vous pouvez vérifier avec la sortie de la commande:

$ grep -c proc /proc/cpuinfo
8

ou

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

Ajoutez Debian/Ubuntu dans le fichier /etc/default/grub à l'option GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(c'est 7, car il commence en 0, et vous avez 8 cœurs)

Ensuite, exécutez,

Sudo update-grub

Cela indique au noyau de ne pas utiliser l'un de vos cœurs.

Redémarrez le système.

Commencez ensuite votre processus.

Immédiatement après l'avoir démarré, vous pouvez changer pour le 8ème CPU (7 car 0 est le 1er), et assurez-vous que vous êtes le seul à utiliser ce CPU.

Pour cela, utilisez la commande:

taskset -cp 7 PID_number

ensemble de tâches - récupérer ou définir l'affinité CPU d'un processus

SYNOPSIS

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

LA DESCRIPTION

l'ensemble de tâches est utilisé pour définir ou récupérer l'affinité CPU d'un processus en cours en fonction de son PID ou pour lancer une nouvelle COMMANDE avec une affinité CPU donnée. L'affinité CPU est une propriété du planificateur qui "lie" un processus à un ensemble donné de CPU sur le système. Le planificateur Linux honorera l'affinité CPU donnée et le processus ne s'exécutera sur aucun autre CPU. Notez que le planificateur Linux prend également en charge l'affinité CPU naturelle: le planificateur tente de conserver les processus sur le même processeur aussi longtemps que possible pour des raisons de performances. Par conséquent, forcer une affinité CPU spécifique n'est utile que dans certaines applications.

Pour en savoir plus à ce sujet, voir: isolcpus, numactl et tasket

Utilisant également ps -eF vous devriez voir dans la colonne PSR le processeur utilisé.

J'ai un serveur avec CPU 2 et 3 isolés, et en effet, on peut le voir avec ps -e le seul processus dans userland comme prévu, est 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

Si vous le comparez avec les CPU non isolés, ils exécutent beaucoup plus de choses (la fenêtre ci-dessous diapositives ):

# 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
33
Rui F Ribeiro