محتويات الدورة

Go / المتقدم: السلامة والأداء وتصميم الخدمات / الدرس 16

التحليل وتشخيص التنفيذ

اختر أداة التشخيص التي تجيب السؤال الفعلي واحفظ حملا قابلا للتكرار قبل التحسين.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز أدلة المعالج والكومة والروتينات والحجب والتتبع.
  • جمع ملف محلي محدود بتنظيف صريح.
  • تفسير العينات دون اختراع توقيت عام.

ابدأ بعرض وفرضية

يوحي بطء الاستجابة وارتفاع المعالج والذاكرة المحتفظ بها والروتينات المحجوبة بأسئلة مختلفة. يأخذ ملف المعالج عينات العمل الجاري، ويظهر ملف الروتينات المكدسات، وتصف ملفات الكومة تخصيصا أو احتفاظا مأخوذ العينات، ويكشف التتبع الجدولة والحجب. اختر أداة تميز التفسيرات المتنافسة.

سجل الحجم وتوزيع المدخل والتزامن والأدوات والمنصة والخيارات. قد يكون ملف برنامج صغير خامل صالحا لكنه لا يصف المسار المهم. تحقق من الخرج بمرجع صحة ثم أعد عرض المورد ببيانات اصطناعية محدودة.

إنشاء ملف معالج محلي وإنهاؤه

يكتب المثال الأول ملفا مؤقتا جديدا فقط، ويوقف التحليل قبل فحصه ويزيله عند العودة. يجعل الحساب المعروف العمل ملحوظا. يثبت الملف غير الفارغ الجمع والإكمال، لا كفاية عينات حمل قصير لاستنتاج أداء.

قد تفشل StartCPUProfile وتكمل StopCPUProfile كتابة البيانات. أغلق الملف بعدها. وفي تحقيق فعلي احفظ الملف والتنفيذي المطابق عمدا في موضع آثار محلي معتمد وسجل الحمل، بدلا من الحذف. لا تكشف منفذ HTTP تحليليا لجمع مثال محلي.

go ملف معالج مؤقت مكتمل
package main

import (
	"fmt"
	"os"
	"runtime/pprof"
)

func main() {
	file, err := os.CreateTemp("", "go-course-cpu-*.pprof")
	if err != nil {
		panic(err)
	}
	defer os.Remove(file.Name())
	defer file.Close()
	if err := pprof.StartCPUProfile(file); err != nil {
		panic(err)
	}
	var total uint64
	for i := uint64(0); i < 1000000; i++ {
		total += i
	}
	pprof.StopCPUProfile()
	info, err := file.Stat()
	if err != nil {
		panic(err)
	}
	fmt.Println("sum", total, "profile written", info.Size() > 0)
}
الناتج المتوقع
sum 499999500000 profile written true

المجموع المعروف 499999500000؛ وتكتب نهاية التحليل بيانات دون ادعاء توقيت.

إرفاق وسوم تشخيص ذات معنى

تنسب وسوم pprof العينات المدعومة لعمل منطقي كمرحلة معالجة. اختر وسوما قليلة التنوع وغير سرية؛ فقد تشوش معرفات الأفراد ومحتويات الطلبات وتكشف معلومات. تساعد الوسوم التشخيص ولا تغير المزامنة أو الإلغاء أو الملكية.

يرفق المثال الثاني وسما ويسترجعه من السياق المشتق داخل pprof.Do، فيطبع قيمة حتمية لا عدد عينات. يظل تفسير الملف محتاجا فترة ممثلة وبناء مطابقا. ويختلف دعم الوسوم حسب نوع الملف فراجع العقد.

go وسم تشخيص محدود النطاق
package main

import (
	"context"
	"fmt"
	"runtime/pprof"
)

func main() {
	stage := ""
	pprof.Do(context.Background(), pprof.Labels("stage", "parse"), func(ctx context.Context) {
		stage, _ = pprof.Label(ctx, "stage")
	})
	fmt.Println("stage", stage)
}
الناتج المتوقع
stage parse

يحمل سياق الاستدعاء الراجع الوسم وتُقرأ قيمته parse.

العينات تحدد مرشحين لا أسبابا تلقائية

قد تمثل الدالة الساخنة عملا مفيدا أو خوارزمية ضعيفة أو تخصيصا متكررا أو عرض تصميم آخر. قارن الكلفة المباشرة والتراكمية وعلاقات الاستدعاء قبل التعديل. قد ينتظر روتين قناة بشكل صحيح؛ ويوحي بقاء عاملين مملوكين متشابهين بعد الإلغاء بعيب عمر.

تضيف الملفات كلفة وعدم يقين للعينات. قارن أحمالا وأبنية متكافئة ولا تعامل بناء race كأداء إنتاجي عادي. افحص توزيع زمن الاستجابة وتتبع البطيء لا المتوسط وحده. افصل سجل تراجع الصحة من تغييرات الأداء.

إبقاء الوصول التشخيصي محدودا ومقصودا

تسجل net/http/pprof معالجات تشخيص عند استيرادها بالطريقة الموثقة. وجهها واحمها عمدا في الخدمة ولا تجعل mux افتراضيا ينشرها على مستمع عام عرضا. قد تحتوي الملفات مسارات ووسوما وتفاصيل للمشغل الموثوق. يتجنب التحليل المحلي حد الشبكة كله.

بعد تحديد المرشح نفذ تغييرا مبررا واحدا وأعد اختبارات الصحة واجمع أدلة مكافئة. احفظ المدخل وبيانات البناء لتقييم تغير التنفيذ لاحقا. لا تختلق تسارعا عاما من عينة ولا تفترض أن دالة منخفضة في ملف واحد غير مهمة دائما.

الأخطاء الشائعة وإصلاحها

يستخدم ملف المعالج لشرح انتظار الإدخال.

لماذا يحدث؟
اختلطت عينات التنفيذ بزمن الاستجابة.
كيف تصلحه؟
استخدم الحجب والتتبع والتوقيت المناسب.
كيف تتجنب تكراره؟
حدد المورد الذي يقيسه كل دليل.

ينقص ملف بعد خروج مفاجئ.

لماذا يحدث؟
لم يوقف الجمع ويكمل صحيحا.
كيف تصلحه؟
أوقفه قبل إغلاق الوجهة أو الإنهاء.
كيف تتجنب تكراره؟
اجعل التنظيف ضمن الدالة المالكة.

تصبح نقاط التنقيح عامة.

لماذا يحدث؟
كشف التوجيه الافتراضي التشخيص عرضا.
كيف تصلحه؟
قيد الوصول وفوضه عمدا.
كيف تتجنب تكراره؟
راجع المستمعين وملكية mux عند النشر.

اختبر فهمك

1. خدمة بطيئة منخفضة المعالج. ما الأدلة قبل إعادة حلقات الحساب؟

اعرض الحل المشروح

افحص توقيت الطلبات والمكدسات وملفات الحجب والتتبع بحمل ممثل. ابحث عن انتظار التابع وتنافس الأقفال والصفوف والإلغاء الناقص. تأكد من تغطية فترة ملف المعالج للعرض ولا تعد انخفاضه صحة النظام. اختر التدخل بعد تمييز الانتظار من التنفيذ.

2. لماذا لا يلائم وسم يحوي كل معرف عميل خام؟

اعرض الحل المشروح

قد يخلق تنوعا هائلا يشوش التجميع ويفشي معلومات في الآثار المشتركة. استخدم فئات تشغيل قليلة كالمرحلة أو نوع العملية حيث تكفي مع سياسة خصوصية ووصول. ينبغي للوسوم مقارنة العمل لا أن تصبح سجل طلبات غير مقيد.

أهم ما تعلمته

  • اختر التشخيص من سؤال المورد وحمل قابل للتكرار.
  • أكمل الملفات واحفظ سياق البناء المطابق.
  • عامل كلفة التحليل وحدود العينات وكشف المنافذ كاعتبارات تصميم صريحة.

المراجع الرسمية