Salut à tous,
Je suis bloqué avec un problème intermittent de pertes de connexion sur notre nœud de production de l’application Discourse et j’aurais besoin de conseils de la part d’administrateurs système ou d’experts en réseau noyau.
Lors des pics de trafic, Nginx commence à renvoyer des erreurs 502 Bad Gateway et les connexions interrompues se propagent en cascade aux services en amont. Au départ, j’ai supposé qu’il s’agissait d’une limite standard de pool Postgres/Redis, mais en vérifiant la pile réseau, cela pointe vers une épuisement des sockets et une saturation de la table conntrack.
Ce que j’ai vérifié
- Les limites sont portées à
65535danslimits.confet vérifiées pour les processus en cours d’exécution. - Les files d’attente Puma/Sidekiq sont normales, l’utilisation du CPU se situe autour de ~45 %.
- Les appels API sortants et les poignées de main utilisateurs entrantes restent en suspens de manière intermittente pendant 10 à 30 secondes.
Ci-dessous se trouve l’historique brut du terminal de ma session juste après le dernier pic, montrant ce que j’ai vérifié et les erreurs renvoyées :
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
Mes questions :
-
Quels sont les compromis mémoire recommandés pour passer
nf_conntrack_maxà1048576sur un nœud de 16 Go de RAM ? -
Même avec
tcp_tw_reuse = 2, nous obtenonsEAGAINlors des liaisons de ports locaux vers Postgres. Devrions-nous élargirip_local_port_rangeou activer les keep-alives HTTP en amont dans Nginx ? -
L’ajout de règles iptables brutes
NOTRACKpour le trafic interne loopback et VPC constituerait-il une correction permanente sûre, ou cela introduit-il des problèmes d’état cachés avec les réseaux conteneurisés ?
Tout conseil ou extrait de sysctl.conf éprouvé serait grandement apprécié !
Merci !