2015-01-08 20 views
6

का उपयोग करते हुए नोडजेस/वी 8 फ्लेमग्राफ में अज्ञात घटनाएं मैं ब्रेंडन ग्रेग here द्वारा वर्णित लिनक्स perf_events का उपयोग करके कुछ नोडज प्रोफाइलिंग करने का प्रयास करता हूं।perf_events

कार्यप्रवाह पीछा कर रहा है:

  1. रन नोड> 0.11.13 --perf-basic-prof, जो /tmp/perf-(PID).map फ़ाइल जहां जावास्क्रिप्ट प्रतीक मानचित्रण लिखा जाता है बनाता है के साथ।
  2. कब्जा this भंडार
  3. svg लौ ग्राफ उत्पन्न से perf record -F 99 -p `pgrep -n node` -g -- sleep 30
  4. फोल्ड stackcollapse-perf.pl स्क्रिप्ट का उपयोग कर के ढेर का उपयोग कर के ढेर का उपयोग कर flamegraph.pl स्क्रिप्ट

मैं परिणाम के बाद मिलता है (जो शुरुआत में वास्तव में अच्छा लग): enter image description here

समस्या यह है कि बहुत सारे [unknown] तत्व हैं, जो मुझे लगता है कि मेरे नोडजेस फ़ंक्शन होना चाहिए आयन कॉल मुझे लगता है कि पूरी प्रक्रिया बिंदु 3 पर कहीं भी विफल हो जाती है, जहां --perf-basic-prof के साथ निष्पादित नोड/v8 द्वारा उत्पन्न मैपिंग का उपयोग करके perf डेटा को फोल्ड किया जाना चाहिए। /tmp/perf-PID.map फ़ाइल बनाई गई है और नोड निष्पादन के दौरान कुछ मैपिंग लिखे गए हैं।

इस समस्या को हल करने के लिए कैसे करें?

मैं सेंटोस 6.5 x64 का उपयोग कर रहा हूं, और पहले से ही इसे सफलता के साथ नोड 0.11.13, 0.11.14 (दोनों प्रीबिल्ड, और संकलित) के साथ भी कोशिश की है।

उत्तर

13

सभी का सबसे अच्छा, क्या "[अज्ञात]" का अर्थ है नमूना फ़ंक्शन का नाम नहीं समझ सका, क्योंकि यह एक सिस्टम या लाइब्रेरी फ़ंक्शन है। यदि ऐसा है, तो यह ठीक है - आपको परवाह नहीं है, क्योंकि आप में कोड में सिस्टम कोड नहीं के लिए जिम्मेदार चीजों की तलाश में हैं।

असल में, मैं सुझाव दे रहा हूं कि यह उन XY questions में से एक है। भले ही आपको जो भी पूछा गया उसका सीधा जवाब मिल जाए, फिर भी इसका उपयोग कम होने की संभावना है। यहाँ वजहों हैं:

1. सीपीयू रूपरेखा एक मैं में कम इस्तेमाल की है/ओ बाध्य कार्यक्रम

अपने लौ ग्राफ में छोड़ दिया मैं क्या कर रहे हैं/ओ पर दो टावरों, तो वे शायद दाईं ओर बड़े ढेर की तुलना में बहुत अधिक दीवार-समय लें। इस लौ ग्राफ दीवार पर समय के नमूने से प्राप्त किए गए हैं, बल्कि सीपीयू समय नमूनों की तुलना में, यह अधिक है जो आपको बताता है कि नीचे दूसरा ग्राफ, जहां समय वास्तव में चला जाता है दिखाई देगा:

enter image description here

एक क्या था दाईं ओर बड़े रसदार दिखने वाले ढेर को कम कर दिया गया है, इसलिए यह कहीं भी महत्वपूर्ण नहीं है। दूसरी ओर, आई/ओ टावर बहुत व्यापक हैं। उन विस्तृत नारंगी पट्टियों में से कोई भी, यदि यह आपके कोड में है, तो बहुत से समय बचाने के अवसर का प्रतिनिधित्व करता है, यदि कुछ I/O से बचा जा सकता है।

2।चाहे कार्यक्रम CPU- है या मैं/हे बाध्य, speedup के अवसर आसानी से लौ रेखांकन

मान लें कि कुछ समारोह Foo कि वास्तव में कुछ बेकार कर रहा है, कि अगर आप इसके बारे में पता था, तो आप को ठीक कर सकता है से छुपा सकते हैं। मान लें कि लौ ग्राफ में, यह एक गहरा लाल रंग है। मान लीजिए कि इसे कोड में कई स्थानों से बुलाया जाता है, इसलिए यह सभी ज्वाला ग्राफ में एक स्थान पर एकत्र नहीं किया जाता है। बल्कि यह काला रूपरेखा द्वारा यहाँ दिखाया गया है कई छोटे स्थानों में प्रकट होता है:

enter image description here

सूचना, अगर उन सभी आयतों एकत्र किए गए थे, जैसा कि आप देख सकते हैं कि यह समय की 11% के लिए खातों, जिसका अर्थ है इसे देख लायक है । यदि आप अपना समय आधे में घटा सकते हैं, तो आप कुल 5.5% बचा सकते हैं। यदि यह वास्तव में पूरी तरह से टाला जा सकता है, तो आप कुल मिलाकर 11% बचा सकते हैं। उन छोटे आयतों में से प्रत्येक कुछ भी नीचे नहीं गिर जाएगा, और शेष ग्राफ को इसके दाहिनी तरफ खींच देगा।

अब मैं आपको the method I use दिखाऊंगा। मैं यादृच्छिक ढेर के नमूनों की एक मध्यम संख्या लेता हूं और प्रत्येक दिन नियमित रूप से जांच करता हूं जो तेज हो सकता है। तो जैसे लौ ग्राफ में नमूने लेने से मेल खाती है कि:

enter image description here

पतला खड़ी लाइनों बीस यादृच्छिक समय ढेर नमूने प्रतिनिधित्व करते हैं। जैसा कि आप देख सकते हैं, उनमें से तीन को एक्स के साथ चिह्नित किया गया है। वे लोग हैं जो Foo से गुजरते हैं। यह सही संख्या के बारे में है, क्योंकि 11% बार 20 2.2 है।

(उलझन में? ठीक है, यहां आपके लिए थोड़ी सी संभावना है। अगर आप 20 बार सिक्का फिसलते हैं, और इसमें सिर आने का 11% मौका है, तो आप कितने सिर प्राप्त करेंगे? तकनीकी रूप से यह एक द्विपदीय वितरण है। सबसे अधिक संभावना नंबर पर आप मिलेगा 2 है, अगले सबसे अधिक संभावना संख्या 1 और 3 कर रहे हैं (आप केवल 1 मिलता है, तो आप जब तक आप 2. पाने के लिए जा रहा रखने के लिए) यहाँ वितरण :)

enter image description here

(है Foo को देखने के लिए आपको नमूने की औसत संख्या 2/0.11 = 18.2 नमूने है।)

उन 20 नमूनों को देखकर थोड़ा मुश्किल लग सकता है, क्योंकि वे 20 से 50 स्तरों के बीच गहरे भागते हैं। हालांकि, आप मूल रूप से सभी कोड को अनदेखा कर सकते हैं जो आपके नहीं है। बस अपने कोड के लिए उन्हें जांचें। आप देखेंगे कि आप समय व्यतीत कर रहे हैं, और आपके पास कितना मोटा माप होगा। वे मतलब कोड अच्छी तरह से speedups, और के लिए कमरे के बहुत सारे हो सकता है वे आपको बताएंगे कि वो क्या है - दीप ढेर दोनों बुरी खबर और अच्छी खबर है।

कुछ भी आप देखते हैं कि आप अगर आप एक से अधिक नमूना पर देख ऊपर, गति सकता है, आप एक स्वस्थ speedup देते हैं, की गारंटी होगी। कारण आप एक से अधिक नमूने पर यह देखने के लिए किया जाता है, यदि आप केवल एक नमूना पर देख, आप केवल अपने समय को पता की जरूरत है शून्य नहीं है। यदि आप इसे एक से अधिक नमूने पर देखते हैं, तो आप अभी भी नहीं जानते कि इसमें कितना समय लगता है, लेकिन आप जानते हैं कि यह छोटा नहीं है। Here are the statistics.

+0

कामिल जेड यदि ऑफ cpu रूपरेखा कोशिश कर सकते हैं कार्य I/O बाध्य है, ग्रेग ने स्क्रिप्ट प्रकाशित की - http://stackoverflow.com/a/28784580/196561 इसके अलावा, "यादृच्छिक स्टैक नमूने" लेना (उदाहरण के लिए जीडीबी के साथ, या यहां तक ​​कि 'perf record -g' के साथ, फिर 'perf स्क्रिप्ट' कच्चे ढेर के नमूनों को पकड़ने के लिए, मैन्युअल परीक्षा के लिए कई यादृच्छिक ढेर लेना) यहां मदद नहीं कर सकता है क्योंकि 1) अल्पकालिक कार्यक्रम से जुड़ा होना मुश्किल हो सकता है (एलटीटीएनजी के साथ ट्रेसिंग मदद कर सकता है ...) 2) जीडीबी (या परफ रिकॉर्ड) अभी भी प्रतीक नामों की रिपोर्ट नहीं करेगा, फिर भी वाईमिल द्वारा पूछे गए वाई समस्या। आंतरिक node.js/v8 डीबगर उन्हें हल करने में मदद कर सकता है। – osgx

+0

@osgx: मैन्युअल नमूनाकरण के साथ, आपको इसकी परवाह नहीं है कि क्या I/O बाध्य है या नहीं, यह वही काम करता है। यदि कोई दिनचर्या कम रहता है तो आपको परवाह नहीं है - अगर इसे समय के महत्वपूर्ण अंश का उपयोग करने के लिए पर्याप्त समय कहा जाता है, तो नमूने इसे मार देंगे। (यदि पूरा कार्यक्रम नमूना के लिए बहुत तेज़ हो जाता है, तो मैं जो करता हूं वह एक अस्थायी बाहरी पाश जोड़ता है।) मुझे लगता है कि एक प्रोग्रामर की स्थिति में है, स्रोत कोड और डीबगर के साथ। अन्य स्थितियों के लिए मैं सलाह नहीं दे रहा हूं। –

+0

@ माइकडुनलेवी पहली बात मुझे स्पष्ट नहीं है। क्या यह समस्या तब होती है जब धागा प्रोफाइल किया जा रहा है वही धागा जो नमूने उत्पन्न कर रहा है? दूसरे शब्दों में, पहला ग्राफ I/O प्रतीक्षा समय नहीं दिखाता है कि यह प्रतीक्षा कर रहा है और किसी भी नमूने रिकॉर्ड नहीं कर सका। दूसरी ओर, यदि कोई अन्य थ्रेड नमूने उत्पन्न कर रहा है, तो यह लक्ष्य धागे के सभी प्रतीक्षा और प्रसंस्करण समय पर कब्जा कर लेगा और दूसरा ग्राफ उत्पन्न होगा। –

8

आम तौर पर यह एक विषय वस्तु विशेषज्ञ से असहमत होना एक बुरा विचार है लेकिन (सबसे बड़ा सम्मान के साथ) हम यहां जाते हैं!

तो जवाब का आग्रह निम्न करने के लिए: "।! कृपया सवाल का जवाब देने के लिए सुनिश्चित हो विवरण प्रदान करें और अपने शोध का हिस्सा"

तो सवाल यह था कि कम से कम मेरी व्याख्या यह है कि, पर्फ स्क्रिप्ट आउटपुट में [अज्ञात] फ्रेम क्यों हैं (और मैं इन अज्ञात नामों को सार्थक नामों में कैसे बदलूं)? यह प्रश्न हो सकता है "मेरे सिस्टम के प्रदर्शन में सुधार कैसे करें?" लेकिन मैं इस विशेष मामले में इसे इस तरह से नहीं देखता हूं। यहां पर एक वास्तविक समस्या है कि कैसे perf रिकॉर्ड डेटा संसाधित किया गया है।

सवाल का जवाब है कि हालांकि शर्त की स्थापना सही है: सही नोड संस्करण, सही तर्क समारोह के नाम (--perf-बुनियादी प्रोफेसर) उत्पन्न करने के लिए, नक्शा पर्फ़ उत्पन्न उपस्थित थे अपेक्षित आउटपुट का उत्पादन करने के लिए फ़ाइल को perf स्क्रिप्ट के लिए रूट के स्वामित्व में होना चाहिए।

यही है!

आज कुछ नई लिपियों को लिखना मैंने इस SO सवाल पर मुझे निर्देशित करने के लिए अपनाना मारा।

यहाँ अतिरिक्त संदर्भ की एक जोड़ी है:

https://yunong.io/2015/11/23/generating-node-js-flame-graphs/

https://github.com/jrudolph/perf-map-agent/blob/d8bb58676d3d15eeaaf3ab3f201067e321c77560/bin/create-java-perf-map.sh#L22

[गैर-रूट फ़ाइलें कभी कभी मजबूर किया जा सकता है] http://www.spinics.net/lists/linux-perf-users/msg02588.html