DiscourseがPSQL接続問題によりクラッシュ

フォーラムでこのメッセージが(3〜4時間ごとに)表示され続けています。CPUは16コア、RAMは32GBあります。リソースに問題があるとは思えません。

おっと
このディスカッションフォーラムを支えるソフトウェアで予期せぬ問題が発生しました。ご不便をおかけして申し訳ありません。

エラーに関する詳細情報は記録され、自動通知が生成されました。確認いたします。

追加のアクションは必要ありません。ただし、エラー状態が続く場合は、エラーを再現する手順を含め、追加の詳細をサイトのフィードバックカテゴリにディスカッションのトピックを投稿することで提供できます。

本番ログには以下が表示されます。


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/content_security_policy.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'
Message Bus で予期しないエラー: ActiveRecord::ConnectionNotEstablished: サーバー \"172.17.0.2\"、ポート 5432 への接続に失敗しました: FATAL:  残りの接続スロットは、非レプリケーションのスーパーユーザー接続用に予約されています。

Message Bus で予期しないエラー: ActiveRecord::ConnectionNotEstablished: サーバー \"172.17.0.2\"、ポート 5432 への接続に失敗しました: FATAL:  残りの接続スロットは、非レプリケーションのスーパーユーザー接続用に予約されています。

Message Bus で予期しないエラー: ActiveRecord::ConnectionNotEstablished: サーバー \"172.17.0.2\"、ポート 5432 への接続に失敗しました: FATAL:  残りの接続スロットは、非レプリケーションのスーパーユーザー接続用に予約されています。

Message Bus で予期しないエラー: ActiveRecord::ConnectionNotEstablished: サーバー \"172.17.0.2\"、ポート 5432 への接続に失敗しました: FATAL:  残りの接続スロットは、非レプリケーションのスーパーユーザー接続用に予約されています。

以下のように設定しました。

UNICORN_WORKERS: 32
UNICORN_SIDEKIQS: 2

psqlについては

db_shared_buffers: "4096MB"

設定を改善し、サーバーがクラッシュしないようにするために、他に何ができるか教えてください。

Postgres (db_shared_buffers) には、少なくとも 16GB、できれば 20GB を割り当てることをお勧めします。

ただし、DB 接続をさらに増やす必要があります。その方法を正確には覚えていません。

変更する必要があるのは、max_connections で、/etc/postgresql/postgresql.conf (Postgres を実行しているコンテナ内) にあると思います。

「いいね!」 1

私もそう思います。:+1:

本当ですか?それは多すぎるように思いますが。PostgreSQL: Documentation: 13: 19.4. Resource Consumption を参照してください。

RAM が 1GB 以上の専用データベースサーバーがある場合、shared_buffers の妥当な初期値はシステムメモリの 25% です。shared_buffers の設定値をさらに大きくしても効果があるワークロードもいくつかありますが、PostgreSQL はオペレーティングシステムのキャッシュにも依存しているため、shared_buffers に RAM の 40% 以上を割り当てても、それより少ない量よりも効果的である可能性は低いです。

そして、これは専用のデータベースサーバーではなく、32 個のユニコーンプロセスも稼働しています。

このような件については、いつもあなたに頼りにしています。過去にあなたが与えたアドバイスを引用していると思ったので、いいえ、確信はありません。:rofl:

接続に問題があることは明らかであり、RAMを32GBの25%に増やすことは一般的に役立つかもしれませんが、エラーの原因ではありません。

編集:

ハッ!まさにその通りでした。50%を超えるつもりだったようです。

「いいね!」 1

半分は認めます

しかし、それは過去の話です… :wink:

:100:

「いいね!」 2

なぜですか?それらが接続スロットが不足する原因です。

「いいね!」 1

どこかで UNICORN WORKER2 * CPU にすべきだと読んだと思います。それで計算した結果、32になりました。スケールダウンすべきでしょうか?

PSQL のタイムアウト設定を ALTER ROLE discourse SET statement_timeout = '30000'; で変更しようとしました。そして、このクエリが数時間に一度ブロックされるようになりました。


何が起こったのか、あなたや他の誰か、何かアイデアはありますか?

いいえ、これは削除して、デフォルト値を使用してください。これは早すぎる最適化の典型的な例です。

「いいね!」 2

触ってはいけないものを触りましたね :wink:

「いいね!」 1

9件の投稿が新しいトピックに分割されました: 推奨されるワーカー数: コア × 2?