Processo 'gentileza' versus 'prioridade'

75

Ao executar top , posso ver a saída de exemplo (abreviada):

  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

Há dois valores em que estou interessado: PR (Priority) e NI (Niceness).

Se eu entendi o que eu 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ê poderia também descrever como manipular esses valores de um processo e sob quais circunstâncias isso pode ser útil?

    
por Byte Commander 05.08.2015 / 11:17

3 respostas

75

valor interessante é um espaço do usuário e a prioridade PR é a prioridade real do processo que é usada pelo kernel do Linux. No sistema linux, as prioridades são de 0 a 139, nas quais 0 a 99 para tempo real e 100 a 139 para usuários. O bom intervalo de valores é de -20 a +19, onde -20 é mais alto, 0 padrão e +19 é menor. A relação entre valor legal e prioridade é:

PR = 20 + NI

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

De acordo com o manual principal:

% bl0ck_qu0te%

NI é um bom valor de tarefa.

% bl0ck_qu0te%

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

  1. Você pode iniciar um programa com sua prioridade exigida 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
    
por pl_rock 05.08.2015 / 11:51
19

O que é prioridade e por que devo me importar?

Quando se fala em prioridade de processos, tudo gira em torno do gerenciamento do tempo do processador. O processador ou CPU é como um humano fazendo malabarismos com várias tarefas ao mesmo tempo. Às vezes, podemos ter espaço suficiente para realizar vários projetos. Às vezes podemos nos concentrar apenas em uma coisa de cada vez. Outras vezes, algo importante aparece e queremos dedicar toda a nossa energia para resolver esse problema e, ao mesmo tempo, colocar tarefas menos importantes em segundo plano.

No Linux, podemos definir diretrizes para a CPU seguir quando estiver analisando todas as tarefas que precisa realizar. Essas diretrizes são chamadas de gentileza ou valor agradável. A escala de nicencia do Linux vai de -20 a 19. Quanto menor o número, mais prioridade a tarefa recebe. Se o valor niceness for alto número como 19, a tarefa será configurada para a prioridade mais baixa e a CPU processará essa tarefa sempre que tiver uma chance. O valor legal padrão é zero.

Ao usar essa escala, podemos alocar nossos recursos de CPU de maneira mais apropriada. Programas de menor prioridade que não são importantes podem ser configurados para um valor mais alto, enquanto programas de alta prioridade, como daemons e serviços, podem ser configurados para receber mais foco da CPU. Você pode até mesmo dar a um usuário específico um valor mais baixo para todos os processos dele, para que você possa limitar a capacidade deles de retardar 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 <0 , você precisa de sudo , por exemplo:

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

mas não para uma 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 renunciar a todos os processos em execução para um usuário específico

renice 20 -u user_name
    
por A.B. 05.08.2015 / 13:06
2

Resposta curta

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

O PR é calculado da seguinte forma:

  • para processos normais: PR = 20 + NI (o 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)

Longa resposta

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

Nice

A escala de "bondade" vai de -20 a 19, enquanto que -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 nível bom e PR é o nível de prioridade. Então, como podemos ver, o -20 realmente mapeia para 0, enquanto o 19 mapeia para 39.

Por padrão, um valor legal do programa é 0, mas é possível que o usuário raiz inicie programas com um valor legal 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, um valor interessante 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, o que corresponderá a um nível de 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 

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 de 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 essa razão, o processo que terá maior prioridade sobre outros processos será o chamado com o número 99.

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

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

top

Que mostra a seguinte saída:

Nafigura,osvaloresPReNIsãoexibidos.ÉbomobservaroprocessocomovalorPR-51quecorrespondeaumvaloremtemporeal.ExistemtambémalgunsprocessoscujovalorPRédeclaradocomo"rt". Este valor corresponde realmente a um valor de PR de -100.

    
por Agustin Barrachina 26.09.2018 / 12:07