Grootmade@app-node - 11: リソースは一時的に利用できません

皆さん、こんにちは。

本番環境のDiscourseアプリノードで、断続的に接続が切れる問題に直面しており、Sysadminやカーネルのネットワークに関する専門家のアドバイスが必要になっています。

トラフィックが急増する際、Nginxが 502 Bad Gateway を返し始め、切断された接続がアップストリームサービス全体に連鎖的に波及しています。最初はPostgres/Redisのプール制限が原因かと思いましたが、ネットワークスタックを確認したところ、ソケットの枯渇とconntrackテーブルの飽和が示唆されています。

確認済みの事項

  • limits.conf で制限値が 65535 に引き上げられており、実行中のプロセスでも確認済みです。
  • Puma/Sidekiqのキューは正常で、CPU使用率は約45%前後です。
  • 送信API呼び出しと受信ユーザーハンドシェイクが、断続的に10〜30秒間ハングしています。

以下は、最後のスパイク直後のセッションの生きたターミナル履歴です。確認した内容と発生したエラーを示しています。

grootmade@app-node-01:~$ netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
      4 LAST_ACK
     12 LISTEN
     48 FIN_WAIT2
    312 ESTABLISHED
   8940 TIME_WAIT

grootmade@app-node-01:~$ sysctl net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_reuse = 2

grootmade@app-node-01:~$ sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_count = 262140
net.netfilter.nf_conntrack_max = 262144

grootmade@app-node-01:~$ dmesg -T | grep -i conntrack | tail -n 5
[Sun Aug 23 14:10:02 2026] nf_conntrack: nf_conntrack: table full, dropping packet
[Sun Aug 23 14:10:05 2026] nf_conntrack: nf_conntrack: table full, dropping packet
[Sun Aug 23 14:10:12 2026] nf_conntrack: nf_conntrack: table full, dropping packet

grootmade@app-node-01:~$ sudo ss -s
Total: 9648
TCP:   9410 (estab 312, closed 8940, orphaned 0, timewait 8940)

grootmade@app-node-01:~$ cat /proc/sys/net/ipv4/ip_local_port_range
32768	60999

grootmade@app-node-01:~$ ulimit -n
65535

grootmade@app-node-01:~$ cat /proc/sys/fs/file-nr
4128	0	65535

grootmade@app-node-01:~$ sudo iptables -L -n -v | grep -i DROP
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

grootmade@app-node-01:~$ sudo strace -p 1842 -e trace=connect,bind 2>&1 | head -n 10
connect(14, {sa_family=AF_INET, sin_port=htons(5432), sin_addr=inet_addr("10.0.1.25")}, 16) = -1 EAGAIN (Resource temporarily unavailable)

grootmade@app-node-01:~$ cat /etc/security/limits.d/discourse.conf
discourse soft nofile 65535
discourse hard nofile 65535

grootmade@app-node-01:~$ tail -n 20 /var/log/nginx/error.log | grep "failed"
2026/08/23 14:10:15 [crit] 1842#1842: *49102 connect() to 10.0.1.25:5432 failed (11: Resource temporarily unavailable)

grootmade@app-node-01:~$ history | tail -n 13

質問事項:

  1. 16GB RAMのノードで nf_conntrack_max1048576 にスケーリングする場合、推奨されるメモリ上のトレードオフはどのようなものですか?

  2. tcp_tw_reuse = 2 に設定しているにもかかわらず、Postgresへのローカルポートバインドで EAGAIN が発生しています。ip_local_port_range を拡張すべきか、それともNginxのアップストリームでHTTP keep-aliveを有効にするべきでしょうか?

  3. 内部ループバックやVPCトラフィックに対して NOTRACK raw iptablesルールを追加することは、安全な恒久的な解決策になるのでしょうか?それとも、コンテナネットワークにおいて隠れた状態管理の問題を引き起こすのでしょうか?

アドバイスや、実戦で検証済みの sysctl.conf スニペットは、大変助かります!

よろしくお願いします!

最新のDiscourseではPumaを実行していません。どのバージョンのDiscourseを実行していますか?これは標準的なインストールではありませんか?