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 -eF
vous 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 -e
le 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
nice -19 process