النقاط الرئيسية
إذا ظهرت لك رسالة الخطأ “عدد كبير جدًا من الملفات المفتوحة” في Linux، فهذا يعني أن عمليتك قد وصلت إلى الحد الأقصى لعدد الملفات المسموح لها بفتحها، والذي يبلغ عادةً 1024 ملفًا. يمكنك زيادة الحد مؤقتًا إلى 2048 ملفًا، على سبيل المثال، باستخدام الأمر “ulimit -n 2048”. يمكنك زيادة الحد بشكل دائم عن طريق تحرير ملفات تكوين systemd.
في أجهزة الكمبيوتر التي تعمل بنظام Linux، تتم مشاركة موارد النظام بين المستخدمين. حاول استخدام أكثر من حصتك العادلة وسوف تصل إلى الحد الأقصى. وقد تتسبب أيضًا في اختناق المستخدمين أو العمليات الأخرى.
ما هو خطأ وجود عدد كبير جدًا من الملفات المفتوحة؟
من بين الوظائف العديدة الأخرى، فإن نواة جهاز كمبيوتر Linux مشغولة دائمًا بمراقبة من يستخدم عددًا معينًا من موارد النظام المحدودة، مثل دورات ذاكرة الوصول العشوائي ووحدة المعالجة المركزية. يتطلب النظام متعدد المستخدمين اهتمامًا مستمرًا للتأكد من أن الأشخاص والعمليات لا يستخدمون أكثر من أي مورد نظام معين مما هو مناسب.
على سبيل المثال، ليس من العدل أن يستغل شخص ما قدرًا كبيرًا من وقت وحدة المعالجة المركزية بحيث يشعر الآخرون بأن الكمبيوتر بطيء. حتى إذا كنت الشخص الوحيد الذي يستخدم الكمبيوتر الذي يعمل بنظام Linux، فهناك حدود محددة للموارد التي يمكن لعملياتك استخدامها. ففي النهاية، ما زلت مجرد مستخدم آخر.
بعض موارد النظام معروفة وواضحة، مثل ذاكرة الوصول العشوائي ودورات وحدة المعالجة المركزية ومساحة القرص الصلب. ولكن هناك العديد من الموارد الأخرى التي تتم مراقبتها والتي يكون لكل مستخدم – أو لكل عملية مملوكة للمستخدم – حد أقصى محدد لها. أحد هذه الموارد هو عدد الملفات التي يمكن لعملية ما فتحها في وقت واحد.
إذا سبق لك رؤية رسالة الخطأ “تم فتح عدد كبير جدًا من الملفات” في نافذة المحطة الطرفية أو وجدتها في سجلات النظام، فهذا يعني أنه تم الوصول إلى الحد الأقصى، ولا يُسمح للعملية بفتح أي ملفات أخرى.
لماذا يتم فتح عدد كبير جدًا من الملفات؟
يوجد حد على مستوى النظام لعدد الملفات المفتوحة التي يمكن لنظام Linux التعامل معها. إنه عدد كبير جدًا، كما سنرى، ولكن لا يزال هناك حد. كل عملية مستخدم لها تخصيص يمكنها استخدامه. يحصل كل منهم على حصة صغيرة من إجمالي النظام المخصص له.
ما يتم تخصيصه فعليًا هو عدد من مقابض الملفات. يتطلب كل ملف يتم فتحه مقابض. وحتى مع التخصيصات السخية إلى حد ما، يمكن استخدام مقابض الملفات على مستوى النظام بشكل أسرع مما قد تتخيله للوهلة الأولى.
يقوم لينكس بتلخيص كل شيء تقريبًا بحيث يبدو وكأنه ملف. في بعض الأحيان تكون مجرد ملفات عادية. لكن إجراءات أخرى مثل فتح دليل تستخدم أيضًا معالج ملف. يستخدم لينكس ملفات خاصة كتلة كنوع من برامج التشغيل لأجهزة الأجهزة. الملفات الخاصة بالأحرف متشابهة جدًا، لكنها تُستخدم غالبًا مع الأجهزة التي لديها مفهوم الإنتاجية، مثل الأنابيب والمنافذ التسلسلية.
تتعامل الملفات الخاصة بالكتلة مع كتل البيانات في وقت واحد، وتتعامل الملفات الخاصة بالأحرف مع كل حرف على حدة. ولا يمكن الوصول إلى هذين الملفين الخاصين إلا باستخدام معالجات الملفات. تستخدم المكتبات التي يستخدمها البرنامج معالج ملفات، وتستخدم التدفقات معالجات الملفات، وتستخدم اتصالات الشبكة معالجات الملفات.
يؤدي تلخيص كل هذه المتطلبات المختلفة بحيث تظهر كملفات إلى تبسيط التفاعل معها ويسمح لأشياء مثل الأنابيب والجداول بالعمل.
يمكنك أن ترى أن لينكس يفتح الملفات ويستخدم معالجات الملفات خلف الكواليس لتشغيل نفسه فقط – بغض النظر عن عمليات المستخدم الخاصة بك. لا يقتصر عدد الملفات المفتوحة على عدد الملفات التي فتحتها. كل شيء تقريبًا في نظام التشغيل يستخدم معالجات الملفات.
كيفية التحقق من حدود التعامل مع الملفات
يمكنك رؤية الحد الأقصى لعدد معالجات الملفات على مستوى النظام باستخدام هذا الأمر.
cat /proc/sys/fs/file-max
يؤدي هذا إلى إرجاع عدد ضخم للغاية يبلغ 9.2 كوينتيليون. وهذا هو الحد الأقصى النظري للنظام. وهو أكبر قيمة ممكنة يمكنك الاحتفاظ بها في عدد صحيح موقّع مكون من 64 بت. أما ما إذا كان جهاز الكمبيوتر المسكين الخاص بك قادرًا على التعامل مع هذا العدد الكبير من الملفات المفتوحة في وقت واحد، فهذه مسألة أخرى تمامًا.
على مستوى المستخدم، لا توجد قيمة صريحة للحد الأقصى لعدد الملفات المفتوحة التي يمكنك فتحها. ولكن يمكننا حسابها تقريبًا. لمعرفة الحد الأقصى لعدد الملفات التي يمكن لإحدى عملياتك فتحها، يمكننا استخدام ulimit الأمر مع -n خيار (فتح الملفات).
ulimit -n
وللعثور على الحد الأقصى لعدد العمليات التي يمكن للمستخدم استخدامها، سنستخدم ulimit مع -u خيار (عمليات المستخدم).
ulimit -u
إن ضرب 1024 في 7640 يعطينا 7,823,360. بالطبع، العديد من هذه العمليات ستكون مستخدمة بالفعل بواسطة بيئة سطح المكتب لديك وغيرها من العمليات الخلفية. لذا فإن هذا هو الحد الأقصى النظري الآخر، وهو الحد الأقصى الذي لن تتمكن من تحقيقه بشكل واقعي.
الرقم المهم هو عدد الملفات التي يمكن لعملية ما فتحها. افتراضيًا، يكون هذا الرقم 1024. ومن الجدير بالذكر أن فتح نفس الملف 1024 مرة في نفس الوقت يعادل فتح 1024 ملفًا مختلفًا في نفس الوقت. بمجرد استخدام جميع معالجات الملفات لديك، تكون قد انتهيت.
من الممكن ضبط عدد الملفات التي يمكن لعملية ما فتحها. هناك في الواقع قيمتان يجب مراعاتهما عند ضبط هذا العدد. الأولى هي القيمة التي تم ضبطها حاليًا، أو التي تحاول ضبطها عليها. وهذا ما يسمى بالحد الناعم. وهناك حد صارم أيضًا، وهو أعلى قيمة يمكنك رفع الحد الناعم إليها.
الطريقة التي يمكن بها التفكير في هذا الأمر هي أن الحد الناعم هو في الواقع “القيمة الحالية” والحد الأعلى هو أعلى قيمة يمكن أن تصل إليها القيمة الحالية. يمكن للمستخدم العادي غير الجذري رفع الحد الناعم الخاص به إلى أي قيمة حتى الحد الأقصى الخاص به. يمكن للمستخدم الجذري زيادة الحد الأقصى الخاص به.
لرؤية الحدود الناعمة والصارمة الحالية، استخدم ulimit مع -S (ناعم) و -H الخيارات (الصعبة) و -n خيار (فتح الملفات).
ulimit -Sn
ulimit -Hn
لإنشاء موقف حيث يمكننا أن نرى الحد الناعم يتم فرضه، قمنا بإنشاء برنامج يفتح الملفات بشكل متكرر حتى يفشل. ثم ينتظر ضغطة مفتاح قبل التخلي عن جميع معالجات الملفات التي استخدمها. يسمى البرنامج open-files.
./open-Files
يفتح 1021 ملفًا ويفشل أثناء محاولته فتح الملف 1022.
1024 ناقص 1021 يساوي 3. ماذا حدث لمقابض الملفات الثلاثة الأخرى؟ لقد تم استخدامها لـ STDIN, STDOUT، و STDERR التدفقات. يتم إنشاؤها تلقائيًا لكل عملية. تحتوي هذه التدفقات دائمًا على قيم وصف الملف 0 و1 و2.
يمكننا أن نرى هذه باستخدام lsof الأمر مع -p خيار (العملية) ومعرف العملية open-filesالبرنامج. بسهولة، يقوم بطباعة معرف العملية الخاص به على نافذة المحطة الطرفية.
lsof -p 11038
بالطبع، في موقف حقيقي، قد لا تعرف أي عملية استحوذت للتو على جميع مقابض الملفات. لبدء التحقيق، يمكنك استخدام تسلسل الأوامر هذا. سيخبرك بأكثر خمسة عشر مستخدمًا غزارة لمقابض الملفات على جهاز الكمبيوتر الخاص بك.
lsof | awk '{ print $1 " " $2; }' | sort -rn | uniq -c | sort -rn | head -15
لرؤية عدد أكبر أو أقل من الإدخالات، قم بتعديل -15 المعلمة إلى head بمجرد تحديد العملية، تحتاج إلى معرفة ما إذا كانت قد خرجت عن السيطرة وتفتح عددًا كبيرًا من الملفات لأنها خارجة عن السيطرة، أو ما إذا كانت تحتاج حقًا إلى هذه الملفات. إذا كانت تحتاج إليها، فأنت بحاجة إلى زيادة حد معالجة الملفات الخاص بها.
كيفية زيادة الحد الناعم
إذا قمنا بزيادة الحد الناعم وتشغيل برنامجنا مرة أخرى، فيجب أن نرى أنه يفتح المزيد من الملفات. سنستخدم ulimit الأمر و -n خيار (فتح الملفات) بقيمة عددية 2048. سيكون هذا هو الحد الناعم الجديد.
ulimit -n 2048
لقد نجحنا هذه المرة في فتح 2045 ملفًا. وكما هو متوقع، فإن هذا أقل بثلاثة ملفات من 2048، وذلك بسبب مقابض الملفات المستخدمة STDIN , STDOUT ، و STDERR.
كيفية تغيير حد الملفات بشكل دائم
لا يؤثر زيادة الحد الناعم إلا على الغلاف الحالي. افتح نافذة طرفية جديدة وتحقق من الحد الناعم. سترى أنه القيمة الافتراضية القديمة. ولكن هناك طريقة لتعيين قيمة افتراضية جديدة عالميًا للحد الأقصى لعدد الملفات المفتوحة التي يمكن لعملية ما أن تمتلكها والتي تظل مستمرة وتنجو من إعادة التشغيل.
غالبًا ما توصيك النصائح القديمة بتحرير ملفات مثل “/etc/sysctl.conf” و”/etc/security/limits.conf”. ومع ذلك، في التوزيعات المستندة إلى systemd، لا تعمل هذه التحريرات بشكل متسق، وخاصةً لجلسات تسجيل الدخول الرسومية.
التقنية المعروضة هنا هي الطريقة للقيام بذلك على التوزيعات المستندة إلى systemd. هناك ملفان نحتاج إلى العمل بهما. الأول هو ملف “/etc/systemd/system.conf”. سنحتاج إلى استخدام sudo .
sudo gedit /etc/systemd/system.conf
ابحث عن السطر الذي يحتوي على السلسلة “DefaultLimitNOFILE”. قم بإزالة علامة التجزئة “#” من بداية السطر، وقم بتعديل الرقم الأول إلى أي رقم تريده ليكون الحد الناعم الجديد للعمليات. لقد اخترنا 4096. الرقم الثاني في هذا السطر هو الحد الثابت. لم نقم بتعديله.
احفظ الملف وأغلق المحرر.
نحن بحاجة إلى تكرار هذه العملية على الملف “/etc/systemd/user.conf”.
sudo gedit /etc/systemd/user.conf
قم بإجراء نفس التعديلات على السطر الذي يحتوي على السلسلة “DefaultLimitNOFILE”.
احفظ الملف وأغلق المحرر. يجب عليك إعادة تشغيل الكمبيوتر أو استخدام systemctl الأمر مع daemon-reexec الخيار بحيث systemd يتم إعادة التنفيذ واستيعاب الإعدادات الجديدة.
sudo systemctl daemon-reexec
يجب أن يؤدي فتح نافذة المحطة الطرفية والتحقق من الحد الجديد إلى إظهار القيمة الجديدة التي قمت بتعيينها. في حالتنا كانت القيمة 4096.
ulimit -n
يمكننا اختبار هذه القيمة الحية والتشغيلية عن طريق إعادة تشغيل برنامجنا الجشع للملفات.
./open-Files
يفشل البرنامج في فتح الملف رقم 4094، مما يعني أن عدد الملفات المفتوحة هو 4093. هذه هي القيمة المتوقعة، أقل بـ 3 من 4096.
تذكر أن كل شيء عبارة عن ملف
لهذا السبب يعتمد Linux بشكل كبير على معالجات الملفات. الآن، إذا بدأت في نفادها، فأنت تعلم كيفية زيادة حصتك.