EMFILE (errno 24)

errno 24

LINUX

الرسالة الرسمية (كما تظهر على الشاشة): Too many open files

يُبحث عنه أيضًا باسم: Too many open files, errno 24, EMFILE: too many open files

طرفية Linux تشغّل strace مع إبراز استدعاء النظام الفاشل وقيمة errno
errno في Linux: تتبّع استدعاء النظام الفاشل بدقة قبل تغيير أي شيء.

ماذا يعني

تعني EMFILE، أي 'Too many open files' (errno 24)، أن عملية واحدة بلغت حدّها الأقصى من واصفات الملفات (file descriptors) المفتوحة. يُحتسب كل مقبس (socket) وملف وأنبوب (pipe). تبلغ هذا الحد الخوادم المزدحمة ومراقبات الملفات والشيفرات المتسربة؛ والحد مخصص لكل عملية (و ENFILE هو المكافئ على مستوى النظام كله).

ينطبق على: Linux, macOS (BSD errno), WSL, حاويات Docker

كيفية إصلاح EMFILE (errno 24)

  1. افحص الحد الحالي بالأمر 'ulimit -n' واستخدام العملية بالأمر 'ls /proc/<pid>/fd | wc -l'
  2. اعرف ما هو مفتوح بالأمر 'lsof -p <pid> | awk "{print \$5}" | sort | uniq -c' لاكتشاف التسرب (آلاف المقابس أو الملف نفسه)
  3. ارفع حد الصدفة (shell) للجلسة بالأمر 'ulimit -n 65535' (حتى الحد الصارم hard limit)
  4. لخدمات systemd، اضبط 'LimitNOFILE=65535' في قسم [Service] من ملف الوحدة، ثم نفّذ 'systemctl daemon-reload' وأعد التشغيل
  5. لجلسات تسجيل الدخول، اضبط حدود nofile في /etc/security/limits.conf
  6. أصلح التسربات في الشيفرة: أغلق الملفات والمقابس في كتل finally/with، وأعد استخدام اتصالات HTTP عبر مجمّع اتصالات (pool)
  7. في macOS، افحص 'launchctl limit maxfiles' وارفع 'ulimit -n' في الصدفة

سبب حدوثه

لكل عملية حدّ مرن RLIMIT_NOFILE، وغالباً ما يكون 1024 افتراضياً. ويدفع التزامن العالي ومراقبات الملفات على الأشجار الكبيرة وتسرب الواصفات العمليات إلى تجاوزه.

الأسئلة الشائعة

ما الفرق بين EMFILE وENFILE؟

EMFILE هو الحد لكل عملية؛ أما ENFILE فيعني امتلاء جدول الملفات في النظام كله.

لماذا لا يفيد رفع ulimit خدمتي؟

الخدمات التي يشغّلها systemd تتجاهل ulimit الخاص بصدفتك. اضبط LimitNOFILE في ملف الوحدة.

أخطاء ذات صلة

المصدر: Linux kernel errno.h · حلول كتبها المحررون وراجعوها (راجع السياسة التحريرية)

آخر تحديث: