Nice et Renice

Quand un processus est créé, il passe dans une file d’attente de priorité. Ce processus hérite de la valeur nice de son parent et quand il est lancé depuis un terminal, il hérite du nice du processus du shell.

De façon générale, lorsqu’un nouveau processus est crée, sa valeur nice par défaut est 0.

Les priorités sous Linux

Gestion de la priorité sous linux :

  • de -1 à -20 : priorités HAUTES (-20 étant la plus haute)
  • de 0 à 19 : priorités BASSES (19 étant la plus basse)
Higher Priority                                                                                                              Lower Priority
-------------------------------------------------------------------------------------------------------------------------------------------
-20 -19 -18 -17 16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Afficher les priorités

La commande top permet d’afficher les priorités des processus, il s’agit de la colonne NI :

Tasks: 666 total, 42 running, 624 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 1.9 sy, 0.0 ni, 985.4 id, 0.0 wa, 0.0 hi, 1.9 si, 0.0 st
MiB Mem : 6891.4 total, 5284.5 free, 520.1 used, 785.6 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 3852.6 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 1721 162 103 S 0.0 0.3 0:01.49 systemd
2 root 19 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 boby 0 -20 0 0 0 I 0.9 0.1 0:01.00 firefox
4 john 0 -20 0 0 0 I 1.2 0.2 0:00.90 chrome

Avec la commande ps il est possible d’afficher des champs spécifiques et de ranger les processus par ordre de priorité :

# ps axo pid,comm,nice,cls --sort=-nice
PID COMMAND NI CLS
112 firefox 19 TS
214 sleep-script 5 TS
86 nginx-daemon 1 TS
1 systemd 0 TS
2 kthreadd 0 TS

Les champs pid, comm, nice, cls signifient :

  • pid : PID
  • comm : COMMAND
  • nice : NICE
  • cls : Scheduling CLass of the process (child process inherits the scheduling class and attributes of the parent process through fork)

Commandes nice et renice

Les commandes nice et renice permettemt de gérer la file d’attente des processus.

Commande nice

Il est possible de choisir la priorité d’un processus lors de son exécution avec la commande nice :

# nice -n 10 sleep 120 &

Commande renice

Il est possible de changer la priorité d’un processus avec la commande renice avec son PID :

# renice -n 5 1337

/!\ Résumé des commandes

Commandes :

# nice -n <priority> <command>        // specifie la priorité d'un processus
# renice -n <priority> <PID> // change la priorité d'un processus

# top // affiche les processus en cours
# ps axo pid,comm,nice --sort=-nice // affiche les processus en fonction de leur priorité
# ps aux --sort=pcpu // affiche les processus en fonction de leur consommation processeur

// Boucles simples pour lancer des processus (ici 3) en arrière-plan
# for i in {1..3}; do sha1sum /dev/zero & done
# for i in {1..3}; do md5sum /dev/zero & done

Cas pratiques

Consommation de ressources

Deux processus (sha1sum et md5sum) consomment trop de temps processeur :

[aline@SERVER02 ~]$ ps aux --sort=pcpu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 2310 98.5 0.1 225340 2300 ? RN 06:25 4:29 sha1sum /dev/zero
root 2337 99.0 0.1 225340 2232 ? R< 06:25 4:30 md5sum /dev/zero

Leur niveau de priorité :

[aline@SERVER02 ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum;pgrep md5sum)
PID %CPU NI COMMAND
2310 98.8 2 sha1sum
2337 99.1 -2 md5sum

Ajustement du niveau de priorité à 10 :

[aline@SERVER02 ~]$ sudo renice -n 10 2310 2337
2310 (process ID) old priority 2, new priority 10
2337 (process ID) old priority -2, new priority 10

Vérification de la priorité :

[aline@SERVER02 ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum;pgrep md5sum)
PID %CPU NI COMMAND
2310 98.9 10 sha1sum
2337 99.2 10 md5sum

Ordonnancement des processus

Voir le nombre de processeur sur SERVER01 :

[aline@SERVER01 ~]$ grep -c '^processor' /proc/cpuinfo
2

Lancer une boucle pour démarrer 4 instances de sha1sum /dev/zero & :

[aline@SERVER01 ~]$ for i in {1..4}; do sha1sum /dev/zero & done
[1] 1018
[2] 1019
[3] 1020
[4] 1021

Voir les tâches en arrière-plan :

[aline@SERVER01 ~]$ jobs
[1] Running sha1sum /dev/zero &
[2] Running sha1sum /dev/zero &
[3]- Running sha1sum /dev/zero &
[4]+ Running sha1sum /dev/zero &

Affichage du pourcentage d’utilisation du processeur pour les 3 processus :

[aline@SERVER01 ~]$ ps u $(pgrep sha1sum)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
aline 1018 49.6 0.1 225336 2288 pts/0 R 11:40 2:40 sha1sum /dev/zero
aline 1019 49.6 0.1 225336 2296 pts/0 R 11:40 2:40 sha1sum /dev/zero
aline 1020 49.6 0.1 225336 2264 pts/0 R 11:40 2:40 sha1sum /dev/zero
aline 1021 49.6 0.1 225336 2280 pts/0 R 11:40 2:40 sha1sum /dev/zero

Tuez les tous avec pkill :

[aline@SERVER01 ~]$ pkill sha1sum
[2] Terminated sha1sum /dev/zero
[4]+ Terminated sha1sum /dev/zero
[1]- Terminated sha1sum /dev/zero
[3]+ Terminated sha1sum /dev/zero

Vérification

[aline@SERVER01 ~]$ jobs
[aline@SERVER01 ~]$

Lancer une boucle pour démarrer 3 instances de sha1sum /dev/zero :

[aline@SERVER01 ~]$ for i in {1..3}; do sha1sum /dev/zero & done
[1] 1117
[2] 1118
[3] 1119

Lancement d’une autre instance avec une priorité de 10 :

[aline@SERVER01 ~]$ nice -n 10 sha1sum /dev/zero &
[4] 1120

Affichage du pourcentage d’utilisation du processeur pour les 4 processus :

[aline@SERVER01 ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum)
PID %CPU NI COMMAND
1117 64.2 0 sha1sum
1118 65.0 0 sha1sum
1119 63.9 0 sha1sum
1120 8.2 10 sha1sum

Rechangement de priorité pour le processus num 1120 :

[aline@SERVER01 ~]$ sudo renice -n 5 1120
1120 (process ID) old priority 10, new priority 5

Affichage du pourcentage d’utilisation du processeur pour les 4 processus :

[aline@SERVER01 ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum)
PID %CPU NI COMMAND
1117 62.9 0 sha1sum
1118 63.2 0 sha1sum
1119 63.2 0 sha1sum
1120 10.9 5 sha1sum

tuez les tous avec pkill :

[aline@SERVER01 ~]$ pkill sha1sum
[...]

Optimisation des performances du système

Vérification de l’installation, de l’activation et de l’exécution du paquet tuned :

[aline@SERVER01 ~]$ dnf list tuned
[...]
Installed Packages
tuned.noarch 2.18.0-1.el9 @System

[aline@SERVER01 ~]$ systemctl is-enabled tuned
enabled

[aline@SERVER01 ~] systemctl is-active tuned
active

Listing des tunning disponibles. Le profil actif est virtual-guest :

[aline@SERVER02 ~]$ sudo tuned-adm list
Available profiles:
- accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- intel-sst - Configure for Intel Speed Select Base Frequency
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console - Optimize for serial console use.
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: virtual-guest

Changement du profil en balanced :

[aline@SERVER02 ~]$ sudo tuned-adm profile balanced

Vérifier que le profil balanced est celui par défaut :

[aline@SERVER02 ~]$ sudo tuned-adm profile_info
Profile name:
balanced

Profile summary:
General non-specialized tuned profile

[...]

Lister les processus par ordre de consommation processeur :

[aline@SERVER02 ~]$ ps aux --sort=pcpu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 2310 98.5 0.1 225340 2300 ? RN 06:25 4:29 sha1sum /dev/zero
root 2337 99.0 0.1 225340 2232 ? R< 06:25 4:30 md5sum /dev/zero

Niveau de priorité des deux principaux consommateurs de processeur :

[aline@SERVER02 ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum;pgrep md5sum)
PID %CPU NI COMMAND
2310 98.8 2 sha1sum
2337 99.1 -2 md5sum

Changement de la priorité :

[aline@SERVER02 ~]$ sudo renice -n 10 2310 2337
2310 (process ID) old priority 2, new priority 10
2337 (process ID) old priority -2, new priority 10

Vérification :

[aline@SERVER02 ~]$ ps -o pid,pcpu,nice,comm $(pgrep sha1sum;pgrep md5sum)
PID %CPU NI COMMAND
2310 98.8 10 sha1sum
2337 99.1 10 md5sum

Documentation

MAN nice(1)
MAN renice(1)
MAN top(1)
MAN ps
https://docs.oracle.com/cd/E19455-01/806-4750/chap7rt-20/index.html
https://doc.ubuntu-fr.org/tutoriel/changer_priorite_processus

> Partager <