السيرفر بطيء، والأوامر تتأخر، وربما توقفت قاعدة البيانات فجأة ثم عادت؟ غالبًا الذاكرة (RAM) امتلأت. في هذا الدليل نفحص الذاكرة بالطريقة الصحيحة (وأغلب الناس يقرؤون الرقم الخطأ)، ونعرف البرنامج المسبّب، ثم نعالج المشكلة: من إعادة تشغيل الخدمة، إلى ملف Swap — وقد كبّرناه فعلًا من 1G إلى 2G على سيرفر في مرام هوست — وحتى الترقية.

⚡ الإجابة المختصرة

نفّذ free -h وانظر عمود available لا free. اعرف المستهلك بـps -eo pid,%mem,comm --sort=-%mem | head، وتأكد من قتل البرامج بـjournalctl -k | grep -i "killed process". للحل السريع أعد تشغيل الخدمة، ولأمان أكبر كبّر Swap، وإن كان الاستهلاك دائمًا قرب الحد فرقِّ الخطة.

الخطوة 1: اقرأ الذاكرة بشكل صحيح

أوامر free -h وswapon وps لمعرفة استهلاك الذاكرة
مخرجات حقيقية
  • free صغير؟ لا تقلق. لينكس يستعمل الذاكرة الفارغة كاشًا (buff/cache) لتسريع القرص، ويعطيها للبرامج فور حاجتها.
  • available هو الرقم الحقيقي: كم تستطيع البرامج أن تأخذ الآن. في سيرفرنا 6.9Gi من 7.5Gi — مرتاح جدًا.
  • Swap مستعمل بكثرة مع available قليل = ضغط حقيقي على الذاكرة، والسيرفر يبطؤ لأن القرص أبطأ من الرام بكثير.

وللصورة عبر الوقت افتح رسم Memory في رسوم الأداء، واضبط تنبيه بريد عند تجاوز 90%.

الخطوة 2: من يأكل الذاكرة؟

ps -eo pid,user,%mem,rss,comm --sort=-%mem | head    # أكثر العمليات استهلاكًا
top            # ثم اضغط M لترتيب حسب الذاكرة، وq للخروج
sudo docker stats --no-stream                        # استهلاك كل حاوية
sudo journalctl -k | grep -i "killed process"        # هل قتل النظام برامج لنقص الذاكرة؟

الأمر الأخير مهم: عندما تنفد الذاكرة يقتل لينكس أكبر عملية تلقائيًا (OOM killer)، وغالبًا تكون قاعدة البيانات، فتبدو وكأنها «توقفت وحدها». في سيرفرنا لم يظهر أي سطر، أي لم يُقتل شيء.

الخطوة 3: الحلول من الأسرع إلى الأدوم

الحلكيف
أعد تشغيل الخدمة المسرّبةsudo systemctl restart php8.3-fpm أو sudo docker restart اسم-الحاوية. يحرر الذاكرة فورًا.
حدّد استهلاك البرامجقلّل pm.max_children في PHP-FPM، وinnodb_buffer_pool_size في MySQL، وضع --memory 1g لحاويات Docker.
إعادة تشغيل دوريةلتطبيق يسرّب الذاكرة ببطء: مهمة Reboot مجدولة ليلًا.
كبّر Swapشبكة أمان تمنع قتل البرامج عند الذروة (الخطوات أدناه).
رقِّ الخطةإن كان available قليلًا طوال الوقت — الترقية دون فقدان البيانات.

ملف Swap: إنشاؤه وتكبيره

Swap مساحة على القرص يستعملها النظام كذاكرة إضافية عند الامتلاء. أبطأ من الرام بكثير، لكنه يمنع توقف البرامج فجأة. قوالب لينكس في مرام تنشئ ملف Swap بحجم 1G تلقائيًا عند أول تشغيل، مع swappiness=10 (أي لا يلجأ إليه النظام إلا عند الحاجة الحقيقية). إن احتجت أكبر، هكذا كبّرناه إلى 2G:

تكبير ملف swap إلى 2G بأوامر fallocate وmkswap وswapon
مخرجات حقيقية: من 1G إلى 2G
# تكبير ملف swap موجود (أو إنشاؤه إن لم يوجد)
sudo swapoff /swapfile                  # أوقفه أولًا (تجاهل الخطأ إن لم يوجد)
sudo fallocate -l 2G /swapfile          # الحجم الجديد
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# اجعله دائمًا بعد إعادة التشغيل (موجود أصلًا في قوالب مرام)
grep -q '^/swapfile' /etc/fstab || echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
رام السيرفرحجم Swap المقترح
1 إلى 2 GB1 إلى 2 GB
4 GB2 GB
8 GB فأكثر2 إلى 4 GB

تذكّر: Swap شبكة أمان وليس بديلًا عن الرام. إن رأيته مستعملًا باستمرار والسيرفر بطيء، فالحل الحقيقي تحديد استهلاك البرامج أو الترقية.