Erros de falta de memória com plugin personalizado

Alguém poderia fornecer instruções para configurar a alocação de memória?

Dadas as mensagens esporádicas de kernel “out of memory”/dump, o aumento de 3x na troca (swap) e a resposta degradada crescente da aplicação, parece que nosso aplicativo às vezes está ficando sem memória. Nosso sistema atualmente possui 8 GB de memória e 2 GB de swap. Detalhes abaixo.

Revisei as instruções para adicionar mais memória física e swap em ("Cannot allocate memory" when upgrading), mas não consegui encontrar detalhes sobre como configurá-la.

No que diz respeito às configurações de memória, estamos usando todos os padrões. O sistema se recupera após alguns minutos, mas com o aumento do uso — achamos que é hora de nos educarmos sobre como melhorar o desempenho. No entanto, estou inseguro sobre onde e como configurar isso. Aumentar a memória alocada para a instância do Docker ou para o número de unicórnios Ruby (ou ambos)?

Sou um administrador de sistemas sem experiência em Ruby e com experiência limitada em Docker, então apontar-me na direção do arquivo de configuração e da sintaxe a ser usada ajudaria muito.

Discourse 2.6.0 beta2
Ruby 2.3.1-2~ubuntu16.04.14
Ubuntu 16.04

Quantos unicórnios você está executando? A configuração está no seu arquivo /var/discourse/containers/app.yml.

Olá Rafael - Na seção “env” do app.yml, vejo que estamos configurados para usar 4.

Você executou novamente o discourse-setup após aumentar sua RAM? Ele ajustará as configurações de memória de acordo. Você também pode ler os comentários no app.yml e ajustá-los.

Ter OoM com apenas 4 unicórnios é realmente estranho. Isso deveria usar cerca de 2 GB, deixando 6 GB para o PG e o Redis.

Você precisa investigar qual processo está consumindo toda a memória durante um evento de OoM; isso não é normal.

Olá, Rafael e equipe, meu nome é Serge e trabalho com o Sr. Happy Lee, que acabou de partir para as tão esperadas férias, então ficarei responsável por este problema.

Para complementar a descrição: o servidor foi originalmente configurado com 8 GB de RAM e 2 GB de swap. Não realizamos nenhuma atualização desde então.

No log do sistema, vejo evidências de que o Ruby é o processo que está consumindo toda a memória e causando a OoM (Out of Memory) do kernel:

Killed process 2960 (ruby) total-vm:10031472kB, anon-rss:7438148kB, file-rss:0kB

Como não sou especialista em Ruby, não tenho certeza de como identificar qual processo dentro do Ruby está consumindo tanta memória.

Qualquer sugestão será bem-vinda.

Obrigado.

  • Serge

Você está executando algum plugin nesta instalação do Discourse?

Nós executamos o plugin personalizado Scheduled Digest, mas ele também roda em nossas outras duas instalações, que não apresentam problemas.

Você pode linkar o repositório do código-fonte desse plugin aqui?

Olá, Rafael,

o plugin foi pago para desenvolvimento pela nossa organização, então, infelizmente, não tenho permissão para expor o código-fonte aqui. Além disso, como o plugin funciona em outras instâncias sem problemas, isso me leva a pensar em aumentar os recursos de memória do servidor para esta instância específica. A máquina é uma VM, então posso facilmente dobrar a quantidade de memória e ver se isso resolve o problema.

Ok, boa sorte!

Não há muito o que possamos fazer para depurar um código que não conseguimos ver do nosso lado. Você pode querer configurar o plugin Prometheus exporter para Discourse para acompanhar as métricas da sua instância.

As outras instâncias também estão executando a versão Ruby 2.3.1-2~ubuntu16.04.14?

Talvez não seja relevante, mas:

Então, isso foi claramente um bug do Ruby. Testamos em várias versões do Ruby e constatamos que apenas as versões 2.3.x e 2.4.x apresentavam o vazamento (aparentemente isso foi corrigido no Ruby 2.5.0****).

E o README do Discourse pede [Ruby 2.6+] :roll_eyes:

Obrigado! Farei uma atualização quando as coisas se acalmarem.

Olá Benjamin, as outras instâncias também estão executando Ruby 2.3.1-2~ubuntu16.04.14. Vou testar uma atualização para ver se não quebra nossa configuração do Docker.

A versão do Ruby não é relevante aqui.

Desde que você esteja usando nossa imagem oficial do Docker, você estará utilizando a versão suportada correta do Discourse.