Botão “Matar o maior processo”

9

Este laptop tem um SSD e, portanto, decidi omitir a troca. Isso funciona bem na maioria dos casos, mas às vezes a RAM fica um pouco curta e o computador fica realmente lento e tende a congelar. Existe uma maneira de implementar um botão "matar o maior processo" que vai direto para o kernel caso eu note o congelamento rápido o suficiente? Ou, porque é um computador, uma heurística para quando ele começa a congelar e filmar o maior processo em si também seria bom.

    
por Reactormonk 30.04.2014 / 05:04

1 resposta

9

Do seu comentário, parece que o sistema está apenas trocando.

O Linux possui um killer OOM, que é invocado quando o sistema supercomprometeu sua memória, e agora se esgotou. O Linux, por padrão, executa o overcommit de memória, o que basicamente significa que ele fornece mais memória aos programas do que o sistema realmente possui. Ele faz isso assumindo que os programas não usarão toda a memória que eles pedem. No entanto, quando o sistema fica sem memória, ele já disse aos vários processos em execução que eles têm a memória, portanto, não pode mais negá-lo. Em vez disso, o que ele faz é invocar o assassino da OOM. O assassino de OOM basicamente encontra um processo que o kernel pensa aliviará a condição de falta de memória. Normalmente, esse é apenas o processo que usa a maior quantidade de memória, mas o algoritmo é na verdade muito mais complexo do que isso.

Como você tem overcommit_memory definido como 0 (modo automático), o kernel está executando a supercomprometimento de memória. Então, a partir do seu comportamento explicado, parece que o sistema está apenas trocando muito.

A partir daqui existem 2 opções.

Reduzir swap

Seu sistema está ficando sem RAM, e assim o kernel começa a empurrar coisas para swap. Se o seu sistema ficar sem swap, ele invoca o killer da OOM. No entanto, como você tem espaço de troca livre restante, isso não acontece.

Sua ideia original, mate manualmente um processo.

Você pode matar manualmente um processo quando achar que o sistema está trocando demais e algo precisa morrer. Isso pode ser feito através dos gatilhos do kernel SysRq.

O kernel tem o que chama de "SysRq mágica". Esta é uma funcionalidade que diz ao kernel para executar algum tipo de operação de emergência. Isso pode ser coisas como "remontar todos os volumes somente leitura", "sincronizar todos os sistemas de arquivos" ou "reinicializar agora". Uma dessas opções é também invocar o killer da OOM.

Se o seu kernel tiver a mágica SysRq ativada (opção de kernel CONFIG_MAGIC_SYSRQ ), você pode fazer isso de duas maneiras.

  1. Alt + SysRq + f
    Basta pressionar estas 3 teclas no teclado.
  2. echo f > /proc/sysrq-trigger
    Isso executará exatamente a mesma tarefa que o método de teclado, mas o faz de forma programática.

Você também pode desabilitar o swap totalmente, e é isso que eu faço na maioria dos meus sistemas, e por esse motivo exato. O swap é benéfico, pois o kernel irá trocar preventivamente os dados que não estão sendo usados, permitindo que mais do seu RAM seja usado para o cache. Mas isso leva a esse problema de troca forçada que você está vendo.

Eu pessoalmente acho que a melhor solução é algum tipo de opção de kernel para invocar OOM killer em troca forçada. Basicamente, deixe o swap preemptivo funcionar, mas se o kernel for forçado a mover algo para o swap porque você está sem memória RAM, invoque o killer da OOM. Infelizmente este é apenas o meu desejo pessoal. Não faz isso.

    
por 30.04.2014 / 06:51

Tags