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

25

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

Cependant, je veux mesurer combien certains processus sont liés au processeur / aux E / S 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 unix novice / intermédiaire et je ne sais pas comment le garantir.

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

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

Infos 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
Jeanderson Candido
la source
Vous pouvez démarrer votre processus en utilisant une priorité élevéenice -19 process
Dababi

Réponses:

26

Vous avez une configuration d'options de noyau où un CPU ne sera pas utilisé par le système d'exploitation, il est appelé 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 leurs 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

En utilisant également ps -eFvous devriez voir dans la colonne PSR le processeur utilisé.

J'ai un serveur avec CPU 2 et 3 isolé, et en effet, il peut être vu avec ps -ele seul processus dans le pays utilisateur 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 glisse ):

# 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
la source
Je ne savais pas qu'il était possible de faire ça :) Je vais vérifier tes références. Au plaisir de marquer ce fil comme résolu;)
Jeanderson Candido
J'ai presque oublié ... existe-t-il un moyen de surveiller l'exécution pour vérifier si cet isolement fonctionne?
Jeanderson Candido
Je vous en prie. Ajout d'une petite intro comme 2ème paragraphe. Notez que j'ai vu un tutoriel sur le net parler de jeu de tâches, mais souvent ils ne le mentionnent pas avec luiisolcpus
Rui F Ribeiro