Sem memória ao reconstruir com 4GB de swap?

Tive várias inicializações de dois contêineres falhando hoje com erros como

 ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL  Comando foi encerrado com SIGKILL (Terminação forçada): ember build -prod"]

Acho que funcionou na próxima vez depois que adicionei swap. Mas isso tem 4GB de swap:

# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       1.1Gi       391Mi        45Mi       661Mi       830Mi
Swap:          4.0Gi       3.1Gi       911Mi

e ainda está falhando. E se eu parar o contêiner antes da inicialização, ele é bem-sucedido.

1 curtida

A compilação está buscando/usando ativos pré-compilados? Ou você desativou isso? (ou aplicou um patch no núcleo de modo que os ativos pré-compilados não possam ser usados)

2 curtidas

Você tem muita memória swap, mas uma grande parte já está em uso. Como uma configuração de dois contêineres tem menos tempo de inatividade, talvez seja verdade que a invocação atual do servidor ainda esteja em execução e tenha acumulado muito uso de memória, talvez devido a um vazamento.

Talvez uma reinicialização ajude, antes da atualização. Talvez meça o uso da swap antes e depois da reinicialização.

3 curtidas

Estou com algum tipo de vazamento/expansão de memória em um dos meus servidores. Por sugestão sensata de @RGJ, agendei um reboot via cron toda segunda-feira de manhã (Horário da Europa Ocidental) a cada 7 dias.

(Acreditamos saber qual plugin está com o problema, mas não investi tempo para descobrir por que há um vazamento/expansão de memória)

2 curtidas

Isto parece ser um OOM kill (falha por falta de memória): Estou com cerca de 2 GiB de RAM e em reconstruções de dois contêineres, o aplicativo antigo + a nova compilação se sobrepõem, excedendo a memória. A swap já está com cerca de 3 GiB usados antes da inicialização, então o pico da compilação do Ember recebe um SIGKILL. Parar o contêiner em execução (ou fazer uma reconstrução de um contêiner) evita a sobreposição e é bem-sucedido. O próximo passo é confirmar via dmesg e então reiniciar antes das reconstruções / investigar o que está aumentando a swap com o tempo / adicionar RAM (a swap sozinha não parece salvá-la quando já está muito utilizada).

1 curtida

Isto parece menos um problema do pnpm ou do Ember e mais com o host simplesmente ficando sem memória.

O detalhe chave é o SIGKILL. Isso geralmente significa que o sistema operacional interveio e encerrou o processo (muitas vezes via OOM killer), e não que o ember build -prod falhou por conta própria.

Em hosts pequenos, as compilações de produção do Ember podem facilmente atingir picos de alguns GB de RAM. Mesmo com a memória de troca (swap) ativada, uma vez que a memória de troca esteja quase totalmente usada, o kernel ainda pode decidir encerrar um processo node que consome muita memória.

Algumas coisas que apontam nessa direção:

  • A memória de troca já está sendo muito utilizada quando a falha ocorre.
  • A falha é muito mais provável quando outro contêiner está sendo executado ao mesmo tempo.
  • Se eu parar o outro contêiner antes de executar o bootstrap, a mesma compilação é bem-sucedida.

Portanto, a memória de troca ajuda um pouco, mas principalmente apenas adia o problema. Parar outros contêineres reduz a pressão de memória o suficiente para a compilação terminar.

O que ajudou / pode ajudar:

  • Evitar executar vários bootstraps ou compilações de ativos em paralelo.
  • Parar outros contêineres durante o ember build -prod.
  • Limitar o uso de memória do Node (por exemplo, NODE_OPTIONS=--max_old_space_size=1024) para reduzir o uso de pico.
  • Se possível, aumentar a RAM do host (4GB+) torna isso muito mais confiável.

Espero que isso ajude a explicar por que parece um pouco aleatório e por que parar outro contêiner faz funcionar.

2 curtidas

Parece que mais swap ajudaria. Não faria mal. Em vez de olhar para o swap total e dizer que parece muito, olhe para o swap livre e certifique-se de ter margem para uma reconstrução.

2 curtidas

Verifique também se você ativou o overcommit.

Parece uma boa ideia! Você reinicia o servidor ou apenas o contêiner?

De qualquer forma, aconteceu novamente em outro servidor de 2GB+3GB. Então eu reiniciei o web_only e tentei novamente e funcionou perfeitamente. Acho que vou adicionar à minha ferramenta o reinício do web_only, talvez se a memória estiver em alguma definição de “baixa”.

Obrigado a todos pelas ideias!

1 curtida

O servidor inteiro :sweat_smile:

2 curtidas

Não é Windows, pelo amor de Deus. :rofl:

2 curtidas

Ah, eu me lembro daqueles dias! :grimacing:

2 curtidas

Vimos um caso em que reiniciar o Linux ajudou. Eu sei que normalmente não é assim que gostamos de ver o Linux, mas ainda existe a possibilidade de fragmentação e a possibilidade de vazamentos de memória.

2 curtidas