Quando tenho processos que consomem grandes quantidades de memória ou muitos processos vinculados à CPU em execução, muitas vezes fica difícil até mesmo fazer login no sistema. Gostaria de evitar isso e sempre manter o sistema responsivo. Existe alguma maneira de conseguir isso?
Esclarecendo a edição:
Estou falando de duas situações diferentes em que sinto os mesmos sintomas:
Carga de memória muito alta. Um único processo consumindo quase ou mais que os 64 GB de RAM disponíveis. Quando o sistema chega perto de 100% de uso, os programas param de responder.
Carga de CPU muito alta, problemas de agendamento. Ter 10 mil processos executáveis causa o mesmo problema. Observe que este não é um problema de carga de 100% da CPU. Quando eu mato -STOP todos, exceto 200 desses processos, todas as 32 CPUs permanecem com 100% de carga, mas o sistema é muito mais utilizável.
E sobre a questão do que considero “o sistema”. Entendo que não há diferença conceitual entre um processo shell e um dos meus outros processos de usuário, mas isso é apenas uma questão de torná-los diferentes. Existem opções como gentileza que fazem exatamente isso. Mas, como mencionado acima, a gentileza não resolveu o problema, pelo menos não no caso (2.).
Tenho controle total desses sistemas e em todos os casos consegui interromper trabalhos usando kill -STOP ou apenas Cc.O que eu gostaria de corrigir é que isso se torna incrivelmente difícil e, ao usar uma GUI, às vezes é impossível porque a entrada é processada de forma incrivelmente lenta, se é que é processada. Eu gostaria de corrigir isso em geral e não fazer alterações em alguns trabalhos específicos.
Coisas que tentei:
Para muitos processos em execução, que estou tendo agora, acabei de reduzir todos os processos em execução para +5, mas isso não pareceu ajudar. Nem configurá-los para gentileza 19.
Conforme sugerido em uma das respostas. Tentei alterar a política do agendador para IDLE usando
sudo schedtool -D $(pgrep -u myuser progname -d " ")
e comsudo sh -c 'for pid in $(pgrep -u myuser progname); do chrt -i -p 0 $pid; done;'
Isto parece melhorar um pouco a situação.
Responder1
O problema é que você está saturando sua memória e, como resultado, o sistema operacional tem que recorrer à liberação de caches de disco e à troca de programas e seus dados.
Swap é um método para manter um sistema funcionando quando os limites de memória física são atingidos. Em um sistema levemente carregado, isso pode significar que o sistema continua funcionando e as coisas são paginadas quando ocorre um aperto e retornam quando necessário, com apenas pequenos efeitos.
A maioria dos sistemas operacionais libera programas e códigos para troca com base no "menos usado recentemente". É difícil fazer qualquer tipo de suposição sobre a “prioridade” da memória porque a carga da memória muda e a “prioridade” é uma ladeira escorregadia de julgamentos subjetivos sobre o que é mais importante. O que é mais importante para um sistema é menos importante para outro. Os programas de linha de comando são apenas outros programas e é impossível distingui-los de outros programas executados pelo usuário.
Como você tem um sistema muito carregado com muitos processos usando muita memória, você está enfrentando um problema de contenção. No momento em que o sistema operacional tenta paginar algo no disco para liberar memória, outro processo já solicitou algumas outras páginas que precisam ser trazidas de volta. Cada solicitação para recuperar algo empurra outra coisa para fora.
Entre 10.000 processos, como poderia qualquer sistema determinar o que deveria ter prioridade sobre as solicitações de programa de linha de comando do "sistema" que se parecem com qualquer outra solicitação de programa?
O outro problema são os tempos de busca do disco rígido. Para HDDs antigos, o tempo para mover a cabeça da unidade e iniciar uma leitura ou gravação é da ordem de 9,5 milissegundos. Com muitas solicitações acontecendo ao mesmo tempo para diferentes áreas, a busca pelo tempo pode dominar todo o resto e reduzir o tempo útil real e a largura de banda para números surpreendentemente pequenos. Um SSD pode ajudar, mas se você tiver memória limitada, ele não poderá ajudar muito.
Gargalos semelhantes podem ocorrer em todo o sistema e apresentar sintomas diferentes. O sistema operacional pode gerenciar um grande número de programas simultâneos, mas ainda é “apenas” um programa e precisa de tempo entre todo o resto. O uso de arquivos de troca é apenas um dos gargalos mais extremos.
Inundar um sistema dessa maneira e apenas esperar que ele “lide com isso” não é uma boa ideia.
Se você usa consistentemente mais memória do que tem, a resposta é comprar mais memória. Se você tiver milhares de processos disputando tempo no disco rígido para ler ou gravar dados, será necessário distribuir a carga por mais máquinas ou unidades.
Para a sua outra situação, com 10.000 processos ativos, seu problema é tanto de contenção quanto de expectativas irrealistas.
Um problema é que a “gentileza” nem sempre é necessariamente uma prioridade menor. Depende do agendador do sistema operacional e adicionar mais e mais processos pode realmente prejudicar um sistema justo e útil, pois você acaba reduzindo a quantidade de tempo alocado para qualquer processo.
Veja esta pergunta em nosso site irmão UnixComo é bom trabalhar?que descreve o Agendador Completamente Justo:
O CFS tem uma latência alvo para a duração do agendamento. Latências alvo menores geram melhor interatividade, mas à medida que a latência alvo diminui, a sobrecarga de comutação aumenta, diminuindo assim o rendimento geral.
...
Agora considere dois processos, um com gentileza de 0 (o padrão), o outro com gentileza de 5. A diferença proporcional entre os pesos correspondentes é de aproximadamente 1/3, o que significa que o processo de maior prioridade recebe um intervalo de tempo de aproximadamente 15 milissegundos. enquanto o processo de prioridade mais baixa recebe um intervalo de tempo de 5 milissegundos.
Sob este agendador, a gentileza significa que seus 10.000 processosdeveobtenha menos tempo, mas devido ao grande número deles, você pode estar atingindo o limite inferior do valor do intervalo de tempo para um agendamento "justo", o que significa que ninguém obtém um intervalo de tempo de bom tamanho. Você pode até estar atingindo um limite em que a ativação ou desativação de tarefas nas CPUs domina o tempo.
Isso é efetivamente o mesmo que contenção do disco rígido. Você está forçando seu sistema a gastar mais tempo trocando entre processos do que gastando tempo útil trabalhando em qualquer processo.
Você pode descobrir mais sobre o agendador emhttp://man7.org/linux/man-pages/man7/sched.7.html
Usar um número mais razoável de processos (100 a 200) resulta em uma quantidade razoável de tempo dividida entre as tarefas do sistema operacional e seus processos.
Em vez de iniciar 10.000 tarefas de uma vez, você deve iniciar novas tarefas à medida que as antigas terminam.