اكتشاف وحل تسرب الذاكرة
اكتشاف وحل تسربات الذاكرة على خوادم Linux، تحديد العملية التي تستهلك RAM، وتطبيق حلول قصيرة وطويلة المدى.
جدول المحتويات
مقدمة
يحدث تسرب الذاكرة عندما يفشل تطبيق في تحرير الذاكرة التي استخدمها بشكل صحيح، مما يتسبب في زيادة مستمرة في استخدام RAM بمرور الوقت. في نهاية المطاف، ينفد الذاكرة من النظام، ويمتلئ مساحة التبادل، ويتباطأ الخادم أو يتعطل.
الأعراض
علامات نموذجية لتسرب الذاكرة:
- استخدام RAM يزداد باستمرار (يعود للطبيعي بعد إعادة التشغيل)
- الذاكرة المتاحة في
free -hتتناقص تدريجياً - استخدام مساحة التبادل يزداد
- التطبيق يتباطأ بمرور الوقت
- يتفعل OOM-killer ويقتل العمليات
الخطوة 1: فحص حالة الذاكرة الحالية
# حالة الذاكرة العامة
free -h
# معلومات الذاكرة التفصيلية
cat /proc/meminfo
# سجلات OOM-killer
dmesg | grep -i 'oom\|killed process\|out of memory'
الخطوة 2: أي عملية تستهلك أكثر الذاكرة؟
# الترتيب حسب استخدام الذاكرة
ps aux --sort=-%mem | head -20
# المراقبة في الوقت الفعلي مع top
top
# اضغط 'M' للترتيب حسب الذاكرة
# تحليل ذاكرة أكثر تفصيلاً مع smem
sudo apt install smem -y
smem -r -k | head -20
الخطوة 3: تأكيد تسرب الذاكرة
# إيجاد PID عملية معينة
pgrep -f app_name
# تسجيل استخدام الذاكرة كل 30 ثانية
while true; do
echo "$(date): $(cat /proc/PID/status | grep VmRSS)"
sleep 30
done
الخطوة 4: حلول خاصة بالتطبيقات
تسرب ذاكرة Node.js
# تعيين حد ذاكرة Node.js
node --max-old-space-size=512 app.js
# إعادة تشغيل تلقائي مع PM2 عند الوصول لحد الذاكرة
pm2 start app.js --max-memory-restart 500M
تسرب ذاكرة PHP-FPM
# /etc/php/8.x/fpm/pool.d/www.conf
# pm.max_requests = 500
# memory_limit = 256M
الخطوة 5: حلول طارئة
# مسح ذاكرة التخزين المؤقت للصفحات (آمن)
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.
مقالات ذات صلة
مشكلة اتصال SSH: لا يمكن الاتصال بالخادم — الحل
دليل حل مشاكل اتصال SSH: قواعد جدار حماية Path.net، Default Block، إنشاء قاعدة تصفية لمنفذ SSH وخطوات استكشاف الأخطاء وإصلاحها.
مشكلة اتصال RDP: لا يمكن الاتصال بـ Windows Server
دليل حل مشاكل اتصال RDP: قواعد جدار حماية Path.net، Default Block، إنشاء قاعدة تصفية لمنفذ RDP وخطوات استكشاف الأخطاء وإصلاحها.
كيفية إجراء اختبار MTR وإرسال النتائج للدعم
دليل اختبار الشبكة باستخدام WinMTR وLinux MTR، إنشاء قاعدة فلترة ICMP وإرسال النتائج لفريق الدعم. تشخيص فقدان الحزم والتأخير في الشبكة.