المدوّنة · الخوادم ولينكس

Swap في Linux — ما هو وكيف تضيفه إلى سيرفرك

· 6 دقائق قراءة

Swap في Linux — ما هو وكيف تضيفه إلى سيرفرك

في خادم صغير بذاكرة ١ أو ٢ جيجابايت، تكفي ذروة واحدة حتى تنفد الذاكرة: تحديث للنظام، أو نسخة احتياطية، أو زيارات مفاجئة. عندها يتدخّل النظام ويقتل أكبر برنامج يستهلكها، وكثيراً ما يكون قاعدة البيانات. Swap مساحة على القرص يلجأ إليها النظام حين تمتلئ الذاكرة، فيبطؤ الخادم قليلاً بدل أن يسقط برنامج فيه.

مقارنة بين RAM السريعة ومساحة Swap الأبطأ على القرص
الذاكرة سريعة ومحدودة، وSwap أبطأ بكثير لكنه يمتصّ الذروة

متى تحتاجه، ومتى لا يكفي#

Swap لا يعوّض الذاكرة. القرص، ولو كان SSD، أبطأ من الذاكرة بمراتب. إنه وسادة للذروات العابرة، لا مكان يعيش فيه الخادم. فإن رأيت الخادم يستعمل Swap طوال الوقت، فهو يحتاج ذاكرة أكبر، وسنرى كيف تعرف ذلك في آخر المقال.

وتحتاجه غالباً في الحالات التالية:

  • خادم صغير الذاكرة: ٢ جيجابايت أو أقل، تعمل عليه قاعدة بيانات أو ووردبريس.
  • برامج تُقتل فجأة: MySQL يتوقف مثلاً، وفي السجلّ عبارة Out of memory أو oom-kill.
  • مهمّة ثقيلة من حين لآخر: تثبيت حزم، أو بناء مشروع، أو ضغط نسخة احتياطية كبيرة.

افحص ما عندك أولاً#

free -h
swapon --show
  • في ناتج free -h: صفّ Swap يعرض الحجم الكلّي والمستعمل. إن كان كلّه 0B فلا Swap لديك.
  • swapon --show يسرد أماكن Swap المفعّلة. إن لم يطبع شيئاً فلا يوجد أيّ منها.

ملف أم قسم؟#

مخطط تقسيم القرص في Linux يُظهر قسم الإقلاع وقسم الجذر وقسم Swap
قسم Swap مستقلّ يُحدَّد عند تقسيم القرص، أما ملف Swap فيُضاف في أيّ وقت

قسم Swap يُحجز عند تقسيم القرص وتثبيت النظام، وتغيير حجمه لاحقاً يعني إعادة تقسيم القرص. أما ملف Swap فملف عادي في نظام الملفات: تضيفه أو تكبّره أو تحذفه والخادم يعمل. أداؤهما متقارب على الأنظمة الحديثة. وعلى خادم قائم، الملف هو الخيار العملي.

كم حجمه؟#

لا رقم واحداً يصلح لكل خادم. هذه قاعدة عملية معقولة:

  • ذاكرة ٢ جيجابايت أو أقل: Swap بحجم الذاكرة تقريباً.
  • ذاكرة أكبر: من ٢ إلى ٤ جيجابايت تكفي لامتصاص الذروات.
  • تحتاج السبات (hibernation)؟ هذه حاجة أجهزة المكتب لا الخوادم، وتتطلّب Swap بحجم الذاكرة على الأقل.

وقبل أن تختار، تأكّد أن في القرص مساحة كافية:

df -h /

إنشاء ملف Swap#

المثال بحجم ٢ جيجابايت. غيّر 2G إلى ما تحتاجه:

# 1. احجز الملف
sudo fallocate -l 2G /swapfile

# 2. اجعله مقروءاً لـ root وحده
sudo chmod 600 /swapfile

# 3. هيّئه ليكون Swap
sudo mkswap /swapfile

# 4. فعّله
sudo swapon /swapfile

ما يفعله كل أمر:

  • fallocate يحجز المساحة دفعة واحدة دون أن يكتبها، فينتهي فوراً.
  • chmod 600 ضروري: ملف Swap قد يحمل أيّ شيء كان في الذاكرة، ومنه كلمات مرور. يرفض swapon الملف المقروء للجميع أو يحذّر منه.
  • mkswap يكتب في الملف ترويسة Swap.
  • swapon يسلّمه للنظام.

تأكّد أنه يعمل#

swapon --show
free -h

يجب أن ترى /swapfile بحجمه في الناتج الأول، وأن يظهر الحجم نفسه في صفّ Swap في الثاني.

اجعله دائماً بعد إعادة التشغيل#

ما فعلته يختفي عند إعادة التشغيل. ليبقى، يُضاف سطر إلى الملف /etc/fstab، وهو الملف الذي يقرؤه النظام عند الإقلاع ليعرف ما يركّبه.

خطأ في /etc/fstab قد يمنع الخادم من الإقلاع، فلا يعود إلا بالكونسول أو وضع الإنقاذ. خذ نسخة منه قبل التعديل، وتحقّق منه بعده بالأمر المذكور أدناه.

# نسخة احتياطية
sudo cp /etc/fstab /etc/fstab.bak

# أضف السطر
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# تحقّق من الملف كله
sudo findmnt --verify

إن أنهى findmnt --verify دون أخطاء فالملف سليم. وإن أبلغ عن خطأ فأعد النسخة:

sudo cp /etc/fstab.bak /etc/fstab

Swappiness: متى يلجأ النظام إلى Swap#

القيمة vm.swappiness تحدّد مدى استعداد النظام لنقل صفحات من الذاكرة إلى Swap. القيمة الافتراضية ٦٠ في أغلب التوزيعات. القيمة الأقل تعني أن النظام يُبقي البرامج في الذاكرة أطول، ولا يلجأ إلى Swap إلا حين يضيق فعلاً. لكن صفحة SwapFaq في مساعدة أوبونتو (في المصادر أدناه) تقترح القيمة ١٠ لأجهزة سطح المكتب، وتقول إن الافتراضية ٦٠ أنسب على الأرجح لخوادم أوبونتو. فأبقِها على الخادم ما لم يكن لديك سبب واضح لتغييرها. وإن أردت تغييرها، فالمثال التالي بالقيمة ١٠:

# القيمة الحالية
cat /proc/sys/vm/swappiness

# تغيير فوري، يزول عند إعادة التشغيل
sudo sysctl vm.swappiness=10

# تغيير دائم
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

تكبير الملف أو حذفه#

لتغيير الحجم: عطّله، ثم غيّر حجمه، ثم هيّئه وفعّله من جديد. السطر في /etc/fstab يبقى كما هو.

sudo swapoff /swapfile
sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

وللحذف: عطّله، واحذف سطره من /etc/fstab، ثم احذف الملف.

swapoff ينقل ما في Swap إلى الذاكرة. إن كانت الذاكرة الحرّة أقل مما في Swap فقد يفشل الأمر أو يقتل النظام برامج. انظر إلى free -h قبله.

sudo swapoff /swapfile
sudo nano /etc/fstab     # احذف سطر /swapfile
sudo rm /swapfile

مشاكل شائعة وحلولها#

«swapon: /swapfile: skipping - it appears to have holes»#

بعض أنظمة الملفات لا تقبل ملفاً حُجز بـfallocate. أنشئه بـdd بدلاً منه، فهو يكتب الملف كاملاً. يأخذ وقتاً أطول، لكنه يعمل في كل مكان:

sudo swapoff /swapfile 2>/dev/null
sudo rm /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

count=2048 مع bs=1M يعني ٢ جيجابايت.

«swapon: /swapfile: insecure permissions 0644, 0600 suggested»#

نسيت chmod 600. نفّذه، ثم أعد swapon.

«swapon: /swapfile: swapon failed: Operation not permitted»#

خادمك غالباً «حاوية» (container) لا آلة افتراضية كاملة، كخوادم OpenVZ وLXC. في هذا النوع يحدّد المزوّد الذاكرة وSwap من خارج الخادم، ولا تستطيع إضافتهما من داخله. اسأل المزوّد عن ترقية الذاكرة.

الخادم بطيء وSwap ممتلئ#

هذه علامة على أن الذاكرة لا تكفي عملك المعتاد. تحقّق بهذا الأمر:

vmstat 1 5

راقب عمودَي si وso، وهما ما يُقرأ من Swap وما يُكتب إليه في الثانية. إن بقيا فوق الصفر باستمرار، فالخادم ينقل الصفحات ذهاباً وإياباً طوال الوقت. الحلّ عندها واحد من اثنين:

  • ذاكرة أكبر.
  • تقليل ما يعمل على الخادم، كعدد عمّال PHP أو ذاكرة قاعدة البيانات.

Swap أكبر لن يحلّ هذه المشكلة.

المصادر#

التعليقات

كن أول من يشارك رأيه أو تجربته.

أضف تعليقاً أو سؤالاً

سجّل الدخول لتعجب بالتعليقات المفيدة وترفعها لأعلى النقاش. سجّل الدخول

لا يُنشر، ولا نرسل إليه شيئاً.

يظهر التعليق بعد مراجعته. الروابط لا تُفعَّل.

تبني موقعاً عربياً؟

سكربتات وقوالب وإضافات وخوادم — مصمّمة للمواقع العربية.

تصفّح المنتجات