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

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

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

وقت القراءة: 13 دقيقة استكشاف الأخطاء وإصلاحها
ذاكرةتسرب الذاكرةRAMvalgrindsmemlinuxأداء
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

مقدمة

يحدث تسرب الذاكرة عندما يفشل تطبيق في تحرير الذاكرة التي استخدمها بشكل صحيح، مما يتسبب في زيادة مستمرة في استخدام 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.

الأسئلة الشائعة

ما الفرق بين تسرب الذاكرة والاستخدام العالي للذاكرة؟

الاستخدام العالي للذاكرة قد يكون طبيعياً. في تسرب الذاكرة، يزداد استخدام RAM باستمرار ولا ينخفض أبداً. إذا عاد للطبيعي بعد إعادة تشغيل الخادم، فهناك تسرب.

ما هو OOM-killer ولماذا يقتل العمليات؟

OOM-killer هو آلية في نواة Linux تقتل تلقائياً العملية الأكثر استهلاكاً للذاكرة لإنقاذ النظام عند نفاد الذاكرة. استخدم 'dmesg | grep oom' لمعرفة أي عملية تم قتلها.

هل أمر drop_caches آمن؟

مسح ذاكرة التخزين المؤقت للصفحات (echo 1) آمن بشكل عام، لكنه يزيد مؤقتاً من I/O القرص. تجنب استخدامه في أوقات الذروة في بيئة الإنتاج.

كيف يمكنني إصلاح تسرب الذاكرة بشكل دائم؟

الإصلاح الدائم يتطلب فحص الكود المصدري للتطبيق. استخدم أدوات مثل Valgrind أو heapdump أو jmap. على المدى القصير، طبق حد MemoryMax مع systemd.

مقالات ذات صلة

حركة الشبكةالداخل Gbpsالخارج Gbps