web-dev-qa-db-fra.com

Qu'entend-on exactement par un processus utilisateur "ordonné" et un processus utilisateur "désordonné"?

J'utilisais la commande "top" et je suis tombé sur la valeur de Nice. Je suis conscient des priorités et de la façon dont une valeur de Nice indique la priorité d'un processus. Mais je n'arrive pas à comprendre ce que le terme "niced" ou "non-niced" indique.

2
Alchemist

Ces termes indiquent simplement si la valeur de Nice par défaut d'un processus a été modifiée. Un processus "niced" est un processus qui a été exécuté avec la commande Nice (ou dont la gentillesse a été modifiée par renice) et un processus "non-niced" est un processus qui n'a pas été exécuté avec Nice. Les valeurs par défaut de Nice pour les processus standard (ceux qui n'ont pas été exécutés avec Nice command ou dont la gentillesse n'a pas été modifiée par la suite par renice PID) sont 0. Ainsi, les processus "non ordonnés" sont ceux avec une valeur Nice de 0 et les processus "niced" sont ceux avec une valeur Nice! = 0.

Une valeur de Nice n'indique pas la priorité du processus, elle indique la gentillesse du processus. Vous pouvez voir les deux valeurs dans le résultat de top:

$ top -b -n1 | head
top - 15:23:10 up 20:59,  1 user,  load average: 1.41, 1.75, 1.88
Tasks: 222 total,   1 running, 221 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.2 us,  7.9 sy,  0.0 ni, 76.6 id,  0.6 wa,  0.0 hi,  0.6 si,  0.0 st
GiB Mem :    7.791 total,    3.082 free,    3.862 used,    0.846 buff/cache
GiB Swap:   16.000 total,   15.793 free,    0.207 used.    3.485 avail Mem 

  PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND
 1591 terdon    20   0 1605.1m 362.3m  18.8  4.5 285:46.34 S chromium
 1754 terdon    20   0  790.8m 184.5m  18.8  2.3 405:54.21 S chromium
 1186 terdon    20   0 1992.8m 459.6m  12.5  5.8 119:31.59 S cinnamon
                ^^  ^^
                 |   |---------> niceness
                 |-------------> priority

Si je fixe maintenant une valeur de Nice pour l'un de ces procédés au chrome, vous verrez la différence:

$ renice 10 1591
1591 (process ID) old priority 0, new priority 10

$ top -b -n1 | head
top - 15:24:56 up 21:01,  1 user,  load average: 0.89, 1.48, 1.77
Tasks: 225 total,   1 running, 224 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.2 us,  7.9 sy,  0.0 ni, 76.6 id,  0.6 wa,  0.0 hi,  0.6 si,  0.0 st
GiB Mem :    7.791 total,    3.033 free,    3.908 used,    0.849 buff/cache
GiB Swap:   16.000 total,   15.793 free,    0.207 used.    3.439 avail Mem 

  PID USER      PR  NI    VIRT    RES  %CPU %MEM     TIME+ S COMMAND
 1591 terdon    30  10 1605.1m 362.6m  23.5  4.5 286:10.40 S chromium
 1754 terdon    20   0  790.8m 184.5m  18.8  2.3 405:54.21 S chromium
 1186 terdon    20   0 1992.8m 459.6m  12.5  5.8 119:31.59 S cinnamon

La valeur de Nice d'un processus est utilisée pour déterminer sa priorité, mais la priorité réelle d'un processus (la colonne PR) n'est pas identique à sa gentillesse. En termes simples, les valeurs niceness déterminent à quel point un processus est "agréable" par rapport aux autres processus de votre système. S'il est très gentil (valeurs de Nice élevées), il sera "poli" et permettra à d'autres processus de prendre le dessus et d'utiliser plus de temps CPU (autrement dit, sa priorité sera faible). Si ce n’est pas Nice, il essaiera d’obtenir le plus de temps CPU possible (donc sa priorité sera grande).

Pour rendre les choses encore plus bizarres, les valeurs de priorité vont de -20 (le le plus élevé) à +20 (le le plus bas) et les valeurs de gentillesse vont de 19 (le le plus élevé gentillesse, donc la priorité la plus basse) à -20 (la gentillesse la plus basse, donc la priorité la plus élevée).

Je ne connais pas le mécanisme exact par lequel une valeur de gentillesse est convertie en priorité. Les détails semblent dépendre de la version du noyau et de l’implémentation spécifique (voir la section "Notes" ici ). Cependant, à titre approximatif, vous pouvez le considérer comme suit:

Priority = DefaultPriority + Niceness

Pour illustrer cela, je vais lancer 3 instances d'un script appelé foo.sh (qui exécute simplement une commande sleep) avec différentes valeurs de gentillesse:

foo.sh &                # default
Nice -n 10 foo.sh
Nice -n 15 foo.sh
Sudo Nice -n -10 foo.sh 

Le dernier utilise Sudo parce que seul root peut démarrer des processus avec une priorité négative (haute). Voyons maintenant quelles sont leurs priorités:

$ top -b -n1 | grep foo.sh
21958 terdon    20   0   13.3m   2.7m   0.0  0.0   0:00.00 S foo.sh
22148 terdon    30  10   13.3m   2.7m   0.0  0.0   0:00.00 S foo.sh
22181 terdon    35  15   13.3m   2.7m   0.0  0.0   0:00.00 S foo.sh
23480 root      10 -10   13.3m   2.6m   0.0  0.0   0:00.00 S foo.sh

Comme vous pouvez le voir ci-dessus, la priorité est égale à la somme de la valeur de gentillesse et de 20, la priorité par défaut.

2
terdon