OOM killer não funciona corretamente, leva a um SO congelado

23

Durante anos, o assassino de OOM do meu sistema operacional não funciona corretamente e leva a um sistema congelado.
Quando o uso da memória é muito alto, todo o sistema tende a "congelar" (de fato: se torna extremamente lento) por horas ou até dias , em vez de interromper processos para liberar a memória.
O máximo que gravei é de 7 dias antes de me demitir para operar uma redefinição.
Quando o OOM está prestes a ser alcançado, o iowait é muito, muito alto (~ 70%), antes de se tornar incomensurável.
A ferramenta: iotopmostrou que todos os programas estão lendo com uma taxa de transferência muito alta (por dezenas de MB / s) do meu disco rígido.
O que esses programas estão lendo?
- A hierarquia de diretórios?
- O próprio código executável?
Eu não exatamente agora.

[editado] Na época em que escrevi esta mensagem (em 2017), eu estava usando um ArchLinux atualizado (4.9.27-1-lts), mas já havia experimentado o problema há anos.
Eu experimentei o mesmo problema com várias distribuições Linux e configurações de hardware diferentes.
Atualmente (2019), estou usando uma atualização atualizada do Debian 9.6 (4.9.0). Tenho 16 GB de RAM física, um SSD no qual meu sistema operacional está instalado e nenhuma partição de swap .

Devido à quantidade de memória RAM que tenho, não quero habilitar uma partição de swap, pois isso atrasaria a aparição do problema.
Além disso, a troca de SSDs com muita frequência pode reduzir potencialmente a vida útil do disco.
A propósito, eu já tentei com e sem uma partição swap, provou atrasar apenas a aparição do problema, mas não sendo a solução.

Para mim, o problema é causado pelo fato de o Linux remover dados essenciais dos caches , o que leva a um sistema congelado porque ele precisa ler tudo, sempre, a partir do disco rígido.

Eu até me pergunto se o Linux não descartaria as páginas de códigos executáveis ​​dos programas em execução, o que explicaria por que os programas que normalmente não lêem muitos dados se comportam dessa maneira nessa situação.

Eu tentei várias coisas na esperança de corrigir esse problema.
Um deles foi definido /proc/sys/vm/min_free_kbytescomo 1000000(1 GB).
Como esse 1 GB deve permanecer livre, pensei que essa memória seria reservada pelo Linux para armazenar em cache dados importantes.
Mas não deu certo.

Além disso, acho útil acrescentar que mesmo que poderia soar grande na teoria, restringindo o tamanho da memória virtual para o tamanho da memória física, definindo /proc/sys/vm/overcommit_memorya 2não é decentemente tecnicamente possível na minha situação, porque o tipo de aplicações que eu uso, exigem mais memória virtual do que efetivamente usam por alguns motivos.
De acordo com o arquivo /proc/meminfo, o Commited_ASvalor geralmente é superior ao dobro da ram física no meu sistema (16 GB, Commited_AS geralmente é> 32 GB).

Eu experimentei esse problema com /proc/sys/vm/overcommit_memoryseu valor padrão:, 0e por um tempo eu o defini como:, 1porque eu preferia que os programas fossem mortos pelo assassino do OOM em vez de se comportarem incorretamente porque eles não verificam os valores de retorno de mallocquando o alocações são recusadas.

Quando eu estava falando sobre esse problema no IRC , conheci outros usuários do Linux que tiveram esse mesmo problema, então acho que muitos usuários estão preocupados com isso.
Para mim, isso não é aceitável, pois até o Windows lida melhor com o alto uso de memória.

Se você precisar de mais informações, tenha uma sugestão, por favor me diga.

Documentação:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/

Eles falam sobre isso:
Por que o assassino de falta de memória (OOM) do Linux não é executado automaticamente, mas funciona com a chave sysrq?
Por que o OOM-killer às vezes falha em matar porcos de recursos?
Pré-carregando o assassino do OOM
É possível acionar o OOM-killer em trocas forçadas?
Como evitar alta latência perto da situação da OOM?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843

M89
fonte
1
Eu acho que é isso que você deve esperar, se você está debatendo, mas não está realmente se aproximando de 100% "usado", ou seja, há muito uso de memória que é suportado por arquivos, contado como "buff / cache". (Ugh, esse fraseado assume que as alocações do tmpfs são triviais, pois são exibidas como "buff / cache", mas não podem ser paginadas para um sistema de arquivos físico). min_free_kbytesnão é relevante, não é uma reserva para páginas em cache. AFAICT nenhum dos sysctls vm permite reservar qualquer memória especificamente para páginas em cache, ou seja, limitando alocações MAP_ANONYMOUS :(.
sourcejedi
2
Há anos que estou procurando uma solução para esse problema exato, sem sucesso. Acredito que percebi o problema pela primeira vez depois de substituir meu HDD por um SSD, o que também me implicou em desativar totalmente a troca, mas não posso garantir que isso nunca tenha acontecido antes dessas alterações, portanto, isso pode não ter relação alguma. Estou no Archlinux.
Brunocodutra 08/08/19
2
Acabei de postar nos fóruns do Arch Linux sobre isso.
23618 Ignat Insarov
1
@ dsstorefile1 Obrigado, vou tentar isso. Mas como ele pode disparar o assassino do OOM com certeza quando o kernel nessa situação não pode fazê-lo corretamente?
M89
1
Ajudou quando o chrome conseguiu vazar por toda a minha RAM ... (Embora eu também tenha adicionado uma partição de troca de disco real e atualizado para uma quantidade decente de RAM)
Gert van den Berg -

Respostas:

5

Eu encontrei duas explicações (da mesma coisa) a respeito de porque kswapd0 faz leitura constante do disco acontece bem antes de OOM-killer mata o processo ofensivo:

  1. veja a resposta e o comentário desta resposta do askubuntu SE
  2. veja a resposta e os comentários de David Schwartz desta resposta no SE unix

Vou citar aqui o comentário do 1. que realmente abriu meus olhos sobre o motivo pelo qual eu estava lendo constantemente o disco enquanto tudo estava congelado :

Por exemplo, considere um caso em que você tenha zero swap e o sistema esteja quase sem memória RAM. O kernel retira memória, por exemplo, do Firefox (isso pode ser feito porque o Firefox está executando o código executável que foi carregado do disco - o código pode ser carregado do disco novamente, se necessário). Se o Firefox precisar acessar a RAM novamente N segundos depois, a CPU gerará "falha grave" que força o Linux a liberar alguma RAM (por exemplo, retira alguma RAM de outro processo), carrega os dados ausentes do disco e permite que o Firefox continue como de sempre. Isso é bastante semelhante à troca normal e o kswapd0 faz isso. - Mikko Rantalainen 15 de fev às 13:08

Se alguém tiver uma maneira de desativar esse comportamento (talvez recompilar o kernel com quais opções? ), Por favor me avise o mais rápido possível! Muito apreciado, obrigado!

ATUALIZAÇÃO: A única maneira que encontrei até agora é corrigir o kernel e funciona para mim com o swap desativado (ie. CONFIG_SWAP is not set), Mas não funciona para outros com o swap ativado, ao que parece ; veja o patch dentro desta pergunta.


fonte
Por favor, remova texto que não é válido. Não marque as edições com "EDIT" no texto. Eles são óbvios no histórico de revisões .
Kusalananda
1
@Kusalananda Este usuário deve ser incentivado, pois provavelmente é ele quem mais contribuiu.
M89
@Kusalananda Eu pensei que era importante mantê-los para que outros pudessem ver o que (mais) foi tentado e não funcionou. Talvez em UPDATEvez de EDITteria sido melhor?
@MarcusLinsner Não, desculpe, você entendeu errado. Mostrar o que você tentou é o que você faz quando faz uma pergunta. A resposta deve estar correta para a pergunta como ela é colocada atualmente. Quero dizer, uma edição até pede ao leitor para ignorar as edições anteriores . Se alguém estiver interessado em ver o histórico de edições, você pode vê-lo aqui .
Kusalananda
0

O memory.minparâmetro no cgroups-v2controlador de memória deve ajudar.

Ou seja, deixe-me citar:

Proteção de memória. Se o uso de memória de um cgroup estiver dentro de seu limite mínimo efetivo, a memória do cgroup não será recuperada sob nenhuma condição. Se não houver memória recuperável desprotegida disponível, o OOM killer será chamado.

Fonte: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

Vladimir Nikishkin
fonte
Você poderia elaborar por favor? Sua resposta fica um pouco aquém ao responder à pergunta do OP.
Paradox