تشخيص الاستخدام العالي للمعالج والذاكرة
دليل تشخيص الاستخدام العالي للمعالج والذاكرة على الخوادم باستخدام أوامر top و htop و ps، آلية OOM killer، تحليل العمليات وتحسين الموارد.
جدول المحتويات
مقدمة
يمكن أن يؤدي الاستخدام العالي للمعالج أو الذاكرة على خادمك إلى تدهور الأداء وانقطاع الخدمات وحتى عدم استجابة الخادم. في هذا الدليل، سنستعرض الأدوات والطرق التي يمكنك استخدامها لتحديد العمليات المستهلكة للموارد وحل المشكلة.
فحص الحالة السريع
أمر top
top هو الأداة الأساسية لمراقبة موارد النظام في الوقت الفعلي:
top
الحقول الرئيسية:
- %CPU: نسبة استخدام المعالج
- %MEM: نسبة استخدام الذاكرة
- RES: استخدام RAM الفعلي
- VIRT: استخدام الذاكرة الافتراضية
- TIME+: إجمالي وقت CPU
اختصارات مفيدة:
P— ترتيب حسب استخدام CPUM— ترتيب حسب استخدام الذاكرةk— إنهاء عملية (أدخل PID)1— عرض كل نواة CPU بشكل منفصلc— عرض سطر الأوامر الكامل
أمر htop
htop هو نسخة أكثر تقدمًا وسهولة في الاستخدام من top:
# التثبيت
sudo apt install htop -y
# التشغيل
htop
مزايا htop:
- واجهة مرئية ملونة
- دعم الماوس
- التمرير الأفقي والعمودي
- عرض شجري (F5)
- التصفية (F4) والبحث (F3)
عرض الحالة لمرة واحدة
# أعلى 10 عمليات حسب استخدام CPU
ps aux --sort=-%cpu | head -11
# أعلى 10 عمليات حسب استخدام RAM
ps aux --sort=-%mem | head -11
# عمليات مستخدم محدد
ps -u www-data --sort=-%cpu
# عرض شجرة العمليات
ps auxf
تحليل استخدام CPU
تحديد العمليات ذات الاستخدام العالي للمعالج
# استخدام CPU في الوقت الفعلي
mpstat -P ALL 1 5
# استخدام CPU لكل عملية (فترات 5 ثوانٍ)
pidstat -u 5 3
# استخدام CPU لعملية محددة
pidstat -p رقم_PID 1
سجل استخدام CPU
# بيانات CPU التاريخية مع sar
sar -u 1 10
# استخدام CPU لآخر 24 ساعة
sar -u -f /var/log/sysstat/sa$(date +%d)
# فحص load average
uptime
cat /proc/loadavg
يجب مقارنة قيمة load average بعدد أنوية CPU. على خادم بـ 4 أنوية، load average بقيمة 4.0 يعني استخدام CPU بنسبة 100%. قيمة 8.0 تعني حمل زائد.
تحليل العمليات المكثفة للمعالج
# معلومات تفصيلية عن العملية
ps -p رقم_PID -o pid,ppid,user,%cpu,%mem,etime,cmd
# الملفات المفتوحة للعملية
lsof -p رقم_PID
# استدعاءات النظام للعملية
strace -p رقم_PID -c
# خيوط العملية
ps -T -p رقم_PID
تحليل استخدام RAM
فحص حالة الذاكرة
# حالة الذاكرة العامة
free -h
# معلومات الذاكرة التفصيلية
cat /proc/meminfo
# ملخص استخدام الذاكرة
vmstat 1 5
قراءة مخرجات free -h:
total used free shared buff/cache available
Mem: 16Gi 8.2Gi 1.1Gi 256Mi 6.7Gi 7.2Gi
Swap: 4.0Gi 512Mi 3.5Gi
في Linux، قد تبدو الذاكرة "الحرة" منخفضة لأن النظام يستخدم الذاكرة الحرة كذاكرة تخزين مؤقت للقرص. الذاكرة المتاحة فعليًا موجودة في عمود "available".
تحديد العمليات المكثفة للذاكرة
# ترتيب حسب RSS (Resident Set Size)
ps aux --sort=-rss | head -11
# تحليل الذاكرة التفصيلي مع smem
sudo apt install smem -y
smem -t -k -s rss
# استخدام الذاكرة لكل عملية
pmap -x رقم_PID
تحليل استخدام Swap
# العمليات التي تستخدم swap
for file in /proc/*/status; do
awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $file
done | sort -k 2 -n -r | head -10
# مراقبة نشاط swap
vmstat 1 10
# قيمة swappiness
cat /proc/sys/vm/swappiness
# تعيين swappiness (مؤقت)
sudo sysctl vm.swappiness=10
# تعيين swappiness (دائم)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
آلية OOM Killer
يقوم نواة Linux بتفعيل OOM (Out of Memory) Killer عند نفاد الذاكرة، وينهي العملية التي تستهلك أكبر قدر من الذاكرة.
فحص سجلات OOM Killer
# البحث عن أحداث OOM Killer
dmesg | grep -i "oom\|out of memory"
# OOM في سجلات النظام
journalctl -k | grep -i oom
# أحداث OOM الأخيرة
grep -i 'oom' /var/log/syslog
فحص OOM Score
# OOM score لعملية
cat /proc/رقم_PID/oom_score
الحماية من OOM Killer
# حماية عملية حرجة من OOM Killer
echo -1000 > /proc/رقم_PID/oom_score_adj
# حماية OOM في خدمة systemd
[Service]
OOMScoreAdjust=-1000
إنهاء OOM Killer لعملية يشير إلى مشكلة ذاكرة خطيرة على خادمك. إضافة حماية OOM دون إيجاد السبب الجذري لن يحل المشكلة.
إدارة العمليات
تعديل أولوية العمليات
# البدء بقيمة nice (-20 أعلى، 19 أدنى أولوية)
nice -n 10 ./مهمة-طويلة.sh
# تغيير أولوية عملية قيد التشغيل
renice -n 15 -p رقم_PID
إنهاء العمليات
# إنهاء لطيف (SIGTERM)
kill رقم_PID
# إنهاء قسري (SIGKILL)
kill -9 رقم_PID
# إنهاء بالاسم
killall اسم_العملية
pkill -f "نمط_العملية"
سكريبت مراقبة الموارد
#!/bin/bash
CPU_THRESHOLD=90
MEM_THRESHOLD=90
LOG_FILE="/var/log/resource-monitor.log"
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | cut -d'.' -f1)
if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
echo "[$TIMESTAMP] تحذير: استخدام CPU $CPU_USAGE%" >> $LOG_FILE
ps aux --sort=-%cpu | head -6 >> $LOG_FILE
fi
MEM_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100)}')
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
echo "[$TIMESTAMP] تحذير: استخدام RAM $MEM_USAGE%" >> $LOG_FILE
ps aux --sort=-%mem | head -6 >> $LOG_FILE
fi
sleep 60
done
الخلاصة
الاستخدام العالي للمعالج والذاكرة مشاكل حرجة تؤثر مباشرة على أداء الخادم. باستخدام أدوات مثل top و htop و ps و vmstat، يمكنك تحديد العمليات المشكلة وضبط الأولويات باستخدام nice/renice وإنهاء العمليات عند الضرورة. الفحص المنتظم لسجلات OOM Killer مهم للكشف المبكر عن مشاكل الذاكرة.
مقالات ذات صلة
مشكلة اتصال SSH: لا يمكن الاتصال بالخادم — الحل
دليل حل مشاكل اتصال SSH: قواعد جدار حماية Path.net، Default Block، إنشاء قاعدة تصفية لمنفذ SSH وخطوات استكشاف الأخطاء وإصلاحها.
مشكلة اتصال RDP: لا يمكن الاتصال بـ Windows Server
دليل حل مشاكل اتصال RDP: قواعد جدار حماية Path.net، Default Block، إنشاء قاعدة تصفية لمنفذ RDP وخطوات استكشاف الأخطاء وإصلاحها.
كيفية إجراء اختبار MTR وإرسال النتائج للدعم
دليل اختبار الشبكة باستخدام WinMTR وLinux MTR، إنشاء قاعدة فلترة ICMP وإرسال النتائج لفريق الدعم. تشخيص فقدان الحزم والتأخير في الشبكة.