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?
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 rodarnice -n -7 top
na 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:
Pthread manual diz o seguinte:
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 top
comando (precisa ser root). O processo superior terá PR -2 . Você pode até executarchrt -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:
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
(echrt -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 :Uma nota engraçada. Se você executar
chrt -r 99 top
, verá o valor RT em vez de um número na coluna PR .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 -l
també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 -l
será impressofonte
Resposta curta
PR é o nível de prioridade. Quanto menor o PR, maior será a prioridade do processo.
O PR é calculado da seguinte forma:
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:
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:
O que mostrará a seguinte lista:
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):
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:
É 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)
fonte