Au début, la question semble un peu idiote/confuse car le système d'exploitation gère l'exécution des processus.
Cependant, je veux mesurer à quel point certains processus sont liés au processeur/E/S et j'ai l'impression que mon système d'exploitation interfère avec mes expériences avec, par exemple, des processus de système d'exploitation planifiés.
Prenons comme exemple la situation suivante :
J'ai exécuté le processus A deux fois et j'ai obtenu le résultat suivant 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 le temps utilisateur et le temps système soient similaires, le temps écoulé des deux change radicalement (diff. de ~ 5 min). J'ai l'impression que quelque chose dans mon environnement a provoqué une sorte de conflit.
Je souhaite 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 d'Unix 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.
Informations sur le processeur
$ 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
Réponse acceptée :
Vous avez une configuration d'option de noyau où un processeur ne sera pas utilisé par le système d'exploitation, il s'appelle isolcpus
.
isolcpus – Isolez les processeurs du planificateur du noyau.
Synopsis isolcpus=numéro_processeur [, numéro_processeur ,…]
Description Supprimez les processeurs spécifiés, tels que définis par les valeurs
cpu_number, des algorithmes généraux d'équilibrage et de planification SMP du noyau
. La seule façon de déplacer un processus vers ou hors d'un processeur "isolé"
est via les appels système d'affinité CPU. cpu_number commence à 0, donc la
valeur maximale est 1 de moins que le nombre de processeurs sur le système.
Cette configuration que je suis sur le point de décrire comment configurer, peut avoir bien 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 aussi dans une interface web très fréquentée, pour à peu près les mêmes raisons :j'ai découvert par expérience que je perdais trop régulièrement le contrôle de ce serveur à mon goût; J'ai 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 cela 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 par 0, et vous avez 8 cœurs)
Alors lancez,
sudo update-grub
Cela indique au noyau de ne pas utiliser l'un de vos cœurs.
Redémarrez le système.
Ensuite, démarrez votre processus.
Immédiatement après le démarrage, vous pouvez changer pour le 8e CPU (7 car 0 est le 1er), et être bien sûr que vous êtes le seul à utiliser ce CPU.
En relation :Htop CPU% à ~ 100 %, mais le graphique à barres montre que chaque cœur est beaucoup plus bas ?Pour cela, utilisez la commande :
taskset -cp 7 PID_number
ensemble de tâches - récupère ou définit l'affinité CPU d'un processus
SOMMAIRE
taskset [options] [mask | list ] [pid | command [arg]...]
DESCRIPTIF
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 respectera
l'affinité CPU donnée et le processus ne s'exécutera sur aucun autre processeur.
Notez que le planificateur Linux prend également en charge l'affinité CPU naturelle :le
planificateur tente de maintenir les processus actifs. 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 taskset
Utilise é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 effectivement, ça se voit avec ps -e
le seul processus en 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 processeurs 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: [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