Dê prioridade ao mouse / teclado / terminal / ctrl-c e pare os programas de congelar meu sistema linux

2

Sim, esta é uma questão ampla, mas eu diria que é bastante válida. Às vezes, programas e scripts demoram muito ou usam muita memória e realmente começam a atrasar meu sistema. Bem. Às vezes o sistema desacelera tanto que mal posso mostrar meu mouse para o terminal e spam Ctrl + C . Isso me deixa perplexo sobre por que um sistema operacional não fornece prioridade de agendamento para permitir que o usuário use o mouse, o teclado e mate as coisas. Já viu isso?

> ./program
^C^C^C^C^C^C^C^C^C^C^C^Z^Z^Z^C^C^C^C^C^Clsdhafjkasdf

Agora, Ctrl + C não é tão severo quanto alguns outros (pode ser tratado pelo aplicativo e até mesmo ignorado, mas não é o caso aqui). Ctrl + Z funcionaria muito bem, pois eu poderia kill -9 %1 depois, mas também não funciona.

Outro método pode ser pular para um console virtual Ctrl + Alt + F2 , efetuar o login e eliminar o aplicativo problemático, mas como o sistema está ocupado isso não funciona e eu recebo uma tela preta. Da mesma forma eu não posso abrir novos terminais (a janela aparece, mas não me deixa cair em um shell). Outros terminais que estão abertos podem não responder ou executar comandos.

Eu suspeito que uma razão pela qual o sistema é tão inoperável é que o programa ofensivo está pressionando o swap e empurrando os aplicativos principais da memória principal. Nem mesmo o comando mais simples para me dar um prompt bash ou executar o kill pode obter um ciclo em edgeways. Não tenho provas disso porque não posso executar top quando isso acontece. Existe alguma opção para melhorar as chances de o Ctrl + C funcionar? original? . Talvez algo ao longo das linhas de aumentar X e prioridade de terminal ou automaticamente matar programas que usam uma grande parte da memória ou começar a trocar muito?

Existe algum outro linux-fu que eu possa usar para recuperar o controle quando isso acontece (por exemplo, comandos SysRq )?

Atualização: Depois de mais alguns testes, tenho certeza que os aplicativos usam muita memória e acessam o swap. Mesmo depois de matar o aplicativo em questão, outros demoram muito para começar a ser responsivos, como se tivessem sido retirados da memória principal. Eu realmente gostaria de alguma maneira de limitar automaticamente os programas de uso de memória alta para a memória principal . Se isso acontecer, será muito lento, então qual é o objetivo de continuar.

OBSERVAÇÃO: Não estou atrás de uma solução para um aplicativo específico e não sei antecipadamente quando alguma operação vai mastigar a memória. Eu quero resolver esse tipo de sistema de lentidão. Ou seja muitos programas causam isso. AFAIK Eu não mexi com a configuração do sistema e é uma instalação bastante padrão do fedora. Não estou surpreso com essas lentidões, mas quero mais controle.

Gostaria de manter meu gerenciador de janelas em execução e esses são meus últimos recursos que espero evitar. Eu geralmente só preciso disso se a minha GPU estiver presa em um loop e bloqueando o X. Se ativado , Ctrl + Alt + backspace é um atalho prático para matar X e todos os seus aplicativos, levando você de volta para entrar. Um comando mais potente, novamente se ativado , é Alt + SysRq + K . Se isso não funcionar, a hora do botão liga / desliga.

Alt + SysRq + F (obrigado, @Hastur), que mata os processos de monopolizar a memória é bastante destrutivo, mas pode ajudar como último recorrer. Atualização: Não inteiramente certo de todas as conseqüências aqui, mas a sugestão de ulimit do @ Xen2050 parece resolver muitos problemas ...

TOTAL_PHYSICAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
ulimit -Sv $(( $TOTAL_PHYSICAL_MEMORY * 4 / 8))

Vou deixar isso no meu bashrc e ver como as coisas correm.

Atualização: as coisas parecem boas, exceto que eu acho que alguns aplicativos compartilham grandes bibliotecas e mapeiam arquivos grandes. Mesmo que eles consumam mal qualquer memória real e não é provável que ele acesse swap com freqüência. Não parece haver um número baixo o suficiente para matar aplicativos pesados de troca de trocas, mas deixar os regulares (como 4.6gb VIRT amarok ) rodando.

Relacionados: link , mas ainda a questão de limitar os aplicativos que começam a trocar muito.

Esta é exatamente a melhor solução que eu vejo depois: É possível fazer o interventor assassino da OOM mais cedo?

    
por jozxyqk 18.02.2015 / 13:55

2 respostas

1

O seu caso particular não soa como apenas um processo usando toda a CPU disponível, mais como um problema de exibição ou possivelmente de RAM. A limitação da RAM deve ser possível com algo como cgroups ou limites de usuário / ulimit.

Mas se você quiser tentar limitar o uso da CPU de alguns processos, isso pode funcionar:
Se você sabe exatamente quais processos estão acabando com sua CPU, você pode usar cpulimit para diminuir a velocidade. Eu uso isso regularmente em um processo de baixa prioridade que às vezes foge com a CPU, funciona muito bem. Isso:

sends the SIGSTOP and SIGCONT signals to a process, both to verify that it can control it and to limit the average amount of CPU it consumes. This can result in misleading (annoying) job control messages that indicate that the job has been stopped (when actually it was, but immediately restarted). This can also cause issues with interactive shells that detect or otherwise depend on SIGSTOP/SIGCONT. For example, you may place a job in the foreground, only to see it immediately stopped and restarted in the background. (See also http://bugs.debian.org/558763.)

Existem exemplos sobre como executá-lo em sua página man, como:

   Assuming you have started 'foo --bar' and you find out with  top(1)  or
   ps(1) that this process uses all your CPU time you can either

   # cpulimit -e foo -l 50
          limits  the CPU usage of the process by acting on the executable
          program file (note: the argument "--bar" is omitted)

   # cpulimit -p 1234 -l 50
          limits the CPU usage of the process by acting  on  its  PID,  as
          shown by ps(1)

   # cpulimit -P /usr/bin/foo -l 50
          same as -e but uses the absolute path name
por 18.02.2015 / 18:00
0

Você pode instalar o aplicativo "xkill" e atribuir "xkill" a algum atalho de teclado como Ctrl + shift + k e sempre que algum script ou programa falhar, basta pressionar crtl + shift + k e clicar no aplicativo que deseja matar . É isso

    
por 18.02.2015 / 17:07