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
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.
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.
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.
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].)
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.