Por que não consigo usar o renice para aumentar o bom valor de um processo?

25

De man renice:

Usuários que não sejam o superusuário podem alterar apenas a prioridade dos processos que possuem, e podem aumentar monotonicamente seu `` bom valor '' (por razões de segurança) dentro do intervalo de 0 a PRIO_MAX (20) [...]

Portanto, eu posso renicemeus próprios processos para cima (dar a eles menor prioridade), mas nunca para baixo:

$ renice 10 22316
22316 (process ID) old priority 0, new priority 10
$ renice 9 22316
renice: failed to set priority for 22316 (process ID): Permission denied

Por que é isso? Entendo por que usuários normais não podem definir valores agradáveis ​​menores que 0, mas por que, como posso diminuir a prioridade para 10, não posso aumentá-la novamente para 9? Que "motivo de segurança" existe para isso? Tenho o direito de iniciar um processo com um valor agradável de 9, por que não posso renomeá-lo para 9?


Edição: eu deveria aprender a rolar para baixo. Acontece que isso está listado como um bug em man renice:

BUGS
     Non super-users can not increase scheduling priorities of their own
     processes, even if they were the ones that decreased the priorities 
     in the first place.

Isso é ainda mais confuso. Se eles consideram esse comportamento um erro, por que não alterá-lo? O renicecomando apareceu no 4.0BSD, que eu acho que é de 1980. Isso deve ser muito fácil de corrigir, por um lado eles parecem ter optado por deixá-lo e, por outro, o listam como um bug.

terdon
fonte
Como algumas prioridades maiores que 0 podem ser impostas por um processo do sistema ou um módulo de segurança e nunca devem ser diminuídas pelo usuário (e não há controle suficiente para definir a gentileza mínima de um determinado processo do usuário que não seja o valor fixo 0) ? Não é uma resposta, pois não tenho certeza, mas um palpite.
lgeorget

Respostas:

19

Desde o linux 2.6.12, isso depende do valor do limite RLIMIT_NICE ( ulimit -e). O que pode levar valores de 0 a 40. Esse limite é mais o limite da prioridade do processo (quanto maior esse número, maior a prioridade que um usuário pode definir para um processo).

Você notará que o valor padrão é 20 no ubuntu 10.04 e 0 no Debian jessie, por exemplo.

Um valor npara esse limite significa que um processo sem o recurso CAP_NICE pode aumentar apenas uma prioridade do processo para até n, o que significa diminuir a gentileza até uma gentileza de 20 - n. Portanto, para um valor 0, isso significa que nenhum usuário não privilegiado pode diminuir a gentileza abaixo de 20, portanto, nenhum usuário não privilegiado pode diminuir a gentileza.

Com um valor de 20, usuários não privilegiados podem diminuir a gentileza de volta para 0.

Cabe ao administrador escolher se permite que os usuários reduzam sua prioridade de processo e em que nível, definindo o limite rígido para isso.

Quanto ao motivo pelo qual um administrador pode não querer que os usuários diminuam a prioridade do processo, consulte a resposta da Flup .

Stéphane Chazelas
fonte
11
Ah! Portanto, é configurável! OK, isso faz mais sentido, obrigado.
terdon
"valores de 0 a 40. [...] Você notará que o valor padrão é 20 no ubuntu 10.04 e 0 no Debian jessie, por exemplo." -> Ulimits interessantes / rígidos para mim são 0 no debian jessie. Posso aumentar até 20, mas além disso recebo "bash: ulimit: prioridade de agendamento: não pode modificar o limite: argumento inválido", valores negativos também não são aceitos.
Thomanski
20

É pelo que eu chamaria de razões políticas . A ideia é que usuários normais não possam substituir as ações de usuários privilegiados.

Digamos que você seja um usuário em um enorme servidor compartilhado. Você está executando processos monstruosos de sobrecarga da CPU em detrimento dos outros usuários. O administrador de sistemas reniceé alguns de seus processos porque ele não gosta muito de você. O sistema operacional não lembra quem fez o reniceprocedimento, mas sabe que usuários normais não podem reverter a ação. Dessa maneira, o administrador do sistema tem controle sobre as prioridades do processo dos usuários normais.

Flup
fonte
11
Eu posso entender isso, mas ainda parece estranho. Na verdade, eu acabei de perceber que está listado como um bug no man renice.
terdon
3
Eu acho que o ponto principal do bug é que 'Não superusuários não podem aumentar as prioridades de agendamento de seus próprios processos, mesmo que eles tenham diminuído as prioridades em primeiro lugar '. ou seja, é um efeito colateral dessa aplicação que um acidente renicenão pode ser revertido, exceto por um usuário privilegiado.
Flup
7
Porque o sistema não lembra quem definiu a prioridade. Idealmente, se você aumentasse o nível legal e desejasse abaixá-lo, isso seria permitido ... mas o sistema impõe uma proibição geral precisamente porque não mantém registros de quem percebeu o quê, para que você não possa desfazer uma ação. reniceisso rootfez.
Flup
11
@IwillnotexistIdonotexist pensa em sistemas com muitos usuários. O administrador de sistemas pode querer aumentar a prioridade de seus processos para 5 e diminuir os meus para 10. Isso ainda está dentro do intervalo de usuários normais, mas não poderei alterá-lo e roubar o tempo de CPU que você merece. Essa é a ideia de qualquer maneira, como Flup explicou. No entanto, como StephaneChazelas explicou , isso é configurável e, portanto, cabe ao administrador do sistema escolher o que preferir.
terdon
11
A resposta para "por quê?" Provavelmente é "porque ninguém precisava o suficiente para escrever o código para corrigi-lo". Quando o Unix foi originalmente escrito, rastrear quem definiu a prioridade de um processo pode ter sido caro em termos de uso de memória e trabalho para atualizá-lo, mas em máquinas modernas isso é insignificante, deixando apenas a falta de motivação para escrever o código para rastrear isso nos sites que desejam manter a política original de "o usuário não pode substituir o sysadmin".
alanc
-1

Estranho ? funciona para mim em

Linux clafujiu 2.6.32-57-generic #119-Ubuntu \
 SMP Wed Feb 19 01:04:55 UTC 2014 i686 GNU/Linux

exemplo

$ renice 8 --pid 21122
21122: old priority 9, new priority 8
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122   8
21146   0
21155   0
21209   0
christian@clafujiu:~/tmp$ renice 15 --pid 21122
21122: old priority 8, new priority 15
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  15
21146   0
21155   0
21211   0
christian@clafujiu:~/tmp$ renice 10 --pid 21122
21122: old priority 15, new priority 10
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  10
21146   0
21155   0
21213   0

2ª edição

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

Alterações de configuração

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

E eu sou membro do grupo de áudio, isso foi para reduzir a latência com jack / ardor e buffer xruns durante a gravação.

renice

$ renice --version
renice from util-linux-ng 2.17.2
X Tian
fonte
Em que distro você está? isso não acontece no AIX 6.2
Kiwy 12/03/2014
Por favor, publique a saída de cat /etc/lsb*e renice --versiontambém.
terdon
renice --version renice from util-linux-ng 2.17.2mas ainda no AIX não é possível
kiwy