Grootmade@app-node - 11: 리소스를 일시적으로 사용할 수 없음

여러분 안녕하세요,

프로덕션 Discourse 앱 노드에서 간헐적으로 연결이 끊기는 문제를 겪고 있으며, 시스템 관리자나 커널 네트워킹 전문가분들의 조언이 필요합니다.

트래픽 급증 시 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를 사용 중인가요? 이것이 비표준 설치라고 말하는 것이 적절할까요?