Guillaume Fenollar DevOps et SysAdmin Freelance

Guillaume FENOLLAR

Ingénieur Linux/DevOps Indépendant

− Montpellier −

Limiter les ressources allouées aux processus avec Nice

Quand vous lancez un processus (appelons le “programme” pour plus de simplicité), Linux va lui allouer tout un tas de paramètres et variables d’environnement. Sont gérés de cette façon les priorités que le système donne à un programme, y compris la priorité au processeur.
En effet, chaque processus va consommer du temps processeur (CPU time), plus ou moins selon ses besoins. Quand le système se retrouve sous l’eau à gérer des programmes trop gourmands, il va devoir donner la priorité à certains d’entre eux. C’est là que la valeur de nice rentre en jeu.

Nice : Prioriser un processus

Ceci peut être utile si vous voulez empêcher une tâche longue et non urgente de vous plomber votre système. Définissez une priorité inférieure à un processus pour empêcher qu’il influe sur le reste de votre système.

La valeur du nice est settée à la création du processus. La plupart du temps elle est de ‘0’ par défaut.

Elle va de -20 à +20. Plus elle est élevée, moins le processus est important à l’égard du système, et plus elle est basse (en dessous de 0 donc), plus elle sera prioritaire sur les autres process aux valeurs plus hautes.

Seul le superutilisateur root à la possibilité d’accorder une valeur négative (et donc une priorité élevée).

nice [commande] → Lancer un programme en priorité 10 (basse). 
nice -n [valeur] [nom du programme] → Démarrer un programme avec une valeur précise.

Renice : Modifier la priorité d’un processus existant

Je pense qu’il n’y a pas grand chose à ajouter. Bien entendu, vous devez être propriétaire du processus ou alors être root pour modifier sa priorité. À noter qu’il est aussi possible de renicer tous les processus d’un utilisateur en particulier

renice [valeur] [PID] → Façon la plus simple de renicer un processus.
renice [valeur] -u [utilisateur] → Renicer tous les processus d’un utilisateur

Connaître les priorités de ses programmes

Il y a beaucoup de moyens d’afficher la valeur de nice de ses programmes. La plus courante est encore d’utiliser top, repérable à la colonne suivante:

nice

(À noter qu’il est aussi possible de renicer un processus directement depuis top en appuyant sur ‘r’)

Vous avez aussi la possibilité d’utiliser la commande suivante, qui vous permet d’afficher exclusivement ce que vous avez besoin, et de rajouter ou enlever des colonnes selon votre envie (RTFM):

ps -eo “%p %c %n” → Affiche la liste de tous les programmes, avec PID, nom et nice.

Bonus: appliquer un nice à du I/O

Le I/O (Input/Output) est tout ce qui est interaction entre le système et un device externe. Ceci est la plupart du temps un disque dur. Oui oui, il est donc possible de prioriser la capacité d’un programme à écrire sur le disque. Trois classes sont donc possibles sur la majorité des systèmes, représentées par les nombres suivants :

  1. Real Time: Priorité haute d’accès au disque pour ce processus, ce qui peut gêner l’exécution d’autres processes. A donc utiliser avec précaution.
  2. Best Effort: Type par défaut. Le système se débrouille pour sustenter chacun de façon égale.
  3. Idle: Le processus ne pourra accéder au disque que si aucun autre programme ne le fait déjà.

Les deux premières classes peuvent après avoir des niveaux, permettant de gérer finement l’allocation. Mais je ne vais pas rentrer dans ces détails, et seulement donner la commande basique:

ionice -c [classe] [commande] → Lancer le processus avec la classe demandée.

La valeur à utiliser est donc le numéro correspondant à la classe choisie de la liste ci-dessus. À noter aussi que par défaut les classes que vous verrez à des programmes déjà existants sont souvent 0 ou 4. Ces deux classes utilisent par défaut la classe Best Effort (2).