'768 worker_connections が足りません' エラー

こんにちは!

本日再構築してから、多数のサーバーエラーが発生しています。どうやら nginx の接続問題のようです。nginx/error.log には、以下のような「768 worker_connections are not enough」というメッセージがバースト的に記録されていることがあります:

2021/06/02 10:42:21 [alert] 1143#1143: *28468 1768 worker_connections are not enough while connecting to upstream, client: (IP removed), server: _, request: "POST /message-bus/8fc08436f86f47479cf0dad3deb5c4dc/poll?dlp=t HTTP/1.1", upstream: "http://127.0.0.1:3000/message-bus/8fc08436f86f47479cf0dad3deb5c4dc/poll?dlp=t", host: "blenderartists.org", referrer: "https://blenderartists.org/t/convert-multiple-objects-to-single-mesh-with-vertex-grouping/489173/2"

この問題を解決する方法について、ご助言はありますでしょうか?CPU やメモリのリソースは十分にあります。「worker connections」の数を増やすことは可能でしょうか?

追記:一時的にワーカー接続数を増やしましたが、まだこれらのエラーが発生しています(頻度は減り、ワーカー数が多い場合に発生します)。最近何か変更があってこれが原因になっているのか、あるいはより効果的に原因を特定するにはどうすればよいのか、とても気になっています。

## ビルド後に実行するカスタムコマンド
run:
  - exec: echo "カスタムコマンドの開始"

  - replace:
      filename: "/etc/nginx/letsencrypt.conf"
      from: "worker_connections 768" 
      to: "worker_connections 1768"

リビルド後にこのようなことが起こったのは興味深いですね。最近、大量の処理を実行しましたか?Sidekiq のログを確認して、そこに大量のジョブが溜まっていないかも調べてみてください。

最近、サムネイルプレビュー TC への切り替えに伴い、いくつかのバulkアクションを実行しましたが、Sidekiq キューには何も残っておらず、その可能性は完全に排除できます。

2日前に nginx のバージョンをアップグレードしたので、引き続き注視してください。あなたのサイトには 500 人以上の同時接続者がいますか?

また、サイト全体が Cloudflare の背後にあるため、それによって状況が異なる可能性があります。

わかりませんね…あるかもしれません?確認する方法は何かありますか?

その通りです。ただし、加速機能は無効にしており、画像やアバターのキャッシュにのみ使用しています。今日まで問題になったことはありませんでした。

ハハ、通常はそんな情報は Google アナリティクスや同様のツールを使って把握します。Discourse のダッシュボードにも、1 日のページビュー数やユーザー訪問数が表示されており、これを使って同様の分析が可能です。

それは事実ではありません。あなたのサイト全体は Cloudflare 経由で提供されています:

curl -I https://blenderartists.org/                                                                                                                                         \nHTTP/2 200 \ncf-cache-status: DYNAMIC\ncf-request-id: 0a6ef945b3000002fe272b2000000001\nserver: cloudflare\ncf-ray: 6591c4b5ec5902fe-MIA\nalt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443"; ma=86400

ただし、これは全く無関係かもしれません。あなたの nginx は「downstream」接続ではなく「upstream」接続について警告しています。つまり、nginx と unicorn の間の接続が不足していることを意味します。

message_bus(ライブ更新サービス)のために、各訪問者に対して接続を維持しているため、サイトがある程度人気がある場合、これはある程度予想されることです。

worker_processesworker_connections を増やすのは安全であり、あなたのケースでは理にかなっていると思われます。デフォルトでは worker_processes は CPU コア数に設定されています。CPU コアはいくつありますか?

その通りですね :slight_smile: 以前はそれを使っていましたが、ずっと前にやめてしまいました。1 日あたり約 25 万ページビュー(ボット含む)あるので、500 は特別に不自然には思えません。ユーザー訪問数はログイン済みの訪問のみをトラッキングするんですよね?

その通りです。リクエストは CF を経由させざるを得ませんが、JavaScript などは CF に触れさせていません。

12 コア、64GB です。通常の負荷は約 2 で、RAM の 50% を使用しています。

えっ、それってすごく変ですね!

接続数の計算式は worker_processes * worker_connections で、12 * 768 になるはずです。つまり(クリック・クリック)9216になります。でも、ログには1768と出ていますね…

app.yml で以下を試してみてください:

## ビルド後に実行するカスタムコマンド
run:
  - exec: echo "カスタムコマンドの開始"

  - replace:
      filename: "/etc/nginx/nginx.conf"
      from: "worker_connections 768" 
      to: "worker_connections 2000"
  - replace:
      filename: "/etc/nginx/nginx.conf"
      from: "worker_processes auto" 
      to: "worker_processes 10"

注意点として、投稿2のブロックは間違ったファイルを対象にしています!

:facepalm: 間違ったコードを貼り付けてしまいました。最初は letsencrypt テンプレートを使おうとしたのですが、最終的に nginx.conf を 1768 のワーカー接続に変更してしまいました。

あなたの値を試してみます。結果を報告しに戻ってきます。

残念ながら、まだ同じエラーが発生しています:

2021/06/02 17:40:03 [alert] 2102#2102: *262491 2000 worker_connections は upstream への接続に不足しています。クライアント: <ip removed>、サーバー: _、リクエスト: "POST /message-bus/0e453fae0c604c29a876e6ede05b7341/poll?dlp=t HTTP/1.1"、upstream: "http://127.0.0.1:3000/message-bus/0e453fae0c604c29a876e6ede05b7341/poll?dlp=t"、ホスト: "blenderartists.org"、リファラー: "https://blenderartists.org/t/weight-paint-not-painting/551282"

worker_connections を 4000 に引き上げましたが、今のところ順調そうです :crossed_fingers:

上書きがより簡単になりました。

クール!では、app.yml/web_only.yml に次のようなことを記述するということでしょうか。

params:
  nginx_worker_connections: 4000

まさにその通りです。同じパッチでデフォルトを4kに引き上げたため、管理者はそれを引き上げる必要があるかどうかを慎重に評価する必要があるかもしれません。

他のサイトでは、ワーカープロセスのCPUを2倍に増やしていました。これも削除すべきでしょうか?