Botão "Mate o maior processo"

14

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 muito lento e tende a congelar. Existe uma maneira de implementar um botão "matar o maior processo" que vai direto para o kernel no caso de eu notar o congelamento rápido o suficiente? Ou, por ser um computador, uma heurística para quando começar a congelar e filmar o maior processo em si também seria adequada.

Reactormonk
fonte
Você quer dizer o comando "matar o maior processo"?
perfil
O Linux tem isso. Chama-se assassino OOM. Mas você precisa ativar a confirmação de memória excessiva (e é ativada por padrão na maioria das distros).
Patrick
@Patrick overcommit_memoryé 0, overcommit_ratioé 50.
Reactormonk

Respostas:

12

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

O Linux possui um killer de OOM, que é chamado quando o sistema supercomprometiu sua memória e agora acabou.
Por padrão, o Linux realiza a sobrecompra de memória, o que basicamente significa que fornece aos programas mais memória do que o sistema realmente possui. Isso é feito com base no pressuposto de que os programas não usam realmente toda a memória solicitada. No entanto, quando o sistema fica sem memória, ele já diz aos vários processos em execução que eles têm memória, por isso não pode mais negá-lo. Em vez disso, o que ele faz é chamar o assassino do OOM. O OOM killer basicamente encontra um processo que o kernel acredita que irá aliviar a condição de falta de memória. Normalmente, este é apenas o processo que utiliza a maior quantidade de memória, mas o algoritmo é realmente muito mais complexo que isso.

Desde que você overcommit_memorydefiniu como 0(modo automático), o kernel está executando a confirmação de memória excessiva. Portanto, pelo seu comportamento explicado, parece que o sistema está apenas mudando bastante.

A partir daqui, existem 2 opções.

Reduzir swap

Seu sistema está ficando sem memória RAM e, portanto, o kernel começa a colocar as coisas em troca. Se o seu sistema ficar sem troca, ele chamará o assassino do OOM. No entanto, como você tem espaço de troca livre restante, isso não acontece.

Sua idéia 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 SysRq do kernel.

O kernel possui o que chama de "magic SysRq". Essa é uma funcionalidade que diz ao kernel para executar algum tipo de operação de emergência. Isso pode ser algo como "remontar todos os volumes somente leitura", "sincronizar todos os sistemas de arquivos" ou "reiniciar agora". Uma dessas opções também é invocar o assassino de OOM.

Se o seu kernel tiver o SysRq mágico ativado (opção do kernel CONFIG_MAGIC_SYSRQ), você poderá 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 do teclado, mas o fará programaticamente.

Você também pode desativar totalmente a troca, e é isso que faço na maioria dos meus sistemas, e por esse motivo exato. A troca é benéfica, pois o kernel trocará preventivamente dados que não estão sendo usados, permitindo que mais de sua memória RAM seja usada para armazenamento em cache. Mas isso leva a esse problema de troca forçada que você está vendo.

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

Patrick
fonte
Eu não sabia sobre OOM Killer. Eu estava pensando em um script que monitora continuamente o uso da memória usando topou pscomando e se excede determinado limite, interrompendo esse processo usando o killcomando
Ramsh
Eu não uso nenhuma troca.
Reactormonk
para ver qual processo foi morto pelo oom killer:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana
@Tass Oh, olhei completamente para o comentário "Decidi omitir a troca", desculpe :-(. Embora as informações de "matar manualmente um processo" ainda permaneçam. No entanto, você não deve sentir lentidão ao ficar sem memória. Você deve experimentar o kernel apenas matar coisas.
Patrick
@ Patrick que acontece, mas depois de ~ 30 minutos.
Reactormonk