Processus 'gentillesse' vs 'priorité'

105

En cours d'exécution top, je peux voir cet exemple de sortie (abrégé):

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

Je suis intéressé par deux valeurs: PR(priorité) et NI(gentillesse).

Si j'ai bien compris ce que j'ai déjà découvert, les deux déterminent le temps de traitement d'un processus par rapport à d'autres processus. Mais quelle est la différence entre ces valeurs alors?

Pourriez-vous également décrire comment manipuler ces valeurs d'un processus et dans quelles circonstances cela pourrait être utile?

Byte Commander
la source

Réponses:

103

La valeur intéressante est un espace utilisateur et la priorité PR est la priorité réelle du processus utilisée par le noyau Linux. Sur le système Linux, les priorités sont comprises entre 0 et 139, 0 à 99 pour le temps réel et 100 à 139 pour les utilisateurs. La plage de valeur de Nice va de -20 à +19, où -20 est le plus élevé, 0 par défaut et +19, le plus bas. la relation entre la valeur de la valeur et la priorité est:

PR = 20 + NI

La valeur de PR = 20 + (-20 to +19)est donc comprise entre 0 et 39, ce qui correspond aux cartes 100 à 139.

Selon le top manuel:

PR - Priorité Priorité de planification de la tâche. Si vous voyez «rt» dans ce champ, cela signifie que la tâche est exécutée avec une priorité de planification «temps réel».

NI est une belle valeur de tâche.

NI - Nice Value Valeur intéressante de la tâche. Une valeur de courtoisie négative signifie une priorité plus élevée, alors qu'une valeur de courtier positive signifie une priorité inférieure.Zéro dans ce champ signifie simplement que la priorité ne sera pas ajustée lors de la détermination de la capacité d'envoi d'une tâche.

Edit: Par défaut, lorsqu'un programme est lancé sous Linux, il est lancé avec la priorité «0». Toutefois, vous pouvez modifier la priorité de vos programmes par l’une des méthodes suivantes.

  1. Vous pouvez lancer un programme avec votre priorité requise en utilisant

    nice -n nice_value program_name
    
  2. vous pouvez également changer la priorité d'un processus déjà en cours en utilisant

    renice -n nice_value -p process_id
    
pl_rock
la source
1
Voulez-vous dire qu'ils sont presque la même chose en sens inverse (les deux représentent une priorité) MAIS nicenesspeuvent être utilisés pour donner une priorité négative de sorte que cette tâche nicenessse démarque des tâches hautement prioritaires? (c’est-à-dire que nous sommes en train de nicelaisser d’autres ressources d’accès? Ou est-ce que cela m’a simplement dérouté?
Mark Kirby
1
Un exemple de ce que je veux dire, deux tâches, les deux ayant pr20, donc égales, la tâche un a un nide 0 et la tâche deux a nide 20, donc, cela signifierait que la tâche deux céderait des ressources pour la tâche un, car elle estnicer
Mark Kirby
1
Comme je le sais, la priorité est calculée sous la forme PR = 20 + NI. donc tâche une priorité = 20 +0. valeur maximale de nice volonté +19
pl_rock
3
PR = 20 + NI valeur maximale peut être 39. actuellement, dans le système linux, il y a une priorité 139, 0 à 99 étant la priorité temps réel et, pour l'utilisateur, entre 100 et 139. La valeur NI comprise entre -20 et +19 correspond donc aux priorités 100 à 139. que vous pouvez ajuster. mais le noyau ne sait toujours pas si vous changez la valeur de NI, alors il changera de priorité, la valeur de NI est une suggestion juste pour le noyau. le noyau l'ignore quelque temps
pl_rock
1
Donc, PR et NI sont-ils réellement équivalents, car ils ont juste un décalage différent? Pourquoi avons-nous les deux valeurs alors? Et vous pourriez ajouter que la configuration d'un processus <0 requiert des droits root.
Byte Commander
27

Quelle est la priorité et pourquoi devrais-je m'en soucier?

En matière de processus, la priorité est la gestion du temps processeur. Le processeur ou le processeur est comme un être humain jonglant avec plusieurs tâches en même temps. Parfois, nous pouvons avoir assez de place pour prendre en charge plusieurs projets. Parfois, nous ne pouvons nous concentrer que sur une chose à la fois. D'autres fois, quelque chose d'important apparaît et nous souhaitons consacrer toute notre énergie à la résolution de ce problème tout en mettant en veilleuse les tâches moins importantes.

Sous Linux, nous pouvons définir des directives à suivre par le processeur lorsqu'il examine toutes les tâches qu'il doit effectuer. Ces directives sont appelées gentillesse ou valeur agréable. L'échelle de gentillesse de Linux va de -20 à 19. Plus le nombre est bas, plus la tâche reçoit de priorité. Si la valeur de gentillesse est un nombre élevé, tel que 19, la tâche sera réglée sur la priorité la plus basse et le CPU la traitera chaque fois que cela sera possible. La valeur de courtoisie par défaut est zéro.

En utilisant cette échelle, nous pouvons allouer nos ressources en CPU de manière plus appropriée. Les programmes moins prioritaires qui ne sont pas importants peuvent être définis sur une valeur plus élevée, tandis que les programmes hautement prioritaires tels que les démons et les services peuvent être configurés pour recevoir davantage d’attention du processeur. Vous pouvez même attribuer à un utilisateur spécifique une valeur de transaction inférieure pour tous ses processus, ce qui vous permet de limiter leur capacité à ralentir les services de base de l'ordinateur.

La source

Définir la priorité pour les nouveaux processus avec nice, par exemple

nice -n 10 firefox

pour les processus existants

renice 10 -p $(pgrep firefox)

Pour définir la priorité dont <0vous avez besoin sudo, par exemple:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

mais pas pour une priorité >=0


Exemple

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

Autre exemple

Pour renommer tous les processus en cours pour un utilisateur spécifique

renice 20 -u user_name
UN B
la source
Dans votre exemple, le renice 10fonctionnerait également sans sudo, non? Et pourriez-vous ajouter un exemple pour rendre tous les processus d'un utilisateur spécifique plus agréables? Ce serait en fait très utile si quelqu'un d'autre est connecté en même temps et a quelques processus inutiles mais gourmands en ressources (comme un jeu flash en pause dans Firefox, les petits frères font ce genre de choses ...: - /)
Byte Commandant
@ByteCommander done =)
AB
Comment restaurer les anciennes valeurs de gentillesse de cet utilisateur après un certain temps? Le remettre à 0? Cela ne tiendra pas compte du fait que certains processus peuvent avoir eu une valeur de gentillesse différente auparavant. Y a-t-il une possibilité simple de faire cela?
Byte Commander
@ByteCommander Non, ce n'est pas simple. Ou vous utilisez 0ou… il y a le problème;)
AB
2
Après renice -19, le résultat avec psest: PRI: 38, NI: -19cependant, avec topil est PR:1, NI -19pourquoi?
Réveil
14

Réponse courte

PR est le niveau de priorité. Plus le PR est bas, plus la priorité du processus sera élevée.

Le PR est calculé comme suit:

  • pour les processus normaux: PR = 20 + NI (NI est gentil et va de -20 à 19)
  • pour les processus en temps réel: PR = - 1 - real_time_priority (real_time_priority va de 1 à 99)

Longue réponse

Il existe 2 types de processus, les processus normaux et le temps réel. Pour les processus normaux (et uniquement pour ceux-ci), nice s’applique comme suit:

Agréable

L'échelle de "gentillesse" va de -20 à 19, alors que -20 est la priorité la plus élevée et 19 la priorité la plus basse. Le niveau de priorité est calculé comme suit:

PR = 20 + NI

Où NI est le niveau de satisfaction et PR, le niveau de priorité. Comme nous pouvons le constater, le -20 correspond en fait à 0, tandis que le 19 en correspond à 39.

Par défaut, une valeur de programme est égale à 0, mais l'utilisateur root peut lancer des programmes avec une valeur de jeu spécifiée à l'aide de la commande suivante:

nice -n <nice_value> ./myProgram 

Temps réel

Nous pourrions aller encore plus loin. La priorité nice est en réalité utilisée pour les programmes utilisateur. Alors que la priorité globale UNIX / LINUX a une plage de 140 valeurs, la valeur sympa permet au processus de mapper à la dernière partie de la plage (de 100 à 139). Cette équation laisse les valeurs de 0 à 99 inaccessibles, ce qui correspond à un niveau de PR négatif (de -100 à -1). Pour pouvoir accéder à ces valeurs, le processus doit être défini en "temps réel".

Il existe 5 politiques de planification dans un environnement LINUX qui peuvent être affichées à l'aide de la commande suivante:

chrt -m 

Ce qui montrera la liste suivante:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Les processus de planification peuvent être divisés en 2 groupes, les stratégies de planification normales (1 à 3) et les stratégies de planification en temps réel (4 et 5). Les processus en temps réel auront toujours la priorité sur les processus normaux. Un processus en temps réel peut être appelé à l'aide de la commande suivante (voici comment déclarer une règle SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Pour obtenir la valeur PR d'un processus en temps réel, l'équation suivante est appliquée:

PR = -1 - rt_prior

Où rt_prior correspond à la priorité entre 1 et 99. Pour cette raison, le processus qui aura la priorité la plus élevée par rapport aux autres processus sera celui appelé avec le numéro 99.

Il est important de noter que pour les processus en temps réel, la valeur de courtoisie n'est pas utilisée.

Pour voir la "gentillesse" actuelle et la valeur PR d'un processus, la commande suivante peut être exécutée:

top

Ce qui montre la sortie suivante:

entrez la description de l'image ici

Dans la figure, les valeurs PR et NI sont affichées. Il est bon de noter le processus avec la valeur PR -51 qui correspond à une valeur temps réel. Il existe également des processus dont la valeur PR est indiquée par "rt". Cette valeur correspond en fait à une valeur PR de -100.

Agustin Barrachina
la source