انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

اكتشاف وحل تسرب الذاكرة

اكتشاف وحل تسربات الذاكرة على خوادم Linux، تحديد العملية التي تستهلك RAM، وتطبيق حلول قصيرة وطويلة المدى.

وقت القراءة: 13 دقيقة استكشاف الأخطاء وإصلاحها
ذاكرةتسرب الذاكرةRAMvalgrindsmemlinuxأداء

جدول المحتويات

مقدمة

يحدث تسرب الذاكرة عندما يفشل تطبيق في تحرير الذاكرة التي استخدمها بشكل صحيح، مما يتسبب في زيادة مستمرة في استخدام RAM بمرور الوقت. في نهاية المطاف، ينفد الذاكرة من النظام، ويمتلئ مساحة التبادل، ويتباطأ الخادم أو يتعطل.

الأعراض

علامات نموذجية لتسرب الذاكرة:

  • استخدام RAM يزداد باستمرار (يعود للطبيعي بعد إعادة التشغيل)
  • الذاكرة المتاحة في free -h تتناقص تدريجياً
  • استخدام مساحة التبادل يزداد
  • التطبيق يتباطأ بمرور الوقت
  • يتفعل OOM-killer ويقتل العمليات

الخطوة 1: فحص حالة الذاكرة الحالية

hljs bash
# حالة الذاكرة العامة
free -h

# معلومات الذاكرة التفصيلية
cat /proc/meminfo

# سجلات OOM-killer
dmesg | grep -i 'oom\|killed process\|out of memory'

الخطوة 2: أي عملية تستهلك أكثر الذاكرة؟

hljs bash
# الترتيب حسب استخدام الذاكرة
ps aux --sort=-%mem | head -20

# المراقبة في الوقت الفعلي مع top
top
# اضغط 'M' للترتيب حسب الذاكرة

# تحليل ذاكرة أكثر تفصيلاً مع smem
sudo apt install smem -y
smem -r -k | head -20

الخطوة 3: تأكيد تسرب الذاكرة

hljs bash
# إيجاد PID عملية معينة
pgrep -f app_name

# تسجيل استخدام الذاكرة كل 30 ثانية
while true; do
    echo "$(date): $(cat /proc/PID/status | grep VmRSS)"
    sleep 30
done

الخطوة 4: حلول خاصة بالتطبيقات

تسرب ذاكرة Node.js

hljs bash
# تعيين حد ذاكرة Node.js
node --max-old-space-size=512 app.js

# إعادة تشغيل تلقائي مع PM2 عند الوصول لحد الذاكرة
pm2 start app.js --max-memory-restart 500M

تسرب ذاكرة PHP-FPM

hljs bash
# /etc/php/8.x/fpm/pool.d/www.conf
# pm.max_requests = 500
# memory_limit = 256M

الخطوة 5: حلول طارئة

hljs bash
# مسح ذاكرة التخزين المؤقت للصفحات (آمن)
sync && echo 1 > /proc/sys/vm/drop_caches

# إعادة تشغيل الخدمة
sudo systemctl restart service_name

# حد الذاكرة مع systemd
# [Service]
# MemoryMax=512M

# إنشاء ملف تبادل
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

الخلاصة

لحل تسربات الذاكرة، حدد أولاً باستخدام ps aux وsmem أي عملية تستهلك الذاكرة، ثم أكد التسرب بمراقبة النمو بمرور الوقت. على المدى القصير، أعد تشغيل الخدمة المتسربة وطبق حد الذاكرة مع systemd. للإصلاح الدائم، افحص الكود المصدري للتطبيق باستخدام أدوات مثل Valgrind أو heapdump أو jmap.