Grootmade@app-node - 11 : Ressource temporairement indisponible

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 à 65535 dans limits.conf et 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 :

  1. Quels sont les compromis mémoire recommandés pour passer nf_conntrack_max à 1048576 sur un nœud de 16 Go de RAM ?

  2. Même avec tcp_tw_reuse = 2, nous obtenons EAGAIN lors des liaisons de ports locaux vers Postgres. Devrions-nous élargir ip_local_port_range ou activer les keep-alives HTTP en amont dans Nginx ?

  3. L’ajout de règles iptables brutes NOTRACK pour 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 !

La version moderne de Discourse n’utilise pas Puma. Quelle version de Discourse utilisez-vous ? S’agit-il d’une installation non standard ?