ملف تعريف كود Go: إيجاد الاختناقات
تحسين الأداء هو أحد المهام الرئيسية للمطور، خاصة عندما يتعلق الأمر بالأنظمة عالية التحميل بلغة Go. ومع ذلك، قبل تحسين أي شيء، يجب أن تعرف بالضبط أي أجزاء الكود تمثل اختناقات. لهذا يوجد الملف التعريفي (Profiling) — جمع وتحليل مقاييس تنفيذ البرنامج.
في هذه المقالة، سنشرح كيفية عمل ملف تعريف لتطبيقات Go باستخدام الأدوات المدمجة: pprof و trace. ستتعلم كيفية إيجاد المشاكل المتعلقة بوحدة المعالجة المركزية (CPU)، الذاكرة، الأقفال، والجوروتينات (Goroutines)، وكذلك كيفية تفسير البيانات التي تم الحصول عليها.
ما هو الملف التعريفي ولماذا هو مطلوب؟
الملف التعريفي هو عملية جمع بيانات حول عمل البرنامج أثناء تنفيذه. تساعد هذه البيانات في الإجابة على الأسئلة:
- ما هي الدوال التي تستهلك معظم وقت المعالج؟
- أين يحدث تخصيص كمية كبيرة من الذاكرة؟
- ما هي الجوروتينات التي تتعطل (تُحظر) وعلى ماذا؟
- كم من الوقت يستغرق استدعاء النظام أو عملية الإدخال/الإخراج؟
توفر Go أدوات قوية للملف التعريفي مباشرة من الصندوق. أهمها net/http/pprof لتطبيقات الويب و runtime/pprof للأدوات المساعدة لواجهة سطر الأوامر (CLI).
أداة pprof: ملفات تعريف وحدة المعالجة المركزية (CPU) والذاكرة
pprof هي الأداة الرئيسية للملف التعريفي في Go. يمكنها جمع ملفات تعريف لوحدة المعالجة المركزية (CPU)، الذاكرة، الأقفال، الجوروتينات، وتنافس الميوتكس (Mutex).
إضافة pprof إلى تطبيق ويب
أسهل طريقة لتوصيل الملف التعريفي هي استيراد الحزمة net/http/pprof:
package main
import ( "net/http" _ "net/http/pprof" // يسجل معالجات pprof)
func main() { // تطبيقك http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}بعد ذلك، ستكون ملفات التعريف المختلفة متاحة على العنوان /debug/pprof/. على سبيل المثال:
/debug/pprof/profile— ملف تعريف وحدة المعالجة المركزية (CPU) (افتراضيًا 30 ثانية)/debug/pprof/heap— ملف تعريف الذاكرة (heap)/debug/pprof/goroutine— لقطة لجميع الجوروتينات/debug/pprof/block— ملف تعريف الأقفال (الانسدادات)
جمع ملف تعريف وحدة المعالجة المركزية (CPU)
لجمع ملف تعريف وحدة المعالجة المركزية (CPU)، استخدم الأمر:
go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30بعد اكتمال الجمع، سيتم فتح وحدة تحكم تفاعلية لـ pprof. الأوامر الأكثر فائدة:
top— إظهار الدوال التي تستهلك أكبر قدر من وحدة المعالجة المركزية (CPU)list <دالة>— إظهار تفصيل الوقت سطرًا بسطرweb— فتح رسم بياني للاستدعاءات في المتصفح (يتطلب Graphviz)peek <دالة>— إظهار الدوال المستدعية والمستدعاة
مثال على إخراج top:
Showing nodes accounting for 3.50s, 70% of 5.00s total flat flat% sum% cum cum% 1.20s 24.00% 24.00% 1.20s 24.00% encoding/json.(*Decoder).Decode 0.80s 16.00% 40.00% 0.80s 16.00% runtime.mallocgc 0.60s 12.00% 52.00% 1.80s 36.00% main.processData 0.50s 10.00% 62.00% 0.50s 10.00% runtime.memmove 0.40s 8.00% 70.00% 0.40s 8.00% strings.ToLowerجمع ملف تعريف الذاكرة
لتحليل استخدام الذاكرة:
go tool pprof http://localhost:8080/debug/pprof/heapأوامر مهمة في pprof للذاكرة:
top— الدوال التي تخصص أكبر قدر من الذاكرةsample_index=alloc_space— التبديل إلى إجمالي كمية الذاكرة المخصصةsample_index=inuse_space— التبديل إلى الذاكرة المستخدمة حاليًاtr