Nice (et renice) : la priorité des processus sous Linux
Sommaire
I. Présentation
On est souvent confronté à l’urgence du moment lorsque l’on exécute des tâches sous GNU/Linux. Mais, quelle que soit la distribution sur laquelle on se trouve : CentOS ou Debian, il existe une série d’outils permettant de garder le contrôle du déroulement et de l’exécution des processus. Je veux parler de nice (et son petit frère renice) permettant la gestion des priorités sur Linux.
II. Les prérequis
Avant de commencer, un petit rappel, tout système d’exploitation (et GNU/Linux ne fait pas exception), se compose de processus. Il s’agit de tâches, identifiées par leur numéro unique de Process Identity (aussi noté PID). Il s’agit d’instance dynamique de n’importe quel programme exécuté en mémoire et générant une pile d’exécution. Cela implique qu’à tout processus est associé un environnement processeur et un environnement mémoire équivalent. Les processus sont structurés de façon hiérarchique et disposent (sous forme de relation père/fils) d’un lien d’héritage avec son prédécesseur.
REMARQUE : un processus fils est le résultat d’une opération de clonage par duplication du code, depuis un processus initial (le processus père), appelée "fork".
Il existe bien sûr une commande générale (ps –ef), permettant de lister les processus actifs du système en affichant leur PID. Mais, dans certain cas, il peut y en avoir énormément. On va donc chercher alors à filtrer la sortie en ne précisant que le nom de la commande associée au processus.
Exemple :processus vmstat
On exécute la commande ci-dessous, en tâche de fond et on cherche alors à identifier le PID de ce processus :
# vmstat 1 &
Dans ce cas, on va simplement exécuter l’instruction suivante afin de récupérer le n° PID :
# pidof vmstat 20839
III. Initialisation des processus
Mais, il ne faut pas croire que sur le système GNU/Linux l’égalité soit de mise. En effet, chaque processus, en plus de son identifiant unique possède une priorité liée à son contexte d’exécution. Cette priorité, s’échelonne entre -20 (le plus prioritaire) et +19 (le moins prioritaire). Par défaut, les processus sont initialisés (comprenez s’exécutent), avec une priorité à 0, appelée priorité de planification de base. Les processus les plus prioritaires utilisent alors plus de ressources système que les autres. Les tâches les moins prioritaires doivent attendre que les processus de priorité haute soient terminés ou libèrent leurs ressources, pour pouvoir s’exécuter.
ATTENTION: les utilisateurs autres que le super-utilisateur root ne peuvent que diminuer la priorité de leurs processus. Et encore, ils sont restreints à la plage de 0 à 19. Seul root peut jouer sur l’intégralité de l’échelle, pour n’importe quel processus actif.
C’est la commande nice qui permet de fixer dès son démarrage la priorité d’une nouvelle tâche. Pour gérer une priorité différente de la priorité de base, il suffit de placer sa commande en argument de la commande nice. Par défaut, cette dernière attribut une valeur de 10. Mais, en précisant l’option –n, il est possible d’assigner une priorité quelconque dans la fourchette 0 (priorité maximale pour un simple utilisateur) à +19 (priorité minimale). Seul le super-utilisateur peut assigner à de nouveaux processus des priorités allant de -20 à +19.
Exemple :initialiser le processus vmstat avec une priorité plus basse que +10
$ nice –n 16 vmstat 1 &
Mais, que se passe-t-il si l’on souhaite modifier cette priorité, durant la phase d’exécution des processus ? Dans ce cas, il faut utiliser la commande renice.
IV. Modification de la priorité
Lorsque des processus sont déjà en cours d’exécution et que l’on souhaite en modifier la priorité, il faut effectivement utiliser la commande renice. Celle-ci fonctionne comme nice (avec les mêmes restrictions d’échelle et d’utilisation). La syntaxe de la commande est la suivante :
$ renice <Priorité> {-p <PID> | -g <GID> | -u <User>}
Exemple :modification de la priorité du processus vmstat
$ renice +12 –u phil
Si l’on ne souhaite pas préciser de nom de propriétaire du processus concerné, on peut directement exécuter la commande renice en ne mentionnant que la nouvelle priorité et le n° PID :
$ renice +12 20839
V. Où trouver le niveau de priorité
Maintenant, une fois que l’on a ajusté la priorité d’un processus (ou de plusieurs selon les cas), il faut savoir où chercher la valeur de cette dernière. Il existe en fait une commande top listant l’ensemble des processus actifs, au niveau du système d’exploitation et dont la troisième colonne affiche leur priorité :
Mais, pour ceux qui préfèrent la ligne de commande, on peut toujours effectuer la requête ps suivante, permettant d’afficher tous les programmes avec leur n° PID, leur nom et leur priorité:
# ps –eo "%p %c %n"
VI. Astuce de modification
Si l’on souhaite modifier un processus, de façon uniforme, en une seule commande, il suffit de combiner la commande pidof avec une sortie vers xargs permettant de construire la commande à partir de ce que renvoie pidof:
$ pidof vmstat 1 | xargs renice 2
De plus, afin de faire en sorte qu’un utilisateur standard puisse aussi faire des changements de priorité comme root, il faut modifier le fichier /etc/security/limits.conf et ajouter en dernière ligne, pour l’utilisateur concerné :
<User> - nice -20
ATTENTION:cela présente évidemment un risque potentiel de sécurité, car on offre la possibilité à un utilisateur autre que root d’interagir avec le système et son fonctionnement interne.
Les entrées/sorties (comprenez input/output), représentent tout ce qui interagit avec les périphériques externes. Cela peut être un disque dur et il est possible alors d’en prioriser la capacité, pour un programme donné, à écrire dessus. Il existe trois catégories utilisables, sur la majorité des systèmes :
- Real time: priorité haute d’accès au disque pour le(s) processus.
- Best effort: le système gère cela de façon égale pour chaque processus.
- Idle: ne peut accéder au disque qu’en l’absence d’autres programmes concurrents.
Les deux premières catégories peuvent être subdivisées en niveaux distincts, afin de gérer plus finement l’allocation. La commande à utiliser s’appelle ionice et sa syntaxe est la suivante :
# ionice –c <Classe> <Commande>
Ainsi, on peut lancer le processus avec l’une des trois classes demandée. Par défaut, le système pointe sur la classe 2 (best effort). En clair, la commande ionice fait au niveau stockage, ce que la commande nice fait au niveau CPU.
Exemple :définir l’utilisation du bash comme un processus de classe 3 :
# ionice –c 3 bash
VII. Conclusion
Désormais, vous pouvez reprendre le contrôle de vos processus système grâce à la "priorité adroite" (oui, je sais, elle était facile). Il n’empêche que grâce à ces petites commandes, on peut facilement rendre plus opérationnel et plus rapide le système et sa gestion de processus. On peut même s’improviser chef d’orchestre et faciliter telle ou telle exécution de tâches, en cours d’exécution et modifier leur priorité respective.