مقدمة
طريقة واحدة للوقاية من أخطاء نفاد الذاكرة في التطبيقات هي إضافة بعض مساحة التبادل إلى خادمك. في هذا الدليل، سنغطي كيفية إضافة ملف تبادل إلى خادم Ubuntu 22.04.
ما هو التبادل؟
التبادل هو جزء من تخزين القرص الصلب تم تخصيصه لنظام التشغيل لتخزين البيانات مؤقتًا التي لم يعد بإمكانه الاحتفاظ بها في الذاكرة العشوائية. يتيح لك هذا زيادة كمية المعلومات التي يمكن لخادمك الاحتفاظ بها في ذاكرته العملية، مع بعض التحفظات. سيتم استخدام مساحة التبادل على القرص الصلب بشكل رئيسي عندما لا يكون هناك مساحة كافية في الذاكرة العشوائية لاحتواء بيانات التطبيقات القيدة في الاستخدام.
سيكون كتابة المعلومات على القرص أبطأ بشكل ملحوظ من المعلومات المحتفظ بها في الذاكرة العشوائية، ولكن سيفضل نظام التشغيل الاحتفاظ ببيانات التطبيقات الجارية في الذاكرة واستخدام التبادل للبيانات القديمة. بشكل عام، وجود مساحة تبادل كبديل لعندما ينفد ذاكرة النظام يمكن أن يكون شبك أمان جيد ضد الاستثناءات نفاد الذاكرة على الأنظمة ذات التخزين غير الفلاش الصلب.
الخطوة 1 – التحقق من معلومات التبادل في النظام
قبل أن نبدأ، يمكننا التحقق مما إذا كان لدى النظام بالفعل بعض مساحة التبادل المتاحة. يُمكن أن يكون هناك ملفات تبادل متعددة أو أقسام تبادل، ولكن بشكل عام يجب أن يكون واحدًا كافيًا.
يُمكننا التحقق مما إذا كان لديك النظام أي تبادل مكون عن طريق كتابة:
إذا لم يتم استرداد أي نتائج، فهذا يعني أن نظامك ليس لديه حاليًا مساحة تبادل متاحة.
يمكنك التحقق من عدم وجود تبادل نشط باستخدام أداة free
:
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
كما يمكنك رؤية في صف الـتبادل من الإخراج، لا يوجد أي تبادل نشط في النظام.
الخطوة 2 – التحقق من المساحة المتاحة في قسم القرص الصلب
قبل أن نقوم بإنشاء ملف التبادل، سنقوم بالتحقق من استخدام القرص الحالي لدينا للتأكد من وجود ما يكفي من المساحة. يمكنك القيام بذلك عن طريق إدخال:
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000
الجهاز الذي يحتوي على /
في عمود Mounted on
هو قرصنا في هذه الحالة. لدينا الكثير من المساحة المتاحة في هذا المثال (تم استخدام 1.4 جيجابايت فقط). قد تكون نسبة الاستخدام لديك مختلفة على الأرجح.
على الرغم من وجود العديد من الآراء حول الحجم المناسب لمساحة التبديل، فإن ذلك يعتمد حقًا على تفضيلاتك الشخصية ومتطلبات تطبيقك. بشكل عام، يعتبر المبلغ المساوي أو مضاعف مقدار الذاكرة العشوائية على نظامك نقطة بداية جيدة. قاعدة أخرى جيدة تقول أن أي شيء يزيد عن 4 جيجابايت من المساحة المتبادلة على الأرجح غير ضروري إذا كنت تستخدمه فقط كنسخة احتياطية للذاكرة العشوائية.
الخطوة 3 – إنشاء ملف تبديل
الآن بمعرفة مساحة القرص الصلب المتاحة لدينا، يمكننا إنشاء ملف تبديل على نظام الملفات الخاص بنا. سنخصص ملفًا بالحجم الذي نريده يُسمى swapfile
في دليل الجذر (/
) لدينا.
أفضل طريقة لإنشاء ملف تبديل هي باستخدام برنامج fallocate
. هذا الأمر ينشئ فورًا ملف بالحجم المحدد.
نظرًا لأن الخادم في مثالنا يحتوي على 1 جيجابايت من الذاكرة العشوائية، سنقوم بإنشاء ملف بحجم 1 جيجابايت في هذا الدليل. قم بتعديل هذا حسب احتياجات خادمك الخاص:
يمكننا التحقق من أن المبلغ الصحيح من المساحة تم حجزه من خلال كتابة:
تم إنشاء ملفنا بالحجم الصحيح تم تخصيصه.
الخطوة 4 – تمكين ملف التبديل
الآن بعد أن لدينا ملف بالحجم الصحيح متاحًا، نحتاج إلى تحويل ذلك فعليًا إلى مساحة تبديل.
أولاً، نحتاج إلى قفل أذونات الملف بحيث يمكن للمستخدمين العاديين فقط بامتيازات root قراءة المحتويات. يمنع ذلك المستخدمين العاديين من الوصول إلى الملف، مما قد يكون له تداعيات أمنية كبيرة.
قم بجعل الملف متاحًا فقط للمستخدم root عن طريق كتابة:
تحقق من تغيير الأذونات عن طريق كتابة:
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
كما يمكنك رؤية، فقط المستخدم root لديه الإذن بالقراءة والكتابة ممكَّنًا.
يمكننا الآن تحديد الملف كمساحة تبديل عن طريق كتابة:
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
بعد تحديد الملف، يمكننا تمكين ملف التبديل، مما يسمح لنظامنا باستخدامه:
تحقق من توافر مساحة التبديل عن طريق كتابة:
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
يمكننا التحقق من إخراج أداة free
مرة أخرى لتأكيد نتائجنا:
Output total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi
تم تهيئة مساحة التبديل بنجاح وسيبدأ نظام التشغيل لدينا في استخدامه حسب الحاجة.
الخطوة 5 – جعل ملف التبديل دائمًا
قامت التغييرات الأخيرة بتمكين ملف التبديل للجلسة الحالية. ومع ذلك، إذا قمنا بإعادة التشغيل، فلن يحتفظ الخادم بإعدادات التبديل تلقائيًا. يمكننا تغيير ذلك عن طريق إضافة ملف التبديل إلى ملفنا /etc/fstab
.
قم بنسخ ملف /etc/fstab
احتياطيًا في حالة حدوث أي مشكلة:
أضف معلومات ملف التبادل إلى نهاية ملف /etc/fstab
الخاص بك عن طريق كتابة:
سنقوم بمراجعة بعض الإعدادات التي يمكننا تحديثها لضبط مساحة التبادل الخاصة بنا.
الخطوة 6 – ضبط إعدادات التبادل الخاصة بك
هناك بعض الخيارات التي يمكنك تكوينها والتي ستؤثر على أداء نظامك عند التعامل مع التبادل.
ضبط خاصية السوابنيس
يقوم المعلمة swappiness
بتكوين تردد تبديل البيانات من الذاكرة العشوائية إلى مساحة التبادل. هذه قيمة بين 0 و 100 تمثل نسبة.
مع القيم القريبة من الصفر، لن يقوم النواة بتبديل البيانات إلى القرص ما لم يكن ذلك ضروريًا تمامًا. تذكر، أن التفاعلات مع ملف التبادل تكلفة عالية بحيث تستغرق وقتًا أطول بكثير من التفاعلات مع الذاكرة العشوائية ويمكن أن تتسبب في تقليل كبير في الأداء. إخبار النظام بعدم الاعتماد على التبادل كثيرًا عمومًا سيجعل نظامك أسرع.
القيم التي تقترب من 100 ستحاول وضع المزيد من البيانات في مساحة التبادل في محاولة للحفاظ على المزيد من مساحة الذاكرة العشوائية متاحة. اعتمادًا على ملف تعريف الذاكرة لتطبيقاتك أو على ما تستخدمه الخادم لديك ل، قد يكون هذا أفضل في بعض الحالات.
يمكننا رؤية قيمة swappiness الحالية عن طريق كتابة:
Output60
بالنسبة لسطح المكتب، قيمة swappiness 60 ليست قيمة سيئة. بالنسبة لخادم، قد ترغب في تحريكها إلى قرب 0.
يمكننا تعيين swappiness إلى قيمة مختلفة باستخدام أمر sysctl
.
على سبيل المثال، لتعيين swappiness إلى 10، يمكننا كتابة:
Outputvm.swappiness = 10
هذا الإعداد سيستمر حتى إعادة التشغيل التالية. يمكننا ضبط هذه القيمة تلقائيًا عند إعادة التشغيل بإضافة السطر إلى ملف /etc/sysctl.conf
:
في الأسفل، يمكنك إضافة:
vm.swappiness=10
احفظ وأغلق الملف عند الانتهاء.
ضبط إعداد ضغط الذاكرة المؤقتة
قيمة ذات صلة أخرى قد ترغب في تعديلها هي vfs_cache_pressure
. هذا الإعداد يُكوّن كم سيختار النظام لتخزين معلومات الـinode والـdentry عن بيانات أخرى.
أساسًا، هذه البيانات عبارة عن بيانات الوصول إلى نظام الملفات. هذا عمومًا مكلف للغاية للبحث عنه ويُطلب بشكل متكرر للغاية، لذا فهو شيء ممتاز لنظامك لتخزينه. يمكنك رؤية القيمة الحالية عن طريق الاستعلام في نظام الملفات proc
مرة أخرى:
Output100
حيث أن النظام مُعين حاليًا بشكل يزيل معلومات inode من الذاكرة المؤقتة بسرعة كبيرة. يمكننا تعيين هذا إلى إعداد أكثر حرصًا مثل 50 بكتابة:
Outputvm.vfs_cache_pressure = 50
مرة أخرى، هذا صالح فقط لجلسةنا الحالية. يمكننا تغيير ذلك عن طريق إضافته إلى ملف التكوين الخاص بنا مثلما فعلنا مع إعداد swappiness الخاص بنا:
في الأسفل، أضف السطر الذي يحدد قيمتك الجديدة:
vm.vfs_cache_pressure=50
احفظ وأغلق الملف عند الانتهاء.
الاستنتاج
اتباع الخطوات في هذا الدليل سيمنحك بعض الهواء في الحالات التي من شأنها أن تؤدي في غيرها إلى استثناءات نفاد الذاكرة. يمكن أن تكون مساحة التبادل مفيدة للغاية في تجنب بعض هذه المشاكل الشائعة.
إذا كنت تصادف أخطاء النفاد من الذاكرة (OOM)، أو إذا وجدت أن نظامك غير قادر على استخدام التطبيقات التي تحتاج إليها، فإن الحل الأفضل هو تحسين إعدادات التطبيقات الخاصة بك أو ترقية الخادم الخاص بك.
Source:
https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-22-04