Сбой Discourse из-за проблемы с подключением к PSQL

Мы постоянно получали это сообщение на нашем форуме (примерно каждые 3–4 часа). У нас 16 ядер процессора и 32 ГБ оперативной памяти. Я не думаю, что проблема в ресурсах.

Ой
Программное обеспечение, управляющее этим форумом, столкнулось с неожиданной проблемой. Приносим извинения за неудобства.

Подробная информация об ошибке была записана в лог, и было сгенерировано автоматическое уведомление. Мы разберёмся в этом.

Дальнейших действий не требуется. Однако, если ошибка сохраняется, вы можете предоставить дополнительные сведения, включая шаги для воспроизведения ошибки, создав тему в категории обратной связи на сайте.

В логе продакшена показано:


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/content_security_policy/middleware.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'
Unexpected error in Message Bus : ActiveRecord::ConnectionNotEstablished : connection to server at "172.17.0.2", port 5432 failed: FATAL:  remaining connection slots are reserved for non-replication superuser connections

Unexpected error in Message Bus : ActiveRecord::ConnectionNotEstablished : connection to server at "172.17.0.2", port 5432 failed: FATAL:  remaining connection slots are reserved for non-replication superuser connections

Unexpected error in Message Bus : ActiveRecord::ConnectionNotEstablished : connection to server at "172.17.0.2", port 5432 failed: FATAL:  remaining connection slots are reserved for non-replication superuser connections

Unexpected error in Message Bus : ActiveRecord::ConnectionNotEstablished : connection to server at "172.17.0.2", port 5432 failed: FATAL:  remaining connection slots are reserved for non-replication superuser connections

Мы установили следующие настройки конфигурации:

UNICORN_WORKERS: 32
UNICORN_SIDEKIQS: 2

и для PostgreSQL:

db_shared_buffers: "4096MB"

Пожалуйста, подскажите, что ещё можно сделать, чтобы оптимизировать конфигурацию и убедиться, что сервер не будет падать.

Я бы выделил PostgreSQL (db_shared_buffers) как минимум 16 ГБ, а лучше 20.

Но вам нужно увеличить количество соединений к БД. Точно не помню, как это сделать.

Думаю, нужно изменить параметр max_connections в файле /etc/postgresql/postgresql.conf (внутри контейнера, где запущен PostgreSQL).

Я тоже так думаю. :+1:

Вы уверены? Это кажется слишком много. Посмотрите: PostgreSQL: Documentation: 13: 19.4. Resource Consumption

Если у вас выделенный сервер базы данных с 1 ГБ или более оперативной памяти, разумным начальным значением для shared_buffers будет 25% от объема памяти вашей системы. Существуют рабочие нагрузки, при которых даже более высокие значения shared_buffers оказываются эффективными, но поскольку PostgreSQL также использует кэш операционной системы, маловероятно, что выделение более 40% оперативной памяти под shared_buffers даст лучший результат, чем меньший объем

К тому же это не выделенный сервер базы данных; на нём также запущено 32 процесса unicorn.

В таких вопросах я всегда полагаюсь на тебя, и мне казалось, что я цитирую совет, который ты давал раньше, поэтому, НЕТ, я не уверен. :rofl:

Довольно очевидно, что проблема в соединениях, и увеличение ОЗУ до 25% от 32 ГБ в целом может помочь, но это не причина ошибки.

РЕДАКТИРОВАНИЕ:

Ха! Именно это я и запомнил, хотя, похоже, я собирался превысить 50%…

Я признаю себя отчасти виновным.

Но это было тогда… :wink:

:100:

Почему? Именно это является причиной исчерпания слотов соединений.

Мне кажется, я где-то видел, что UNICORN WORKER должно быть равно 2 * CPU. Поэтому я посчитал и получил 32. Стоит ли мне уменьшить масштаб?

Мы попытались изменить настройку тайм-аута для PSQL, выполнив команду ALTER ROLE discourse SET statement_timeout = '30000';. Этот запрос блокируется примерно каждые несколько часов.


Не уверены, есть ли у вас или у кого-либо ещё идеи, что могло произойти?

Нет, пожалуйста, удалите это и оставьте значения по умолчанию. Это классический случай преждевременной оптимизации.

Да, вы трогали то, что трогать не следовало :wink: