Diferença entre bom valor e prioridade na saída superior

11

top , por padrão, lista as duas colunas. Estou curioso para saber qual é a diferença. Eu verifiquei as páginas de manual e não consigo descobrir:

Prioridade:

   h: PR  --  Priority
      The priority of the task.

Nice value:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

Entendo que o valor Nice está relacionado à fila do agendador de CPU do Kernel; então o que indica a prioridade ? Algo em relação à E / S, talvez?

Belmin Fernandez
fonte

Respostas:

8

O bom valor é um mecanismo "global", enquanto a prioridade é relevante para o alternador de tarefas no momento .

Ignacio Vazquez-Abrams
fonte
O que você quer dizer com alternador de tarefas?
Belmin Fernandez 27/10/10
1
O alternador de tarefas (chamado de "agendador") é um pouco de código no kernel que decide qual tarefa será executada a seguir.
Ignacio Vazquez-Abrams
25

A diferença é que o PR é uma prioridade real de um processo no momento dentro do kernel e a NI é apenas uma dica para o kernel qual a prioridade que o processo deve ter.

Na maioria dos casos, o valor do PR pode ser calculado pela seguinte fórmula: PR = 20 + NI . Assim, o processo com gentileza 3 tem a prioridade 23 (20 + 3) e o processo com gentileza -7 tem a prioridade 13 (20 - 7). Você pode verificar a primeira de comando em execução nice -n 3 top. Isso mostrará que o processo principal possui NI 3 e PR 23 . Mas para rodar nice -n -7 topna maioria dos sistemas Linux, você precisa ter privilégios de root, porque, na verdade, o menor valor de PR é a maior prioridade real. Assim, o processo com PR 13 tem prioridade mais alta do que os processos com prioridade padrão PR 20. É por isso que você precisa ser root. Mas o valor mínimo de gentileza permitido para processos não raiz pode ser configurado em /etc/security/limits.conf .

Teoricamente, o kernel pode alterar o valor do PR (mas não o NI ) por si só. Por exemplo, pode reduzir a prioridade de um processo se consumir muita CPU ou aumentar a prioridade de um processo se esse processo não tiver chance de ser executado por um longo tempo devido a outros processos de prioridade mais alta. Nesses casos, o valor do PR será alterado pelo kernel e o NI permanecerá o mesmo, portanto, a fórmula "PR = 20 + NI" não estará correta. Portanto, o valor da NI pode ser interpretado como uma dica para o kernel qual a prioridade que o processo deve ter, mas o kernel pode escolher prioridade real ( valor PR ) por conta própria, dependendo da situação. Mas geralmente a fórmula"PR = 20 + NI" está correto.

As regras exatas de como o kernel altera a prioridade não são claras. O manual setpriority (a função que altera o bom valor) diz:

O efeito da alteração do valor agradável pode variar dependendo do algoritmo de agendamento de processos em vigor.

Pthread manual diz o seguinte:

A prioridade dinâmica é baseada no valor nice (definido por nice (2), setpriority (2) ou sched_setattr (2)) e aumentada para cada quantum de tempo em que o encadeamento está pronto para ser executado, mas negado para ser executado pelo planejador.

Parece que o valor PR corresponde à prioridade dinâmica.

O intervalo do valor de NI é -20..19 . Assim, o valor PR pode ter valores de 0 (20 - 20) a 39 (20 + 19). Mas está correto apenas para os processos com política de agendamento padrão ( SHED_OTHER ). Também pode haver processos com as chamadas políticas de agendamento "em tempo real" . Essas políticas são SCHED_RR e SCHED_FIFO . Esses processos têm um valor PR menor que 0. Você pode verificar isso executando o chrt -r 1 topcomando (precisa ser root). O processo superior terá PR -2 . Você pode até executar chrt -r 90 top, nesse caso, o topoprocesso terá PR -91 .

Parece que para processos SCHED_RR o valor PR pode ser calculado pela fórmula:

PR = - 1 - sched_rr_priority .

Portanto, um processo SCHED_RR possui pelo menos PR -1, o que significa que qualquer processo SCHED_RR tem prioridade mais alta que qualquer SCHED_OTHER . Isso corresponde ao manual pthread:

SCHED_FIFO pode ser usado apenas com prioridades estáticas maiores que 0, o que significa que quando um encadeamento SCHED_FIFO se torna executável, ele sempre antecipa imediatamente qualquer encadeamento SCHED_OTHER, SCHED_BATCH ou SCHED_IDLE em execução no momento.

SCHED_RR é um aprimoramento simples de SCHED_FIFO. Tudo o que foi descrito acima para SCHED_FIFO também se aplica a SCHED_RR,

A prioridade dos processos em tempo real é referida como prioridade estática que não pode ser alterada pelo kernel. Portanto, valores PR positivos podem ser tratados como prioridade dinâmica para processos não em tempo real ( SCHED_OTHER , SCHED_BATCH ) e valor PR negativo como prioridade estática para processos em tempo real ( SCHED_RR , SCHED_FIFO ).

Eu também tentei correr nice -n 10 chrt -r 50 top(e chrt -r 50 nice -n 10 top). O valor do NI era 10, mas o PR ainda era -51 . Portanto, parece que o valor da NI não afeta a prioridade dos processos SCHED_RR . Isso corresponde ao manual de prioridade :

Quaisquer processos ou threads que usem SCHED_FIFO ou SCHED_RR não serão afetados por uma chamada para setpriority (). Isso não é considerado um erro. Um processo que posteriormente reverte para SCHED_OTHER não precisa ter sua prioridade afetada por uma chamada setpriority ().

Uma nota engraçada. Se você executar chrt -r 99 top, verá o valor RT em vez de um número na coluna PR .

  PID USER PR NI VIRT RES SHR% CPU% MEM TIME + COMMAND
28489 root RT 0 2852 1200 896 R 0 0.1 0: 00.01 topo

Eu não acho que isso significa que o processo agora é especial. Eu acho que isso significa que a parte superior simplesmente não imprime -100 porque seriam necessários 4 caracteres para imprimir.

Você também pode usar htop em vez de top em todos os exemplos que podem ser mais convenientes. ps -ltambém pode ser usado, mas o ponto base que separa prioridades em tempo real e não em tempo real não é 0, mas 60, portanto, nice -n -20 ps -lserá impresso

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20-1176 - pts / 6 00:00:00 ps
Anton
fonte
Curiosamente, se eu executar 5 loops infinitos (int main {while (1);}) em um i3 com dois núcleos com hyperthread, suas prioridades permanecerão constantes. Isso no teste sid do debian.
Vorac
1
@BelminFernandez Acho que será justo fazer esta resposta "aceita".
Z0lupka
1

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 na verdade mapeia para 0, enquanto o 19 mapeia para 39.

Por padrão, um valor agradável do programa é 0 bit. É possível que um usuário root alimente 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

É bom observar que processos com valor PR -51, por exemplo, correspondem 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.

(PS: eu teria postado uma foto mostrando o melhor resultado, mas não tenho reputação de fazer isso)

Agustin Barrachina
fonte