تحليل الأداء واستكشاف الأعطال
تحليل الأداء واستكشاف الأعطال
يبدأ خادم إنتاجي في الاستجابة ببطء في الساعة الثانية فجرًا. يُطلق نظام التنبيه إنذاره. لديك دقائق لتشخيص المشكلة. يُعلّمك هذا الدرس المنهجية التي يستخدمها مهندسو SRE الكبار في شركات التكنولوجيا لتحديد نقاط الاختناق وتفسير إشارات الأداء وحلّها، حتى على الأنظمة غير المألوفة.
متوسط الحمل: ماذا يعني فعلًا؟
متوسط الحمل هو الرقم الأكثر سوء قراءة بين المهندسين. يظهر في مخرجات uptime وtop وhtop على شكل ثلاثة قيم: المتوسطات المتحركة الموزونة أسيًّا لمدة دقيقة واحدة وخمس دقائق وخمس عشرة دقيقة لطول طابور التشغيل — وهو عدد العمليات التي إما تعمل على المعالج أو تنتظر في حالة نوم لا يمكن مقاطعتها (انتظار قرص، أقفال نواة).
الفهم الجوهري: متوسط الحمل ليس معدل استخدام المعالج. آلة بأربعة أنوية معالجة ومتوسط حمل 4.0 مشبعة تمامًا — كل نواة لديها عملية واحدة تشغّلها ولا شيء ينتظر. الآلة نفسها بحمل 8.0 لديها في المتوسط 4 عمليات تنتظر المعالج في كل لحظة. على آلة بـ32 نواة، الحمل 8.0 هامش مريح.
nproc أو lscpu | grep "^CPU(s)"). النسبة فوق 1.0 تعني تشبّعًا؛ فوق 2.0 تعني تنافسًا شديدًا. نسبة قريبة من الصفر مع أوقات استجابة عالية تشير إلى انتظار الإدخال/الإخراج لا المعالج.
منهجية التشخيص السريع للأداء
أرسى المهندس Brendan Gregg من Netflix طريقة USE Method: لكل مورد (معالج، ذاكرة، أقراص، شبكة، أنظمة ملفات)، قِس الاستخدام والتشبع والأخطاء. التطبيق من الأعلى إلى الأسفل يُلغي التخمين:
- المعالج —
top/mpstat— تحقق من%userو%sysو%iowaitو%steal(على الأجهزة الافتراضية) - الذاكرة —
free -h/vmstat 1— راقب أعمدة swapsi/so؛ أي قيمة غير صفرية تعني تشبعًا - إدخال/إخراج التخزين —
iostat -xz 5—%utilقريب من 100% وawaitمرتفع (مللي ثانية) يُثبتان تشبع القرص - الشبكة —
ss -s/sar -n DEV 1— عدد الاتصالات، إعادة الإرسال، أخطاء الواجهة - العمليات —
ps aux --sort=-%cpu،pidstat 1— تحديد العملية المسببة للمشكلة
إيجاد نقاط الاختناق باستخدام vmstat وiostat
vmstat 1 هو مرقاب ضربات قلب نظامك — شغّله 10 ثوانٍ وراقب الأعمدة. عمود r (طابور التشغيل) يعكس متوسط الحمل لحظيًّا. عمود b يُظهر العمليات في نوم لا يمكن مقاطعتها — هذه تقريبًا دائمًا عالقة في انتظار الإدخال/الإخراج. أعمدة الصفحة الافتراضية si/so يجب أن تكون صفرًا؛ أي قيمة غير صفرية تعني أن النواة تتبادل الصفحات بشكل محموم.
strace: تتبع استدعاءات النظام
يعترض strace كل استدعاء نظام تُجريه عملية — open()، read()، write()، connect()، futex(). هكذا تشخّص عملية عالقة تستهلك المعالج دون فائدة، أو عملية تدور في حلقة على استدعاء stat() فاشل.
strace عبئًا بنسبة 10-30% عبر ptrace الذي يُسلسل استدعاءات النظام. لا تُرفقه أبدًا بعملية عالية الإنتاجية على خادم مُشبَع دون فهم هذه التكلفة. يُفضَّل الإرفاق بنسخة واحدة فقط، أو استخدام strace -c (ملخص فقط) لتحميل أخف.
اكتشافات نموذجية من strace: عملية تستدعي stat() مرارًا على ملف إعداد مفقود (خطأ في الإعداد)؛ عملية عالقة في futex(FUTEX_WAIT) إلى الأبد (توقف تام على كائن إقفال)؛ مئات استدعاءات connect() تعود جميعها بـECONNREFUSED (خدمة تابعة معطلة).
lsof: الملفات المفتوحة ومواصفات الملفات
في Linux، كل شيء ملف: المقابس، الأنابيب، عقد الأجهزة، الملفات الفعلية. يكشف lsof (قائمة الملفات المفتوحة) ما تمتلكه العملية مفتوحًا. هذا ضروري عند تشخيص أخطاء "Too many open files"، أو إيجاد العملية التي تحمل ملفًا محذوفًا (يمنع استرداد مساحة القرص)، أو اكتشاف العملية المتصلة بعنوان IP بعيد.
تجميع كل شيء: سيناريو تشخيص واقعي
قفز متوسط الحمل من 1.2 إلى 14 على خادم بـ8 أنوية. إليك النهج المنهجي:
- نفّذ
uptime— تأكد من أن 14/8 = 1.75× تشبّع. - نفّذ
vmstat 1—r=10،b=4،wa=60%. تأكّد ارتفاع انتظار الإدخال/الإخراج. - نفّذ
iostat -xz 1—/dev/sdaعند 99% استخدام،await=420ms. القرص هو نقطة الاختناق. - نفّذ
iotop -o—mysqldيكتب بمعدل 180 MB/s. - نفّذ
strace -c -p <PID mysqld>لمدة 5 ثوانٍ — 90% من الوقت فيwrite(). - نفّذ
lsof -p <PID mysqld> -i— 3,200 اتصال عميل. مجمع الاتصالات مستنفذ، العملاء ينتظرون. - السبب الجذري: مهمة دفعية منفلتة فتحت آلاف الاتصالات، كلها تُجري عمليات كتابة ضخمة. الحل: أوقف مهمة الدفعة، قيّد مجمع الاتصالات، أضف تحليل الاستعلامات البطيئة.
script أو مرّر المخرجات إلى ملف مختوم بالوقت. مراجعات ما بعد الحادثة تتطلب أدلة. في شركات التكنولوجيا الكبرى، مسار الأوامر المنفّذة جزء من تقرير الحادثة.