رسوم اللهب
ما فائدة رسم اللهب؟
تُعد رسوم اللهب وسيلةً لتصور وقت وحدة المعالجة المركزية (CPU) المُستهلك في الدوال. يمكنها مساعدتك في تحديد مكان استهلاك الكثير من الوقت في إجراء العمليات المتزامنة.
كيفية إنشاء رسم اللهب
قد تكون سمعت أن إنشاء رسم اللهب لـ Node.js أمر صعب، لكن هذا ليس صحيحًا (بعد الآن). لم تعد أنظمة Solaris vms ضرورية لرسوم اللهب!
يتم إنشاء رسوم اللهب من مخرجات perf
، وهي ليست أداة خاصة بـ Node. بينما تُعد الطريقة الأكثر فعالية لتصور وقت وحدة المعالجة المركزية المُستهلك، فقد تواجه مشكلات في كيفية تحسين تعليمات JavaScript في Node.js 8 والإصدارات الأحدث. انظر قسم مشاكل مخرجات perf أدناه.
استخدام أداة مُعلبة مسبقًا
إذا كنت تريد خطوة واحدة لإنتاج رسم اللهب محليًا، فجرّب 0x
لتشخيص عمليات النشر الإنتاجية، اقرأ هذه الملاحظات: خوادم إنتاج 0x.
إنشاء رسم اللهب باستخدام أدوات النظام perf
يهدف هذا الدليل إلى إظهار الخطوات المتضمنة في إنشاء رسم اللهب والحفاظ على التحكم في كل خطوة.
إذا كنت تريد فهم كل خطوة بشكل أفضل، فانظر إلى الأقسام التالية حيث نتعمق في التفاصيل.
دعنا نبدأ العمل الآن.
- قم بتثبيت
perf
(عادةً ما يكون متوفرًا من خلال حزمةlinux-tools-common
إذا لم يكن مثبتًا بالفعل) - حاول تشغيل
perf
- قد يشتكي من وجود وحدات نواة مفقودة، قم بتثبيتها أيضًا - قم بتشغيل Node مع تمكين
perf
(انظر مشاكل مخرجات perf للحصول على نصائح خاصة بإصدارات Node.js)
perf record -e cycles:u -g -- node --perf-basic-prof app.js
- تجاهل التحذيرات ما لم تكن تقول إنك لا تستطيع تشغيل
perf
بسبب وجود حزم مفقودة؛ قد تحصل على بعض التحذيرات حول عدم القدرة على الوصول إلى عينات وحدة النواة التي لا تريدها على أي حال. - قم بتشغيل
perf script > perfs.out
لإنشاء ملف البيانات الذي ستقوم بتصوره في لحظة. من المفيد تطبيق بعض التنظيف للحصول على رسم بياني أكثر قابلية للقراءة - قم بتثبيت
stackvis
إذا لم يكن مثبتًا بعدnpm i -g stackvis
- قم بتشغيل
stackvis perf < perfs.out > flamegraph.htm
الآن افتح ملف رسم اللهب في متصفحك المفضل وشاهده وهو يحترق. إنه مُشفّر بالألوان حتى تتمكن من التركيز على أشرطة البرتقالي الأكثر تشبعًا أولاً. من المرجح أن تمثل الدوال كثيفة وحدة المعالجة المركزية.
تجدر الإشارة - إذا نقرت على عنصر من رسم اللهب، فسيتم عرض تكبير لمحيطه فوق الرسم البياني.
استخدام perf
لمعاينة عملية قيد التشغيل
هذا رائع لتسجيل بيانات رسم اللهب من عملية قيد التشغيل بالفعل والتي لا تريد مقاطعتها. تخيل عملية إنتاجية بها مشكلة يصعب إعادة إنتاجها.
perf record -F99 -p `pgrep -n node` -- sleep 3
ما هو sleep 3
؟ إنه موجود لإبقاء perf
قيد التشغيل - على الرغم من أن خيار -p
يشير إلى معرف عملية مختلف، إلا أن الأمر يحتاج إلى تنفيذه على عملية وينتهي بها. يعمل perf
طوال عمر الأمر الذي تمرره إليه، سواء كنت تقوم بتحليل هذا الأمر أم لا. يضمن sleep 3
تشغيل perf
لمدة 3 ثوانٍ.
لماذا تم تعيين -F
(تردد المعاينة) إلى 99؟ إنه افتراض معقول. يمكنك الضبط إذا أردت. يُخبر -F99
perf
بأخذ 99 عينة في الثانية، لتحقيق دقة أكبر، زِد القيمة. يجب أن تنتج القيم المنخفضة مخرجات أقل مع نتائج أقل دقة. تعتمد الدقة التي تحتاجها على المدة التي تعمل بها وظائف وحدة المعالجة المركزية كثيفة الاستخدام بالفعل. إذا كنت تبحث عن سبب تباطؤ ملحوظ، فيجب أن يكون 99 إطارًا في الثانية أكثر من كافٍ.
بعد الحصول على سجل perf
لمدة 3 ثوانٍ، تابع بإنشاء رسم اللهب باستخدام الخطوتين الأخيرتين من الأعلى.
تصفية وظائف Node.js الداخلية
عادةً، تريد فقط إلقاء نظرة على أداء مكالماتك، لذلك يمكن أن يجعل تصفية وظائف Node.js و V8 الداخلية الرسم أسهل بكثير في القراءة. يمكنك تنظيف ملف perf
الخاص بك باستخدام:
sed -i -r \
-e '/(_libc_start|LazyCompile) |v8::internal::BuiltIn|Stub|LoadIC:\\[\\[' \
-e '/^$/d' \
perf.data > perf.out
إذا قرأت رسم اللهب الخاص بك وبدى غريبًا، كما لو أن شيئًا ما مفقود في الوظيفة الرئيسية التي تستغرق معظم الوقت، فحاول إنشاء رسم اللهب الخاص بك بدون عوامل التصفية - ربما حصلت على حالة نادرة لمشكلة في Node.js نفسها.
خيارات معاينة Node.js
--perf-basic-prof-only-functions
و --perf-basic-prof
هما الخياران المفيدان في تصحيح أخطاء كود JavaScript الخاص بك. تُستخدم الخيارات الأخرى لمعاينة Node.js نفسها، وهو ما خارج نطاق هذا الدليل.
ينتج --perf-basic-prof-only-functions
مخرجات أقل، لذلك فهو الخيار الأقل تكلفة.
لماذا أحتاجها على الإطلاق؟
حسنًا، بدون هذه الخيارات، ستحصل على رسم بياني لهب، ولكن مع معظم الأشرطة المسمّاة v8::Function::Call
.
مشكلات مُخرجات Perf
تغييرات خط أنابيب Node.js 8.x V8
يأتي Node.js 8.x والإصدارات الأحدث مع تحسينات جديدة لخط أنابيب تجميع جافا سكريبت في محرك V8 مما يجعل أسماء/مراجع الدوال غير قابلة للوصول لـ perf في بعض الأحيان. (يُسمى Turbofan)
النتيجة هي أنك قد لا تحصل على أسماء الدوال الصحيحة في رسم بياني اللهب.
ستلاحظ ByteCodeHandler:
حيث تتوقع أسماء الدوال.
يحتوي 0x على بعض التخفيضات لذلك مدمجة فيه.
للحصول على التفاصيل، راجع:
- https://github.com/nodejs/benchmarking/issues/168
- https://github.com/nodejs/diagnostics/issues/148#issuecomment-369348961
Node.js 10+
يعالج Node.js 10.x المشكلة مع Turbofan باستخدام علم --interpreted-frames-native-stack
.
شغّل node --interpreted-frames-native-stack --perf-basic-prof-only-functions
للحصول على أسماء الدوال في رسم بياني اللهب بغض النظر عن خط أنابيب V8 المستخدم لتجميع جافا سكريبت الخاص بك.
تسميات تالفة في رسم بياني اللهب
إذا كنت ترى تسميات تبدو كالتالي
node`_ZN2v88internal11interpreter17BytecodeGenerator15VisitStatementsEPMS0_8Zone
فهذا يعني أن perf Linux الذي تستخدمه لم يتم تجميعه مع دعم demangle، راجع https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1396654 على سبيل المثال
أمثلة
تدرب على التقاط رسومات بيانية اللهب بنفسك باستخدام تمارين رسم بياني اللهب!