Tenho algumas dúvidas sobre essa opção. Para esclarecer: essa opção está comentada por padrão no app.yml e pode melhorar o desempenho da ordenação, mas aumenta o uso de memória por conexão. Mas o que isso significa exatamente? Depende de quantas conexões? O que é db_work_mem? Ele também é definido automaticamente ao instalar o Discourse, assim como db_shared_buffers e UNICORN_WORKERS? É algo seguro habilitar ou é avançado?
No momento, ela aparece assim: #db_work_mem: "40MB"
O servidor é: Vultr High Frequency Compute 2 vCore, 4096 MB
Obrigado, Jay! Na verdade, só estou interessado nisso. Estou apenas procurando maneiras de melhorar o desempenho do fórum, mas se isso pode causar problemas, talvez seja melhor deixar comentado.
Então, se eu ativá-lo, há uma boa chance de esgotar a memória se o ajuste não estiver correto ou se o tráfego aumentar? Se entendi corretamente.
work_mem ( integer )
Define a quantidade máxima base de memória a ser usada por uma operação de consulta (como uma ordenação ou tabela hash) antes de escrever em arquivos temporários no disco. Se esse valor for especificado sem unidades, ele será considerado em quilobytes. O valor padrão é quatro megabytes ( 4MB ). Note que, para uma consulta complexa, várias operações de ordenação ou hash podem estar executando em paralelo; cada operação geralmente terá permissão para usar tanta memória quanto especificado por esse valor antes de começar a escrever dados em arquivos temporários. Além disso, várias sessões em execução podem estar realizando tais operações simultaneamente. Portanto, a memória total usada pode ser várias vezes o valor de work_mem; é necessário ter isso em mente ao escolher o valor. Operações de ordenação são usadas para ORDER BY, DISTINCT e joins por mesclagem. Tabelas hash são usadas em joins por hash, agregação baseada em hash e processamento baseado em hash de subconsultas IN.
Operações baseadas em hash são geralmente mais sensíveis à disponibilidade de memória do que operações equivalentes baseadas em ordenação. A memória disponível para tabelas hash é calculada multiplicando work_mem por hash_mem_multiplier. Isso permite que operações baseadas em hash usem uma quantidade de memória que excede o valor base usual de work_mem.
Às vezes, ajuda aumentar a memória de trabalho para o dobro do padrão comentado. Acredito que isso ajude em sites grandes com índices grandes, mas, na maioria das vezes, não tenho certeza. Já quebrei um site ao empurrá-lo para níveis muito altos.
Se quiser brincar com o ajuste fino, pode conferir o plugin Prometheus e criar gráficos bonitos com o Grafana.
Por padrão, ele está configurado para 100 conexões.
RAM total * 0,25 / max_connections
Tenho 4096MB * 0,25 / 100 = ~10MB
No template postgres.template.yml, o valor padrão de db_work_mem: "10MB" é calculado com base nessa fórmula, creio eu. Acho que esses 10MB são o máximo atualmente. Obrigado, Jay