مرحباً بالجميع،
أواجه صعوبة في حل مشكلة متقطعة في انقطاع الاتصالات على عقدة تطبيق Discourse الخاصة بنا في بيئة الإنتاج، وأحتاج إلى بعض النصائح من مسؤولي الأنظمة أو خبراء شبكات النواة.
أثناء فترات ذروة حركة المرور، يبدأ Nginx في إرجاع 502 Bad Gateway، وتتسلسل الاتصالات المنقطعة عبر الخدمات العلوية (upstream services). في البداية، افترضت أن الأمر يتعلق بحدود مجمّع (pool) قياسي لـ Postgres/Redis، لكن فحص طبقة الشبكة يشير إلى استنفاد الجوارب (socket exhaustion) وتشبع جدول conntrack.
ما تم التحقق منه
- تم رفع الحدود إلى
65535فيlimits.confوتم التحقق منها للعملية قيد التشغيل. - طوابير 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
أسئلتي:
-
ما هي المقايضات الموصى بها من حيث الذاكرة لتوسيع
nf_conntrack_maxإلى1048576على عقدة بذاكرة 16GB؟ -
حتى مع
tcp_tw_reuse = 2، نحصل علىEAGAINعند ربط المنافذ المحلية إلى Postgres. هل يجب علينا توسيعip_local_port_rangeأو تمكين keep-alives عبر HTTP في Nginx العلوي؟ -
هل ستكون إضافة قواعد iptables الخام بوسم
NOTRACKلحركة المرور الداخلية و loopback و VPC حلاً دائماً آمناً، أم أنها تُدخل مشاكل حالة خفية مع شبكات الحاويات؟
سيكون أي نصيحة أو مقتطفات sysctl.conf مجرّبة ومختبرة موضع تقدير كبير!
شكراً!