كيفية حل خطأ "عدد كبير جدًا من الملفات المفتوحة" على نظام Linux
نشرت: 2022-06-29
على أجهزة كمبيوتر Linux ، تتم مشاركة موارد النظام بين المستخدمين. حاول استخدام أكثر من حصتك العادلة وستصل إلى الحد الأقصى. يمكنك أيضًا إعاقة المستخدمين أو العمليات الأخرى.
موارد النظام المشتركة
من بين وظائف الجازليون الأخرى ، فإن نواة كمبيوتر Linux مشغولة دائمًا بمراقبة من يستخدم عدد موارد النظام المحدودة ، مثل دورات ذاكرة الوصول العشوائي ووحدة المعالجة المركزية. يتطلب النظام متعدد المستخدمين اهتمامًا مستمرًا للتأكد من أن الأشخاص والعمليات لا تستخدم أكثر من أي مورد نظام معين أكثر مما هو مناسب.
ليس من العدل ، على سبيل المثال ، أن يستهلك شخص ما الكثير من وقت وحدة المعالجة المركزية بحيث يشعر الكمبيوتر بالبطء بالنسبة لأي شخص آخر. حتى إذا كنت الشخص الوحيد الذي يستخدم كمبيوتر Linux الخاص بك ، فهناك حدود معينة للموارد التي يمكن أن تستخدمها عملياتك. بعد كل شيء ، ما زلت مجرد مستخدم آخر.
بعض موارد النظام معروفة وواضحة ، مثل ذاكرة الوصول العشوائي ودورات وحدة المعالجة المركزية ومساحة القرص الصلب. ولكن هناك العديد والعديد من الموارد التي تتم مراقبتها والتي لكل مستخدم - أو كل عملية مملوكة للمستخدم - لها حد أعلى معين. أحد هذه الملفات هو عدد الملفات التي يمكن أن تفتحها العملية مرة واحدة.
إذا رأيت رسالة الخطأ "عدد كبير جدًا من الملفات مفتوحة" في نافذة طرفية أو عثرت عليها في سجلات النظام ، فهذا يعني أنه تم الوصول إلى الحد الأعلى ، ولا يُسمح للعملية بفتح أي ملفات أخرى.
إنها ليست مجرد ملفات قمت بفتحها
يوجد حد على مستوى النظام لعدد الملفات المفتوحة التي يمكن أن يتعامل معها 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
(soft) و -H
(hard) ، وخيار -n
(الملفات المفتوحة).
ulimit -Sn
ulimit -Hn

لإنشاء موقف يمكننا فيه رؤية فرض الحد الناعم ، أنشأنا برنامجًا يفتح الملفات بشكل متكرر حتى يفشل. ثم ينتظر ضغطة مفتاح قبل أن يتخلى عن كل مقابض الملفات التي استخدمها. البرنامج يسمى open-files
.
./الملفات المفتوحة
يفتح 1021 ملفًا ويفشل أثناء محاولته فتح الملف 1022.
1024 ناقص 1021 يساوي 3. ماذا حدث لمقابض الملفات الثلاثة الأخرى؟ تم استخدامها لتدفقات STDIN
و STDOUT
و STDERR
. يتم إنشاؤها تلقائيًا لكل عملية. تحتوي هذه دائمًا على قيم واصف الملف 0 و 1 و 2.
ذات صلة: كيفية استخدام Linux lsof Command
يمكننا أن نرى هذه باستخدام الأمر lsof
مع خيار -p
(العملية) ومعرف العملية لبرنامج open-files
. بسهولة ، يقوم بطباعة معرف العملية الخاص به إلى نافذة المحطة الطرفية.
لوزوف-ع 11038
بالطبع ، في حالة العالم الواقعي ، قد لا تعرف العملية التي استحوذت للتو على جميع مقابض الملفات. لبدء التحقيق الخاص بك ، يمكنك استخدام هذا التسلسل من أوامر الأنابيب. سيخبرك أكثر خمسة عشر مستخدمًا من مستخدمي مقابض الملفات على جهاز الكمبيوتر الخاص بك.
lsof | awk '{print $ 1 "" $ 2؛ } '| فرز -rn | uniq -c | فرز -rn | الرأس -15
لرؤية إدخالات أكثر أو أقل ، اضبط المعلمة -15
على الأمر head
. بمجرد تحديد العملية ، تحتاج إلى معرفة ما إذا كانت قد سارت بشكل خادع وتفتح عددًا كبيرًا جدًا من الملفات لأنها خارجة عن السيطرة ، أو ما إذا كانت تحتاج بالفعل إلى هذه الملفات. إذا احتاج إليها ، فأنت بحاجة إلى زيادة حد التعامل مع الملفات.
زيادة الحد المرن
إذا قمنا بزيادة الحد اللين وقمنا بتشغيل برنامجنا مرة أخرى ، فسنرى أنه يفتح المزيد من الملفات. سنستخدم الأمر ulimit
والخيار -n
(الملفات المفتوحة) بقيمة رقمية 2048. سيكون هذا هو الحد الجديد الناعم.
يليميت ن 2048
هذه المرة فتحنا بنجاح 2045 ملفًا. كما هو متوقع ، هذا أقل من 2048 بثلاثة ، بسبب مقابض الملفات المستخدمة لـ STDIN
و STDOUT
و STDERR
.
إجراء تغييرات دائمة
زيادة الحد المرن يؤثر فقط على الغلاف الحالي. افتح نافذة طرفية جديدة وتحقق من الحد المرن. سترى أنها القيمة الافتراضية القديمة. ولكن هناك طريقة لتعيين قيمة افتراضية جديدة بشكل عام لأقصى عدد من الملفات المفتوحة التي يمكن أن تكون للعملية مستمرة وتبقى على قيد الحياة عند إعادة التمهيد.
غالبًا ما توصي النصائح القديمة بتعديل ملفات مثل "/etc/sysctl.conf" و "/etc/security/limits.conf." ومع ذلك ، في التوزيعات المستندة إلى 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
يمكننا اختبار هذه القيمة الحية والتشغيلية من خلال إعادة تشغيل برنامج جشع الملفات الخاص بنا.
./الملفات المفتوحة
فشل البرنامج في فتح الملف رقم 4094 أي تم فتح 4093 ملفا. هذه هي القيمة المتوقعة لدينا ، 3 أقل من 4096.
كل شيء ملف
لهذا السبب يعتمد Linux بشكل كبير على مقابض الملفات. الآن ، إذا بدأت في النفاد منهم ، فأنت تعرف كيفية زيادة حصتك.
ذات صلة: ما هي stdin و stdout و stderr على Linux؟