Qual é a melhor opção para um comando Unix?

9

Para um teste rápido de benchmarking, como nice e ionice podem ser combinados para obter o máximo efeito, ou seja, para um comando usar o mínimo de recursos possível (sem inatividade)?

(Eu acho que é algo como `nice -n 19 ionice -c 2 [comando], mas não tenho certeza sobre o" -n "do ionice (classdata param), a página de manual é enigmática quanto à sua relevância.)

mahemoff
fonte
3
mais 1 para o título da pergunta inteligente, mas também é uma boa pergunta em geral.
Lizardx 12/12

Respostas:

10

O comando completo que você deseja é:

chrt -b 0 nice -n 19 ionice -c 2 -n 7 [command]

O chrtcomando no início mudará as coisas para a classe de agendamento em lote, o que equivale a adicionar 0,5 ao valor agradável. A opção -n para ionice é uma prioridade simples para as opções em tempo real ( -c 1) e de melhor esforço ( -c 2), com valores mais baixos sendo prioridade mais alta, assim como valores agradáveis ​​(mas no intervalo de 0 a 7). No entanto, o comando ionice não é estritamente necessário, pois a classe e a prioridade de agendamento de E / S são derivadas por padrão dos parâmetros de agendamento da CPU e nice -n 19implica ionice -c 2 -n 7.

No entanto, você pode obter o uso mínimo absoluto de recursos configurando as classes de agendamento da CPU e de E / S como inativas. Nos dois casos, os agendadores "inativos" não são realmente agendadores inativos, e você ainda poderá usar recursos, mas tudo terá prioridade mais alta.

Para a classe de agendamento da CPU, isso também usa o chrtcomando, embora sem necessidade nice(a prioridade deve ser definida como 0na classe de agendamento ocioso) e tem a seguinte aparência:

chrt -i 0 {command or PID}

O nicecomando no Linux reflete a versão do SVR4, o que significa que ele não pode alterar a classe de agendamento, apenas um valor agradável (que também se comporta de maneira diferente no Linux do que o UNIX clássico, mas isso é um pouco complicado). Como as classes de agendamento alternativas originais eram o POSIX.1E em tempo real SCHED_RRe SCHED_FIFO, o comando para definir as classes de agendamento acabou sendo chamado chrt. A -iopção especifica o uso da SCHED_IDLEclasse de agendamento

Para a classe de planejamento de E / S, você usa ionice. O comando exato é assim:

ionice -c 3 {command or PID}

A -copção especifica qual classe de agendamento usar e 3 é o número da classe inativa. Observe que, dependendo de qual planejador de E / S de bloco está sendo usado, isso pode não afetar nada. Em particular, o noopagendador de E / S não suporta prioridades ou classes de agendamento, e tenho certeza de que os deadlineagendadores (tanto o legado quanto o blk-mq) também não.

Se você quiser fazer isso programaticamente, seja para o seu próprio programa ou para ajustar coisas para outros processos, consulte as páginas de manual das chamadas sched_setschedulere do ioprio_setsistema (embora ambas valham a pena ler, se você quiser apenas mais informações também).

Austin Hemmelgarn
fonte
0

Supondo que você não queira que esse comando aguarde completamente a conclusão de outras pessoas, para não sofrer potencialmente a falta de recursos , a linha seria:

nice -n19 [command]

Como ionice será definido proporcionalmente nos kernels modernos do Linux.

A propósito chrt -b0, nada tem a ver com gentileza, mas com que freqüência a CPU salta de um processo para outro. Essa linha leva mais tempo para que os programas em lote utilizem melhor os caches, mas para outros comandos é inútil. Como visto aqui .

Alberto Salvia Novella
fonte