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

تشخيص الاستخدام العالي للمعالج والذاكرة

دليل تشخيص الاستخدام العالي للمعالج والذاكرة على الخوادم باستخدام أوامر top و htop و ps، آلية OOM killer، تحليل العمليات وتحسين الموارد.

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

مقدمة

يمكن أن يؤدي الاستخدام العالي للمعالج أو الذاكرة على خادمك إلى تدهور الأداء وانقطاع الخدمات وحتى عدم استجابة الخادم. في هذا الدليل، سنستعرض الأدوات والطرق التي يمكنك استخدامها لتحديد العمليات المستهلكة للموارد وحل المشكلة.

فحص الحالة السريع

أمر top

top هو الأداة الأساسية لمراقبة موارد النظام في الوقت الفعلي:

hljs bash
top

الحقول الرئيسية:

  • %CPU: نسبة استخدام المعالج
  • %MEM: نسبة استخدام الذاكرة
  • RES: استخدام RAM الفعلي
  • VIRT: استخدام الذاكرة الافتراضية
  • TIME+: إجمالي وقت CPU

اختصارات مفيدة:

  • P — ترتيب حسب استخدام CPU
  • M — ترتيب حسب استخدام الذاكرة
  • k — إنهاء عملية (أدخل PID)
  • 1 — عرض كل نواة CPU بشكل منفصل
  • c — عرض سطر الأوامر الكامل

أمر htop

htop هو نسخة أكثر تقدمًا وسهولة في الاستخدام من top:

hljs bash
# التثبيت
sudo apt install htop -y

# التشغيل
htop

مزايا htop:

  • واجهة مرئية ملونة
  • دعم الماوس
  • التمرير الأفقي والعمودي
  • عرض شجري (F5)
  • التصفية (F4) والبحث (F3)

عرض الحالة لمرة واحدة

hljs bash
# أعلى 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

تحديد العمليات ذات الاستخدام العالي للمعالج

hljs bash
# استخدام CPU في الوقت الفعلي
mpstat -P ALL 1 5

# استخدام CPU لكل عملية (فترات 5 ثوانٍ)
pidstat -u 5 3

# استخدام CPU لعملية محددة
pidstat -p رقم_PID 1

سجل استخدام CPU

hljs bash
# بيانات 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 تعني حمل زائد.

تحليل العمليات المكثفة للمعالج

hljs bash
# معلومات تفصيلية عن العملية
ps -p رقم_PID -o pid,ppid,user,%cpu,%mem,etime,cmd

# الملفات المفتوحة للعملية
lsof -p رقم_PID

# استدعاءات النظام للعملية
strace -p رقم_PID -c

# خيوط العملية
ps -T -p رقم_PID

تحليل استخدام RAM

فحص حالة الذاكرة

hljs bash
# حالة الذاكرة العامة
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".

تحديد العمليات المكثفة للذاكرة

hljs bash
# ترتيب حسب 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

hljs bash
# العمليات التي تستخدم 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

hljs bash
# البحث عن أحداث OOM Killer
dmesg | grep -i "oom\|out of memory"

# OOM في سجلات النظام
journalctl -k | grep -i oom

# أحداث OOM الأخيرة
grep -i 'oom' /var/log/syslog

فحص OOM Score

hljs bash
# OOM score لعملية
cat /proc/رقم_PID/oom_score

الحماية من OOM Killer

hljs bash
# حماية عملية حرجة من OOM Killer
echo -1000 > /proc/رقم_PID/oom_score_adj

# حماية OOM في خدمة systemd
[Service]
OOMScoreAdjust=-1000

إنهاء OOM Killer لعملية يشير إلى مشكلة ذاكرة خطيرة على خادمك. إضافة حماية OOM دون إيجاد السبب الجذري لن يحل المشكلة.

إدارة العمليات

تعديل أولوية العمليات

hljs bash
# البدء بقيمة nice (-20 أعلى، 19 أدنى أولوية)
nice -n 10 ./مهمة-طويلة.sh

# تغيير أولوية عملية قيد التشغيل
renice -n 15 -p رقم_PID

إنهاء العمليات

hljs bash
# إنهاء لطيف (SIGTERM)
kill رقم_PID

# إنهاء قسري (SIGKILL)
kill -9 رقم_PID

# إنهاء بالاسم
killall اسم_العملية
pkill -f "نمط_العملية"

سكريبت مراقبة الموارد

hljs bash
#!/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 مهم للكشف المبكر عن مشاكل الذاكرة.

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

ما هو load average وكيف يتم تفسيره؟

يُظهر load average متوسط حمل النظام خلال آخر 1 و 5 و 15 دقيقة. يجب مقارنته بعدد أنوية CPU. على خادم بـ 4 أنوية، load average بقيمة 4.0 يعني استخدام 100%. التجاوز المستمر لعدد الأنوية يشير إلى حمل زائد.

أمر free يُظهر ذاكرة حرة قليلة جدًا، هل هناك مشكلة؟

لا، Linux يستخدم الذاكرة الحرة كذاكرة تخزين مؤقت للقرص. الذاكرة المتاحة فعليًا موجودة في عمود 'available' في مخرجات free -h. إذا كانت هذه القيمة منخفضة، فهناك مشكلة في الذاكرة.

أي عملية ينهيها OOM Killer؟

ينهي OOM Killer العملية ذات أعلى oom_score، وهي عادةً العملية التي تستهلك أكبر قدر من الذاكرة. يمكنك حماية الخدمات الحرجة بتعيين oom_score_adj إلى -1000.

استخدام CPU 100% لكن لا أجد أي عملية، ماذا أفعل؟

اضغط 'c' في top لعرض سطر الأوامر الكامل. اضغط أيضًا 'H' لرؤية الخيوط. إذا كانت خيوط النواة (بين أقواس مربعة) تستخدم CPU عالي، فقد تكون مشكلة في العتاد أو التعريف.

استخدام swap مرتفع جدًا، ماذا أفعل؟

حدد أولاً أي العمليات تستخدم swap. إذا كانت RAM غير كافية، قم بترقية خطة الخادم. يمكنك تقليل swappiness (vm.swappiness=10) لجعل النظام يستخدم swap بشكل أقل. لكن الحل الحقيقي هو توفير RAM كافية.

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

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