
Então meu sistema está sendo DOS, ou acabei de abrir um arquivo meio enorme (openstreetmaps planet.osm). O sistema fica totalmente sem resposta... tão sem resposta que levará cerca de 10 minutos para entrar no meu shell, executar o top e encerrar o processo incorreto. Estou pronto para apertar o botão de reset.
Pergunta: é possível reservar uma certa quantidade mínima de recursos do sistema de forma que, se meu sistema ficar bloqueado, eu ainda tenha 2% de CPU (sistema de 2 GHz ~ 40 MHz! - deve ser suficiente para o shell, certo? Quer dizer, funcionou no início dos anos 90) reservado em algum lugar? Ou alguma forma de limitar processos ofensivos?
Recebo essas situações em que gostaria que o sistema operacional restringisse processos descontrolados para que eu ainda pudesse usar o sistema, mesmo que isso significasse uma queda geral de 10% no desempenho. A capacidade de agir em situações como essa em vez de ficar completamente indefeso seria... legal.
Responder1
Engraçado você dizer "legal". Uma solução é "renovar" o processo ofensivo para que ele não sobrecarregue a CPU (essencialmente diminuindo a prioridade do aplicativo).
Para iniciar um processo com prioridade mais baixa:
nice <program> &
Para alterar a prioridade de um processo em execução:
renice 4 <program>
A escala de prioridades vai de -20 a 20. 0 é o padrão, 20 é a prioridade mais baixa, -20 é a prioridade mais alta.
Responder2
Você pode escrever um script para procurar processos em execução em tty0 ou ttyS0 ou onde desejar um login root prioritário e definir esses processos para uma prioridade de agendamento em tempo real. O script em si deve ser iniciado com prioridade em tempo real.
Obter acesso à memória durante uma tempestade de trocas é uma tarefa mais difícil. Você pode usar cgroups do Linux. Você pode escrever um programa em C em vez de um script e usar mlockall para bloquear sua memória na RAM. Então esse programa pode usar o ptrace para invadir outros processos e forçá-los a chamar o mlockall. Você pode usar isso para obter um shell bash que não será afetado pela troca.
A menos que você seja um programador ou encontre alguém que já tenha escrito isso (eu não), cgroups é provavelmente uma maneira mais fácil de reservar memória de alta prioridade.