Erro Heroku R14 (quota de memória excedida) usando node.js

7

Tenho observado que nosso aplicativo de nó fica sem memória depois de um dia ou mais. A memória é consumida por um trabalho que é executado a cada minuto ou mais, porque isso é praticamente a única coisa acontecendo agora. Quando eu executo o aplicativo localmente na minha máquina, posso ver o aplicativo atingindo o limite máximo da memória e, em seguida, a coleta de lixo entra.

No heroku, parece ir além do limite de memória da nossa instância 1G RAM e o GC não está funcionando. Eu me pergunto se isso é porque o nó está configurado com um limite de memória maior que o Dyno real.

Reconfiguração: O limite de memória node.js no herkou está limitado ao limite de memória do Dyno?

    
por Stan Wiechers 16.08.2015 / 17:30

1 resposta

6

Aqui está a resposta do heroku. Parece que você precisa fazer alterações na configuração e não pode usar a configuração da caixa de seleção.

Oi Stan,

Obrigado por ligar a esses documentos; Preciso atualizar esse exemplo de terminal, já que silenciei recentemente a saída WEB_CONCURRENCY conversada. Adicionamos o registro quando adicionamos o recurso em grande parte para que as pessoas não fiquem surpresas com essas novas variáveis que invadem seu ambiente.

Para ver os valores do seu aplicativo, você pode executar:

$ heroku run 'echo $ WEB_MEMORY, $ WEB_CONCURRENCY' No entanto, deixe-me ser claro - esses valores existem apenas para determinar quantos processos simultâneos devem ser executados por um aplicativo de nó em cluster e, mesmo assim, somente se você optar por usar o valor WEB_CONCURRENCY em seu código. Eles não afetam, de forma alguma, o binário do nó ou suas alocações de memória padrão ou coleta de lixo, que são totalmente padrão, versões baixadas baixadas de nodejs.org/dist:

link O V8 usa uma abordagem ávida e preguiçosa para a coleta de lixo. Além disso, o V8 assume por padrão que você tem cerca de 1,5 GB para trabalhar com (mais do que o limite de 1 GB de um dinamômetro 2X). Você tem algumas opções se estiver interessado em mudar o comportamento de memória padrão do nó:

  • Acione manualmente o GC sempre que a memória exceder um limite definido ( link )

  • Defina max_old_space_size como menor que o padrão (por exemplo, node --max_old_space_size = 960). Várias métricas na fonte da v8 estão vinculadas a max_old_space_size, então isso pode tornar o gc um pouco mais agressivo. A desvantagem é que, se você exceder o valor até mesmo por um byte, seu programa falhará.

  • Defina gc_global como true para forçar a coleta sempre global (false por padrão - lembre-se de que a coleção global é mais lenta que a coleção multi-phase padrão).

  • Defina nolazy_sweeping como true, o que também torna o gc um pouco mais agressivo.

Lembre-se de que, se você exceder 1 GB de memória em um único processo de nó, a prática recomendada é dividir esse processo em vários funcionários:

link Felicidades, Caçador

    
por 18.08.2015 / 17:19