Processo 'gentileza' vs. 'prioridade'

104

Ao executar top, posso ver este exemplo (abreviado) de saída:

  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

Estou interessado em dois valores: PR(Prioridade) e NI(Niceness).

Se eu entendi o que já descobri corretamente, ambos determinam quanto tempo de CPU um processo terá em contraste com outros processos. Mas qual é a diferença entre esses valores então?

Você também pode descrever como manipular esses valores de um processo e sob quais circunstâncias isso pode ser útil?

Byte Commander
fonte

Respostas:

103

O valor agradável é o espaço do usuário e o PR prioritário é a prioridade real do processo usada pelo kernel do Linux. No sistema Linux, as prioridades são de 0 a 139, sendo 0 a 99 em tempo real e 100 a 139 para os usuários. o intervalo de valor agradável é de -20 a +19, onde -20 é mais alto, 0 padrão e +19 é mais baixo. relação entre bom valor e prioridade é:

PR = 20 + NI

portanto, o valor de PR = 20 + (-20 to +19)é de 0 a 39 que mapeia 100 a 139.

De acordo com o manual superior:

PR - Prioridade A prioridade de agendamento da tarefa. Se você ver 'rt' neste campo, significa que a tarefa está sendo executada sob a prioridade de agendamento 'em tempo real'.

NI é um bom valor da tarefa.

NI - Nice Value O bom valor da tarefa. Um valor agradável negativo significa prioridade mais alta, enquanto um valor agradável positivo significa prioridade mais baixa. Zero neste campo simplesmente significa que a prioridade não será ajustada na determinação da capacidade de envio de uma tarefa

Editar: Por padrão, quando um programa é iniciado no Linux, ele é iniciado com a prioridade '0'. No entanto, você pode alterar a prioridade de seus programas por um dos seguintes métodos.

  1. Você pode iniciar um programa com a prioridade necessária usando

    nice -n nice_value program_name
    
  2. você também pode alterar a prioridade de um processo já em execução usando

    renice -n nice_value -p process_id
    
pl_rock
fonte
1
Você está dizendo que eles são quase a mesma coisa em sentido inverso (ambos representam prioridade), MAS nicenesspodem ser usados ​​para dar uma prioridade negativa, de modo que a tarefa com a nicenesssaída de tarefas de alta prioridade fique fora do caminho. (ou seja, ele está sendo nicee deixando outros recursos de acesso ou se isso só me confundir?
Mark Kirby
1
Um exemplo do que eu quero dizer, duas tarefas, ambas com pr20, então iguais, a tarefa 1 tem um nide 0 e a tarefa 2 tem um nide 20; portanto, isso significa que a tarefa 2 abriria mão de recursos para a tarefa 1 porque énicer
Mark Kirby
1
Como eu sei, prioridade calculada como PR = 20 + NI. então tarefa uma prioridade = 20 +0. valor máximo de boa vontade +19
pl_rock 5/08
3
PR = 20 + valor máximo de NI pode ser 39. na verdade, no sistema linux, há 139 prioridades, nas quais 0 a 99 é prioridade em tempo real e, para o usuário, 100 a 139. portanto, o valor da NI -20 a +19 mapeia para a prioridade 100 a 139. que você pode ajustar. mas ainda assim o kernel não tem certeza se você altera o valor do NI, ele mudará de prioridade; o valor do NI é apenas uma sugestão para o kernel. algum tempo o ignora
pl_rock 5/15
1
Então, PR e NI são realmente equivalentes, pois têm apenas um deslocamento diferente? Por que temos os dois valores então? E você pode adicionar que a definição de um processo <0 requer direitos de root.
Byte Commander
26

O que é prioridade e por que devo me preocupar?

Ao falar sobre processos, a prioridade é gerenciar o tempo do processador. O processador ou CPU é como um humano que manipula várias tarefas ao mesmo tempo. Às vezes, podemos ter espaço suficiente para assumir vários projetos. Às vezes, podemos focar apenas uma coisa de cada vez. Outras vezes, algo importante aparece e queremos dedicar toda a nossa energia para resolver esse problema, colocando tarefas menos importantes em segundo plano.

No Linux, podemos definir diretrizes para a CPU seguir quando estiver analisando todas as tarefas que precisa executar. Essas diretrizes são chamadas de gentileza ou bom valor. A escala de privacidade do Linux vai de -20 a 19. Quanto menor o número, maior a prioridade que essa tarefa recebe. Se o valor da gentileza for um número alto como 19, a tarefa será definida com a menor prioridade e a CPU a processará sempre que houver uma chance. O valor legal padrão é zero.

Ao usar essa escala, podemos alocar nossos recursos de CPU de maneira mais apropriada. Programas de prioridade mais baixa que não são importantes podem ser configurados com um valor agradável mais alto, enquanto programas de alta prioridade como daemons e serviços podem ser configurados para receber mais do foco da CPU. Você pode até dar a um usuário específico um valor agradável mais baixo para todos os seus processos, para limitar sua capacidade de desacelerar os serviços principais do computador.

Fonte

Defina a prioridade para novos processos com nice, por exemplo

nice -n 10 firefox

para processos existentes

renice 10 -p $(pgrep firefox)

Para definir a prioridade que <0você precisa sudo, por exemplo:

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

mas não por prioridade >=0


Exemplo

% 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

Outro exemplo

Para renovar todos os processos em execução para um usuário específico

renice 20 -u user_name
AB
fonte
No seu exemplo, o renice 10também funcionaria sem sudo, certo? E você poderia adicionar um exemplo para tornar todos os processos de um usuário específico mais agradáveis? Isso seria realmente bastante útil se outra pessoa estivesse conectada ao mesmo tempo e tivesse alguns processos desnecessários, mas que consumiam recursos em execução (como um jogo em pausa no Firefox, os irmãos mais novos fazem essas coisas ...: - /)
Byte Comandante
@ByteCommander done =)
AB
Como restauro os antigos valores de gentileza desse usuário depois de um tempo? Definindo de volta para 0? Isso não leva em conta que alguns processos podem ter um valor de gentileza diferente antes. Existe alguma possibilidade simples de fazer isso?
Byte Commander
@ByteCommander Não, não é simples. Ou você usa 0ou… existe o problema;)
AB
2
Após renice -19, o resultado com psé: PRI: 38, NI: -19no entanto, com topisso é PR:1, NI -19por que isso?
despertar
14

Resposta curta

PR é o nível de prioridade. Quanto menor o PR, maior será a prioridade do processo.

O PR é calculado da seguinte forma:

  • para processos normais: PR = 20 + NI (NI é bom e varia de -20 a 19)
  • para processos em tempo real: PR = - 1 - real_time_priority (real_time_priority varia de 1 a 99)

Resposta longa

Existem 2 tipos de processos, os normais e o tempo real. Para os normais (e apenas para aqueles), nice é aplicado da seguinte forma:

agradável

A escala de "gentileza" vai de -20 a 19, enquanto -20 é a prioridade mais alta e 19 a prioridade mais baixa. O nível de prioridade é calculado da seguinte forma:

PR = 20 + NI

Onde NI é o bom nível e PR é o nível de prioridade. Então, como podemos ver, o -20 é mapeado para 0, enquanto o 19 é mapeado para 39.

Por padrão, um valor agradável do programa é 0, mas é possível que o usuário root inicie programas com um valor agradável especificado usando o seguinte comando:

nice -n <nice_value> ./myProgram 

Tempo real

Poderíamos ir ainda mais longe. A boa prioridade é realmente usada para programas do usuário. Enquanto a prioridade geral do UNIX / LINUX possui um intervalo de 140 valores, o valor agradável permite que o processo seja mapeado para a última parte do intervalo (de 100 a 139). Essa equação deixa os valores de 0 a 99 inacessíveis, que corresponderão a um nível PR negativo (de -100 a -1). Para poder acessar esses valores, o processo deve ser declarado como "tempo real".

Existem 5 políticas de agendamento em um ambiente LINUX que podem ser exibidas com o seguinte comando:

chrt -m 

O que mostrará a seguinte lista:

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

Os processos de agendamento podem ser divididos em 2 grupos, as políticas normais de agendamento (1 a 3) e as políticas de agendamento em tempo real (4 e 5). Os processos em tempo real sempre terão prioridade sobre os processos normais. Um processo em tempo real pode ser chamado usando o seguinte comando (O exemplo é como declarar uma política SCHED_RR):

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

Para obter o valor PR para um processo em tempo real, a seguinte equação é aplicada:

PR = -1 - rt_prior

Onde rt_prior corresponde à prioridade entre 1 e 99. Por esse motivo, o processo que terá maior prioridade sobre outros processos será aquele chamado com o número 99.

É importante observar que, para processos em tempo real, o bom valor não é usado.

Para ver a atual "gentileza" e o valor PR de um processo, o seguinte comando pode ser executado:

top

O que mostra a seguinte saída:

insira a descrição da imagem aqui

Na figura, os valores PR e NI são exibidos. É bom observar o processo com o valor PR -51 que corresponde a um valor em tempo real. Existem também alguns processos cujo valor PR é declarado como "rt". Na verdade, esse valor corresponde a um valor PR de -100.

Agustin Barrachina
fonte