Configurar o limite de memória do ruby?

Seria possível torná-lo uma opção de configuração do site para definir quanto de memória pode ser usado? Atualmente, o ajuste está definido para 2G (Edição: ops, eu estava errado, veja abaixo) — anteriormente era 4G — e, no entanto, a configuração de hardware recomendada é 1G + swap. Parece-me que um nó de 1G poderia entrar em um frenesi de paginação se o uso do Ruby realmente chegasse a 2G.

De um log de atualização:

Migrando padrão
Semeadura padrão
*** Empacotando ativos. Isso levará um tempo ***
$ RUBY_GC_MALLOC_LIMIT_MAX=20971520 RUBY_GC_OLDMALLOC_LIMIT_MAX=20971520 RUBY_GC_HEAP_GROWTH_MAX_SLOTS=50000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9 bundle exec rake assets:precompile
Limpando arquivos temporários
Empacotando ativos
1 curtida

Não tenho certeza de quão relevantes são essas configurações no Ruby moderno, mas @sam saberia melhor.

1 curtida

Ehem, com licença, isso não é 2G, é 20M. Então, nada parecido com a situação que eu imaginei que fosse. (Edição: é pior! Veja abaixo)

1 curtida

Tente 20G. :wink: :slightly_smiling_face:

1 curtida

O Discourse tem um uso de memória previsível, então a configuração que você deseja é o número de workers do Unicorn.

Se você tiver um servidor de 1 GB, usaremos como padrão 2 workers, que devem operar bem com essa quantidade baixa de memória.

2 curtidas

De fato, ao rodar como um fórum. Mas isso não é isso!

Durante as atualizações, algumas tarefas especificam essas variáveis de ambiente para o Ruby.

1 curtida

Sim, durante as atualizações, definimos essas variáveis para que a atualização não falhe devido à pressão de memória em máquinas com especificações muito baixas.

2 curtidas

Certo, e minha observação é que os limites podem estar definidos muito altos para alguns casos, então estou me perguntando se é possível torná-los configuráveis.

2 curtidas

Testamos esse procedimento muitas vezes ao longo dos anos e podemos garantir que ele funcionará bem para comunidades pequenas que usam um VPS de 1 GB. Ele até encerra workers adicionais do Unicorn para liberar memória durante a atualização, ajudando no processo.

Você pode ler o código que veio deste commit:

Se você conseguir reproduzir a falha em uma instância Digital Ocean, ficaremos felizes em analisar.

Se isso for indispensável, você pode fazer um fork do plugin e ajustá-lo às suas necessidades.

4 curtidas

Obrigado, estou recebendo uma imagem agora. (Dois pontos muito importantes: essas configurações do GC são ajustadas especificamente para atualizações, e as unidades são bytes, então o limite está definido atualmente em 20 MB. Há detalhes úteis e interessantes nesta discussão anterior [link de arquivo porque não está disponível para mim agora].)

2 curtidas

Devemos desexcluir esse tópico, @sam? Ele tem valor histórico ou está obsoleto?

1 curtida

Certamente está desatualizado; a versão mais recente do Ruby possui vários limites de malloc. É um tópico interessante com algum valor histórico, mas precisaria de um grande aviso de “Desatualizado” no topo.

Nossa atualização já está operando no limite máximo; o máximo que podemos fazer além disso é reduzir a disponibilidade. Se a memória estiver extremamente restrita, você terá que aceitar interrupções ao realizar a atualização.

5 curtidas