GNU/Linux >> Tutoriels Linux >  >> Debian

Debian - Comment garantir la disponibilité exclusive du processeur pour un processus en cours d'exécution ?

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

Debian
  1. Comment obtenir les mises à jour LTS pour Debian 6 (Squeeze)

  2. Assurez-vous qu'un processus est toujours en cours d'exécution ?

  3. Vérifier le processus si le même est en cours d'exécution ?

  4. Debian – Comment masquer un processus spécifique ?

  5. Comment définir l'affinité CPU pour le processus SYSTEMD dans CentOS/RHEL 7

Comment installer PHP 7 en tant que PHP-FPM &FastCGI pour ISPConfig 3 sur Debian 8 (Jessie)

Comment configurer Nginx en tant que proxy inverse pour Apache sur Debian 11

Comment créer un processus zombie factice en langage de programmation C sur Debian 10

Comment vérifier les ports ouverts sur Debian 10

Comment installer Skype pour Linux Beta sur Debian 9 Stretch

Comment configurer Nginx en tant que proxy inverse pour Apache sur Debian 11