Domine `nice` e `renice`: Priorize processos Linux como um expert!

Os comandos nice e renice proporcionam a capacidade de ajustar a forma como o núcleo do sistema operacional trata os seus processos, modificando as suas prioridades. Este guia tem como objetivo demonstrar o uso desses comandos em sistemas Linux e outros semelhantes ao Unix, como o macOS.

A Essência dos Processos

Num computador Linux ou similar, diversos processos estão ativos mesmo antes de abrir qualquer aplicação. Muitos desses processos são componentes essenciais do próprio sistema Linux ou funcionam como suporte ao ambiente gráfico. Existe uma grande atividade nos bastidores, com um número limitado de recursos do sistema e tempo de CPU disponível. O núcleo do Linux é o responsável por gerir todos esses processos.

O núcleo decide quais processos devem receber atenção e recursos imediatamente, e quais podem aguardar. Este gestor de processos está constantemente a equilibrar a prioridade de cada tarefa para assegurar o melhor desempenho do computador, garantindo que todos os processos tenham a sua quota de recursos. Alguns processos têm tratamento preferencial, dado que são cruciais para o funcionamento do computador, tendo assim prioridade sobre tarefas como a navegação na internet.

O Conceito de “Nice”

Um dos critérios usados pelo núcleo para determinar como tratar um processo é o seu valor “nice”. Cada processo tem um valor “nice”, que é um número inteiro entre -19 e 20. Por defeito, todos os processos iniciam com um valor “nice” de zero.

O conceito fundamental é que quanto maior o valor “nice”, mais “amigável” o processo se torna para os outros. Ou seja, um valor “nice” elevado indica ao núcleo que o processo pode esperar. Um número negativo, por outro lado, indica o oposto. Quanto mais negativo o valor “nice”, mais “egoísta” é o processo, tentando obter o máximo de tempo de CPU possível, sem considerar os outros processos.

É possível usar o comando nice para definir o valor “nice” quando um processo é iniciado. O comando renice é usado para ajustar o valor “nice” de um processo já em execução.

O Comando nice

O comando nice permite ajustar o valor “nice” de um programa no momento da sua execução. Isto possibilita aumentar ou diminuir a prioridade que o núcleo atribui ao processo, relativamente aos outros processos.

Imaginemos que um programador criou um programa chamado ackermann, que calcula Funções de Ackermann, um processo que usa intensivamente a CPU e a memória. O programador pode executar o programa com o seguinte comando:

./ackermann

Podemos usar o comando top para visualizar o programa em execução.

top

Os detalhes do programa ackermann são visíveis no topo. O valor “nice” está na coluna “NI”, definido como zero, como esperado.

Vamos reiniciar o programa, tornando-o menos exigente. Definiremos o valor “nice” para 15. Para isso, digitamos nice, um espaço, -15, outro espaço e o nome do programa, no nosso exemplo ./ackermann.

nice -15 ./ackermann

O -15 não representa um valor negativo. O - é usado para indicar que estamos a passar um parâmetro. Para indicar um número negativo, é necessário usar dois caracteres -.

Ao executar novamente, podemos observar a alteração no comportamento do ackermann.

top

Com um valor “nice” de 15, o ackermann não está a usar tanto tempo de CPU. O GNOME e o Rhythmbox estão a usar mais. Demos prioridade a outros processos.

Vamos agora inverter e atribuir ao ackermann um valor “nice” negativo. Note o uso de dois caracteres -. Para tornar uma aplicação mais egoísta, é necessário usar o comando sudo. Qualquer utilizador pode tornar a sua aplicação mais “amigável”, mas apenas o superutilizador pode torná-la mais “egoísta”.

sudo nice --10 ./ackermann

Vamos iniciar o programa e observar a diferença.

top

Desta vez, o ackermann tem um valor “nice” de -10. Ocupa mais tempo de CPU do que antes.

O Comando renice

O comando renice permite ajustar o valor “nice” de um processo já em execução. Não é necessário interromper e reiniciar o processo com o comando nice. É possível definir um novo valor imediatamente.

O comando renice usa o ID do processo, ou PID, como parâmetro. O PID pode ser obtido através da coluna “PID” no top, ou usando o comando ps e grep. No exemplo, substituímos o nome de utilizador “dave” pelo seu nome e o nome do processo “ackermann” pelo processo desejado.

ps -eu dave | grep ackermann

Com o PID obtido, podemos usá-lo com o renice. Vamos definir o ackermann com um valor “nice” de 5. Para alterar o valor “nice” de um processo, é necessário usar o sudo. Note que não existe - no parâmetro 5. Não é necessário para números positivos e usa-se apenas um para números negativos.

sudo renice -n 5 2339

É confirmada a alteração do valor “nice”. São apresentados os valores antigo e novo.

Geralmente, o núcleo do sistema operacional é eficiente a gerir prioridades e a distribuir tempo de CPU e recursos do sistema. No entanto, se tem uma tarefa que exige muito da CPU e não importa quando é concluída, definir um valor “nice” mais alto para essa tarefa pode melhorar o desempenho geral do computador, sendo benéfico para todos.