103.6 Leçon 1
Certification : |
LPIC-1 |
---|---|
Version : |
5.0 |
Thème : |
103 Commandes GNU et Unix |
Objectif : |
103.6 Modifier les priorités d’exécution des processus |
Leçon : |
1 sur 1 |
Introduction
Les systèmes d’exploitation capables d’exécuter plus d’un processus en même temps sont appelés systèmes multitâches ou multiprocessus. Si la véritable simultanéité ne se produit que lorsque plus d’un processeur (CPU) est disponible, même les systèmes dotés d’un seul processeur peuvent reproduire un semblant de simultanéité en passant très rapidement d’un processus à l’autre. Cette technique est également utilisée dans les systèmes dotés de plusieurs CPUs équivalents ou systèmes à multiprocesseurs symétriques (SMP), étant donné que le nombre de processus simultanés potentiels dépasse largement le nombre de CPUs disponibles.
En fait, un seul processus à la fois peut contrôler le CPU. Cependant, la plupart des activités des processus sont des appels système, c’est-à-dire que le processus en cours d’exécution transfère le contrôle du CPU à un processus du système d’exploitation pour qu’il effectue l’opération requise. Les appels système se chargent de toute la communication entre périphériques comme l’allocation de mémoire, la lecture et l’écriture sur les systèmes de fichiers, l’affichage de texte à l’écran, l’interaction avec l’utilisateur, les transferts réseau, etc. Le transfert du contrôle du CPU pendant un appel système permet au système d’exploitation de décider s’il doit rendre le contrôle du CPU au processus précédent ou le céder à un autre processus. Comme les CPU modernes sont capables d’exécuter des instructions beaucoup plus rapidement que la plupart des périphériques externes ne peuvent communiquer entre eux, un nouveau processus de contrôle peut effectuer une grande partie du travail du CPU alors même que les réponses matérielles précédemment sollicitées ne sont pas encore disponibles. Pour garantir une optimisation de l’utilisation du CPU, les systèmes d’exploitation multiprocessus gèrent une file d’attente dynamique de processus actifs en attente d’un créneau de temps du CPU.
Même s’ils permettent d’améliorer considérablement l’utilisation du temps CPU, le fait de s’appuyer uniquement sur les appels système pour passer d’un processus à l’autre n’est pas suffisant pour obtenir des performances multitâches satisfaisantes. Un processus qui ne fait aucun appel au système pourrait contrôler le CPU indéfiniment. C’est pourquoi les systèmes d’exploitation modernes sont également préemptifs, c’est-à-dire qu’un processus en cours d’exécution peut être remis dans la file d’attente afin qu’un processus plus important puisse contrôler le CPU, même si le processus en cours d’exécution n’a pas effectué d’appel système.
L’ordonnanceur Linux
En tant que système d’exploitation multiprocessus préemptif, Linux implémente un ordonnanceur chargé d’organiser la file d’attente des processus. Plus précisément, l’ordonnanceur décide également quel thread (processus léger) de la file d’attente sera exécuté — un processus peut engendrer toute une série de threads indépendants — mais processus et thread sont des termes interchangeables dans ce contexte. Chaque processus est associé à deux paramètres qui déterminent son ordonnancement : la politique d’ordonnancement et la priorité d’ordonnancement.
On distingue deux principales catégories de politiques d’ordonnancement : les politiques temps réel et les politiques normales. Les processus soumis à une politique temps réel sont ordonnancés directement en fonction de leurs valeurs de priorité. Si un processus plus important est prêt à s’exécuter, un processus moins important en cours d’exécution est préempté et le processus prioritaire prend le contrôle du CPU. Un processus de priorité inférieure ne prendra le contrôle du CPU que lorsque les processus de priorité supérieure sont inactifs ou en attente d’une réponse du matériel.
Tous les processus temps réel ont une priorité plus élevée que les processus normaux. En tant que système d’exploitation polyvalent, Linux n’exécute que très peu de processus temps réel. La plupart des processus, y compris les programmes système et utilisateur, s’exécutent selon des politiques d’ordonnancement normales. Les processus normaux ont généralement la même priorité, mais les politiques normales peuvent définir des règles de priorité d’exécution à l’aide d’un autre paramètre de processus : la valeur nice. Pour éviter toute confusion avec les priorités dynamiques dérivées des valeurs nice, les priorités d’ordonnancement sont généralement appelées priorités d’ordonnancement statiques.
L’ordonnanceur Linux peut être configuré de plusieurs manières et il existe même des méthodes plus complexes pour établir les priorités, mais ces concepts généraux restent toujours valables. Lorsqu’on inspecte et qu’on règle l’ordonnancement des processus, il est important de garder à l’esprit que seuls les processus soumis à une politique d’ordonnancement normale seront affectés.
Comprendre les priorités
Linux réserve des priorités statiques allant de 0 à 99 aux processus temps réel tandis que les processus ordinaires se voient attribuer des priorités statiques allant de 100 à 139, ce qui implique qu’il existe 39 niveaux de priorité différents pour les processus normaux. Les valeurs plus basses correspondent à une priorité plus élevée. La priorité statique d’un processus actif se trouve dans le fichier sched
, situé dans le répertoire correspondant du système de fichiers /proc
:
$ grep ^prio /proc/1/sched prio : 120
Comme le montre l’exemple, la ligne commençant par prio
indique la valeur de priorité du processus (le processus PID 1 est le processus init ou systemd, le premier processus lancé par le noyau lors du démarrage du système). La priorité standard des processus normaux est de 120, elle peut donc être ramenée à 100 ou augmentée à 139. Les priorités de tous les processus en cours d’exécution peuvent être consultées à l’aide de la commande ps -Al
ou ps -el
:
$ ps -el F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 9292 - ? 00:00:00 systemd 4 S 0 19 1 0 80 0 - 8817 - ? 00:00:00 systemd-journal 4 S 104 61 1 0 80 0 - 64097 - ? 00:00:00 rsyslogd 4 S 0 63 1 0 80 0 - 7244 - ? 00:00:00 cron 1 S 0 126 1 0 80 0 - 4031 - ? 00:00:00 dhclient 4 S 0 154 1 0 80 0 - 3937 - pts/0 00:00:00 agetty 4 S 0 155 1 0 80 0 - 3937 - pts/1 00:00:00 agetty 4 S 0 156 1 0 80 0 - 3937 - pts/2 00:00:00 agetty 4 S 0 157 1 0 80 0 - 3937 - pts/3 00:00:00 agetty 4 S 0 158 1 0 80 0 - 3937 - console 00:00:00 agetty 4 S 0 160 1 0 80 0 - 16377 - ? 00:00:00 sshd 4 S 0 280 0 0 80 0 - 5301 - ? 00:00:00 bash 0 R 0 392 280 0 80 0 - 7221 - ? 00:00:00 ps
La colonne PRI
indique la priorité statique assignée par le noyau. On remarquera cependant que la valeur de la priorité affichée par ps
diffère de celle observée dans l’exemple ci-dessus. Pour des raisons historiques, les priorités affichées par ps
vont de -40 à 99 par défaut, si bien que la priorité réelle est calculée en y ajoutant 40 (notamment 80 + 40 = 120).
On peut également surveiller à chaud les processus gérés par le noyau Linux avec le programme top
. Comme pour ps
, top
affiche la valeur de la priorité à sa façon. Pour faciliter l’identification des processus temps réel, top
soustrait la valeur de la priorité de 100, ce qui rend toutes les priorités temps réel négatives, avec un nombre négatif ou rt qui les identifie. Par conséquent, les priorités normales affichées par top
vont de 0 à 39.
Note
|
Pour obtenir plus de détails de la commande $ ps -e -o user,uid,comm,tty,pid,ppid,pri,pmem,pcpu --sort=-pcpu | head |
Le degré de priorité des processus
Chaque processus normal démarre avec une valeur nice
par défaut de 0 (priorité 120). Le nom nice (gentil, sympathique) vient de l’idée que les processus "plus sympathiques" permettent à d’autres processus de s’exécuter avant eux dans une file d’attente donnée. Les valeurs nice
vont de -20 (moins nice, haute priorité) à 19 (plus nice, basse priorité). Linux permet également d’assigner des valeurs différentes aux threads d’un même processus. La colonne NI
dans la sortie ps
indique le numéro nice.
Seul l’utilisateur root peut réduire la priorité d’un processus en dessous de zéro. Vous pouvez démarrer un processus avec une priorité différente de la normale avec la commande nice
. Par défaut, nice
modifie la priorité à 10, mais cette valeur peut être modifiée avec l’option -n
:
$ nice -n 15 tar czf home_backup.tar.gz /home
Dans cet exemple, la commande tar
est exécutée avec une priorité de 15. La commande renice
peut être utilisée pour modifier la priorité d’un processus en cours d’exécution. L’option -p
indique le numéro PID du processus cible. Par exemple :
# renice -10 -p 2164 2164 (process ID) old priority 0, new priority -10
Les options -g
et -u
sont utilisées pour modifier tous les processus d’un groupe ou d’un utilisateur donné, respectivement. Avec renice +5 -g users
, le degré d’agrément des processus appartenant aux utilisateurs du groupe users sera augmenté de cinq.
En dehors de renice
, la priorité des processus peut être modifiée à l’aide d’autres programmes, comme top
. Dans l’écran principal de top
, la priorité d’un processus peut être modifiée en appuyant sur r
puis en renseignant le numéro PID du processus :
top - 11:55:21 up 23:38, 1 user, load average: 0,10, 0,04, 0,05 Tasks: 20 total, 1 running, 19 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,5 us, 0,3 sy, 0,0 ni, 99,0 id, 0,0 wa, 0,2 hi, 0,0 si, 0,0 st KiB Mem : 4035808 total, 774700 free, 1612600 used, 1648508 buff/cache KiB Swap: 7999828 total, 7738780 free, 261048 used. 2006688 avail Mem PID to renice [default pid = 1] PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 74232 7904 6416 S 0,000 0,196 0:00.12 systemd 15 root 20 0 67436 6144 5568 S 0,000 0,152 0:00.03 systemd-journal 21 root 20 0 61552 5628 5000 S 0,000 0,139 0:00.01 systemd-logind 22 message+ 20 0 43540 4072 3620 S 0,000 0,101 0:00.03 dbus-daemon 23 root 20 0 45652 6204 4992 S 0,000 0,154 0:00.06 wickedd-dhcp4 24 root 20 0 45648 6276 5068 S 0,000 0,156 0:00.06 wickedd-auto4 25 root 20 0 45648 6272 5060 S 0,000 0,155 0:00.06 wickedd-dhcp6
Le message PID to renice [default pid = 1]
apparaît avec le premier processus listé sélectionné par défaut. Pour modifier la priorité d’un autre processus, saisissez son PID et appuyez sur Entrée. Le message Renice PID 1 to value
apparaît alors (avec le numéro de PID demandé) et une nouvelle valeur pourra être attribuée.
Exercices guidés
-
Dans un système multitâche préemptif, que se passe-t-il lorsqu’un processus de moindre priorité occupe le processeur et qu’un processus de priorité plus élevée est en attente d’exécution ?
-
Prenons l’écran
top
ci-dessous :top - 08:43:14 up 23 days, 12:29, 5 users, load average: 0,13, 0,18, 0,21 Tasks: 240 total, 2 running, 238 sleeping, 0 stopped, 0 zombie %Cpu(s): 1,4 us, 0,4 sy, 0,0 ni, 98,1 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st MiB Mem : 7726,4 total, 590,9 free, 1600,8 used, 5534,7 buff/cache MiB Swap: 30517,0 total, 30462,5 free, 54,5 used. 5769,4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 171420 10668 7612 S 0,0 0,1 9:59.15 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:02.76 kthreadd 3 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_par_gp 8 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq 9 root 20 0 0 0 0 S 0,0 0,0 0:49.06 ksoftirqd/0 10 root 20 0 0 0 0 I 0,0 0,0 18:24.20 rcu_sched 11 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_bh 12 root rt 0 0 0 0 S 0,0 0,0 0:08.17 migration/0 14 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/0 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/1 16 root rt 0 0 0 0 S 0,0 0,0 0:11.79 migration/1 17 root 20 0 0 0 0 S 0,0 0,0 0:26.01 ksoftirqd/1
Quels sont les PID qui ont des priorités temps réel ?
-
Considérons le listing
ps -el
ci-dessous :F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 42855 - ? 00:09:59 systemd 1 S 0 2 0 0 80 0 - 0 - ? 00:00:02 kthreadd 1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp 1 S 0 9 2 0 80 0 - 0 - ? 00:00:49 ksoftirqd/0 1 I 0 10 2 0 80 0 - 0 - ? 00:18:26 rcu_sched 1 I 0 11 2 0 80 0 - 0 - ? 00:00:00 rcu_bh 1 S 0 12 2 0 -40 - - 0 - ? 00:00:08 migration/0 1 S 0 14 2 0 80 0 - 0 - ? 00:00:00 cpuhp/0 5 S 0 15 2 0 80 0 - 0 - ? 00:00:00 cpuhp/1
Quel PID a la plus grande priorité ?
-
Vous essayez de modifier la priorité d’un processus avec
renice
et vous vous retrouvez confronté à l’erreur suivante :$ renice -10 21704 renice: failed to set priority for 21704 (process ID): Permission denied
Quelle est la cause probable de l’erreur ?
Exercices d’approfondissement
-
Lorsqu’un processus occupe trop de temps CPU, il faut généralement modifier les priorités de ce processus. En utilisant
ps
avec les options standard pour afficher tous les processus du système dans un format long, quelle option--sort
va trier les processus par utilisation du CPU, dans un ordre croissant ? -
La commande
schedtool
peut définir tous les paramètres d’ordonnancement du CPU dont Linux est capable ou afficher des informations pour des processus donnés. Comment peut-on l’utiliser pour afficher les paramètres d’ordonnancement du processus1750
? Par ailleurs, comment utiliserschedtool
pour basculer le processus 1750 en temps réel avec une priorité de -90 (telle qu’affichée partop
) ?
Résumé
Cette leçon explique comment Linux partage le temps de CPU entre les processus qu’il gère. Pour garantir les meilleures performances, les processus critiques doivent prendre le pas sur les processus moins critiques. La leçon passe en revue les étapes suivantes :
-
Concepts de base des systèmes multiprocessus.
-
Qu’est-ce qu’un ordonnanceur de processus et comment Linux le met en œuvre.
-
Les priorités de Linux, les valeurs nice et leur utilité.
-
Comment lire et interpréter les priorités des processus sous Linux.
-
Modifier la priorité d’un processus, avant et pendant son exécution.
Réponses aux exercices guidés
-
Dans un système multitâche préemptif, que se passe-t-il lorsqu’un processus de moindre priorité occupe le processeur et qu’un processus de priorité plus élevée est en attente d’exécution ?
Le processus de moindre priorité est mis en attente et le processus de plus haute priorité est exécuté à sa place.
-
Prenons l’écran
top
ci-dessous :top - 08:43:14 up 23 days, 12:29, 5 users, load average: 0,13, 0,18, 0,21 Tasks: 240 total, 2 running, 238 sleeping, 0 stopped, 0 zombie %Cpu(s): 1,4 us, 0,4 sy, 0,0 ni, 98,1 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st MiB Mem : 7726,4 total, 590,9 free, 1600,8 used, 5534,7 buff/cache MiB Swap: 30517,0 total, 30462,5 free, 54,5 used. 5769,4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 171420 10668 7612 S 0,0 0,1 9:59.15 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:02.76 kthreadd 3 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_par_gp 8 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq 9 root 20 0 0 0 0 S 0,0 0,0 0:49.06 ksoftirqd/0 10 root 20 0 0 0 0 I 0,0 0,0 18:24.20 rcu_sched 11 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_bh 12 root rt 0 0 0 0 S 0,0 0,0 0:08.17 migration/0 14 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/0 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/1 16 root rt 0 0 0 0 S 0,0 0,0 0:11.79 migration/1 17 root 20 0 0 0 0 S 0,0 0,0 0:26.01 ksoftirqd/1
Quels sont les PID qui ont des priorités temps réel ?
Les PIDs 12 et 16.
-
Considérons le listing
ps -el
ci-dessous :F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 42855 - ? 00:09:59 systemd 1 S 0 2 0 0 80 0 - 0 - ? 00:00:02 kthreadd 1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp 1 S 0 9 2 0 80 0 - 0 - ? 00:00:49 ksoftirqd/0 1 I 0 10 2 0 80 0 - 0 - ? 00:18:26 rcu_sched 1 I 0 11 2 0 80 0 - 0 - ? 00:00:00 rcu_bh 1 S 0 12 2 0 -40 - - 0 - ? 00:00:08 migration/0 1 S 0 14 2 0 80 0 - 0 - ? 00:00:00 cpuhp/0 5 S 0 15 2 0 80 0 - 0 - ? 00:00:00 cpuhp/1
Quel PID a la plus grande priorité ?
Le PID 12.
-
Vous essayez de modifier la priorité d’un processus avec
renice
et vous vous retrouvez confronté à l’erreur suivante :$ renice -10 21704 renice: failed to set priority for 21704 (process ID): Permission denied
Quelle est la cause probable de l’erreur ?
Sur l’utilisateur root peut réduire les valeurs nice en-dessous de zéro.
Réponses aux exercices d’approfondissement
-
Lorsqu’un processus occupe trop de temps CPU, il faut généralement modifier les priorités de ce processus. En utilisant
ps
avec les options standard pour afficher tous les processus du système dans un format long, quelle option--sort
va trier les processus par utilisation du CPU, dans un ordre croissant ?$ ps -el --sort=pcpu
-
La commande
schedtool
peut définir tous les paramètres d’ordonnancement du CPU dont Linux est capable ou afficher des informations pour des processus donnés. Comment peut-on l’utiliser pour afficher les paramètres d’ordonnancement du processus1750
? Par ailleurs, comment utiliserschedtool
pour basculer le processus 1750 en temps réel avec une priorité de -90 (telle qu’affichée partop
) ?$ schedtool 1750
# schedtool -R -p 89 1750