Falha no Discourse devido a problema de conexão com PSQL

Recebemos repetidamente esta mensagem em nosso fórum. (a cada 3-4 horas). Temos 16 núcleos de CPU e 32 GB de RAM. Não acho que os recursos sejam um problema.

Oops
O software que alimenta este fórum de discussão encontrou um problema inesperado. Pedimos desculpas pelo inconveniente.

Informações detalhadas sobre o erro foram registradas e uma notificação automática gerada. Vamos dar uma olhada.

Nenhuma ação adicional é necessária. No entanto, se a condição de erro persistir, você pode fornecer detalhes adicionais, incluindo etapas para reproduzir o erro, postando um tópico de discussão na categoria de feedback do site.

O log de produção mostra


app/models/user_auth_token.rb:125:in `lookup'
lib/auth/default_current_user_provider.rb:131:in `current_user'
lib/current_user.rb:35:in `current_user'
app/controllers/application_controller.rb:1047:in `rate_limit_crawlers'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
lib/middleware/anonymous_cache.rb:393:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-silence_logger.rb:27:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:236:in `call'
Erro inesperado no Message Bus : ActiveRecord::ConnectionNotEstablished : falha na conexão com o servidor em "172.17.0.2", porta 5432: FATAL:  os slots de conexão restantes são reservados para conexões superusuárias não de replicação

Erro inesperado no Message Bus : ActiveRecord::ConnectionNotEstablished : falha na conexão com o servidor em "172.17.0.2", porta 5432: FATAL:  os slots de conexão restantes são reservados para conexões superusuárias não de replicação

Erro inesperado no Message Bus : ActiveRecord::ConnectionNotEstablished : falha na conexão com o servidor em "172.17.0.2", porta 5432: FATAL:  os slots de conexão restantes são reservados para conexões superusuárias não de replicação

Erro inesperado no Message Bus : ActiveRecord::ConnectionNotEstablished : falha na conexão com o servidor em "172.17.0.2", porta 5432: FATAL:  os slots de conexão restantes são reservados para conexões superusuárias não de replicação

Configuramos o seguinte em

UNICORN_WORKERS: 32
UNICORN_SIDEKIQS: 2

e para psql

db_shared_buffers: "4096MB"

Por favor, me diga o que mais posso fazer para melhorar a configuração e garantir que o servidor não falhe.

Eu daria ao postgres (db_shared_buffers) pelo menos 16 GB, senão 20 GB.

Mas você precisa fazer mais conexões ao banco de dados. Não me lembro exatamente como fazer isso.

Acho que é max_connections em /etc/postgresql/postgresql.conf (dentro do contêiner que está executando o postgres) que você precisa alterar.

1 curtida

Eu também acho. :+1:

Você tem certeza? Isso parece muito. Veja PostgreSQL: Documentation: 13: 19.4. Resource Consumption

Se você tiver um servidor de banco de dados dedicado com 1 GB ou mais de RAM, um valor inicial razoável para shared_buffers é 25% da memória do seu sistema. Existem algumas cargas de trabalho onde configurações ainda maiores para shared_buffers são eficazes, mas como o PostgreSQL também depende do cache do sistema operacional, é improvável que uma alocação de mais de 40% da RAM para shared_buffers funcione melhor do que uma quantidade menor.

E este não é um servidor de banco de dados dedicado, há 32 processos unicorn nele também.

Sempre confio em você em assuntos como este, e pensei que estava citando um conselho que você deu no passado, então, NÃO, não tenho certeza. :rofl:

Está bem claro que a conexão é o problema e aumentar a RAM para 25% de 32 GB pode ajudar em geral, mas não é a causa do erro.

EDIT:

Ha! É exatamente isso que eu lembrava, exceto que parece que eu ia ultrapassar 50%. . .

1 curtida

Eu me declaro mais ou menos culpado

Mas isso foi antes… :wink:

:100:

2 curtidas

Por quê? Essas são as causas de você ficar sem slots de conexão.

1 curtida

Acredito ter visto em algum lugar que UNICORN WORKER deveria ser 2 * CPU. Então fiz as contas e deu 32. Devo reduzir a escala?

Tentamos alterar a configuração de tempo limite para o PSQL executando ALTER ROLE discourse SET statement_timeout = '30000';. E esta consulta é a que ficou bloqueada, uma vez a cada poucas horas.


Não sei se você ou mais alguém tem alguma ideia do que aconteceu?

Não, por favor, remova isso e deixe os valores padrão serem aplicados. Este é o caso clássico de otimização prematura.

2 curtidas

Sim, você mexeu em coisas que não deveria :wink:

1 curtida

9 posts foram divididos em um novo tópico: Recomendação para número de workers: cores × 2?