Grootmade@app-node - 11: المورد غير متاح مؤقتًا

مرحباً بالجميع،

أواجه صعوبة في حل مشكلة متقطعة في انقطاع الاتصالات على عقدة تطبيق 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

أسئلتي:

  1. ما هي المقايضات الموصى بها من حيث الذاكرة لتوسيع nf_conntrack_max إلى 1048576 على عقدة بذاكرة 16GB؟

  2. حتى مع tcp_tw_reuse = 2، نحصل على EAGAIN عند ربط المنافذ المحلية إلى Postgres. هل يجب علينا توسيع ip_local_port_range أو تمكين keep-alives عبر HTTP في Nginx العلوي؟

  3. هل ستكون إضافة قواعد iptables الخام بوسم NOTRACK لحركة المرور الداخلية و loopback و VPC حلاً دائماً آمناً، أم أنها تُدخل مشاكل حالة خفية مع شبكات الحاويات؟

سيكون أي نصيحة أو مقتطفات sysctl.conf مجرّبة ومختبرة موضع تقدير كبير!

شكراً!

لا يعمل Discourse الحديث مع Puma. ما هي إصدار discourse الذي تستخدمه؟ هل هذا التثبيت غير قياسي؟