क्या आपका रेल ऐप धीमा है?
जब एक साधारण दृश्य लोड होने में कुछ सेकंड लगते हैं, तो आपको एक समस्या का पता चलता है।
आपके पास बहुत अधिक डेटाबेस कॉल या कुछ धीमी विधियाँ हो सकती हैं। या हो सकता है कि यह स्पीडअप लूप है जिसे किसी ने आपके कोड में डाल दिया और भूल गए।
आपको यह पता लगाने में मदद करने के लिए बहुत सारे टूल मिल सकते हैं कि आपके ऐप को धीमा क्या कर रहा है। कुछ हफ़्ते पहले, मैंने rbtrace
. के बारे में बात की थी . नए अवशेष का rpm
मणि ने मुझे अपने ऐप्स को गति देने में भी मदद की है।
लेकिन प्रदर्शन समस्याओं की खोज के लिए मेरा पसंदीदा टूल और भी बहुत कुछ करता है। बॉक्स से बाहर, यह आपको दिखाता है कि आपका कोड क्या कर रहा है। लेकिन जब आप इसमें एक प्लगइन जोड़ते हैं, तो यह और भी शक्तिशाली हो जाता है। यह आपको देखने . में मदद करता है आपके ऐप की प्रदर्शन समस्याएं, दृष्टिगत रूप से। और इससे आपको धीमे ऐप्स को तेज़ी से ढूंढने और ठीक करने में मदद मिल सकती है।
मेरा पसंदीदा रेल प्रोफाइलर
मेरे पसंदीदा रेल प्रदर्शन उपकरण को rack-mini-profiler
कहा जाता है . जब आप उस रत्न को अपने ऐप में जोड़ते हैं, तो आपको अपने प्रत्येक पृष्ठ पर एक छोटा सा संकेतक मिलता है। यह इस तरह दिखता है:
यदि आप उस बॉक्स पर क्लिक करते हैं, तो यह फैलता है और आप सभी प्रकार की शानदार चीजें देख सकते हैं। कौन से SQL कथन चलाए गए, आंशिक रेंडर करने में कितना समय लगा, और बहुत कुछ:
मिनीप्रोफाइलर आपको लगातार याद दिलाता है कि प्रत्येक पृष्ठ को लोड होने में कितना समय लगता है। इससे आपको यह जानने में मदद मिलती है कि आपका ऐप कैसा प्रदर्शन कर रहा है। आप एक सहज ज्ञान युक्त समझ का निर्माण करेंगे कि कौन से पृष्ठ धीमे हैं और कौन से तेज़ हैं। जब कोई पेज रेंडर होने में आश्चर्यजनक रूप से लंबा समय लेता है, तो आप नोटिस करना शुरू कर देंगे। और आप इसे तुरंत ठीक करना शुरू कर सकते हैं, जबकि यह अभी भी आपके दिमाग में है।
मिनीप्रोफाइलर अधिक कर सकता है। लेकिन सबसे पहले, आपको flamegraph
. इंस्टॉल करना होगा रत्न।
जब आप ऐसा करते हैं, तो आप अपने ऐप के प्रदर्शन को देखने के लिए एक नया तरीका अनलॉक करेंगे।
Flamegraphs:ठीक वैसे ही जैसे वे ध्वनि करते हैं
फ्लेमग्राफ इस तरह दिखता है:
बहुत स्पष्ट है कि नाम कहाँ से आया है, है ना?
rack-mini-profiler
स्थापित करने के बाद मणि और flamegraph
मणि, आप अपने किसी भी अनुरोध के लिए एक फ्लेमग्राफ देख सकते हैं। बस pp=flamegraph
जोड़ें एक HTTP पैरामीटर के रूप में, जो इस तरह दिखेगा:
https://www.example.com/restaurants?pp=flamegraph
फ्लेमग्राफ पॉप अप हो जाएगा, और आप ज़ूम इन और आउट कर सकते हैं, चारों ओर स्क्रॉल कर सकते हैं, और दिलचस्प चीज़ों को एक्सप्लोर करने का प्रयास कर सकते हैं।
फ्लेमग्राफ में प्रत्येक "परत" स्टैक ट्रेस में एक पंक्ति होती है:
और क्षैतिज अक्ष समय है। तो ग्राफ़ का सबसे बाईं ओर तब होता है जब आपका अनुरोध शुरू होता है, और सबसे दाईं ओर वह होता है जब अनुरोध समाप्त होता है।
तो, यह निश्चित रूप से अच्छा लग रहा है। लेकिन आप फ्लेमग्राफ से क्या कर सकते हैं?
फ्लेमग्राफ का उपयोग कैसे करें
क्योंकि एक्स अक्ष समय का प्रतिनिधित्व करता है, आप वास्तव में एक स्पष्ट तस्वीर प्राप्त कर सकते हैं कि आपका ऐप कहां फंस रहा है। सबसे चौड़ी परतें चलने में सबसे अधिक समय लेती हैं। वे पहले क्षेत्र हैं जिन पर आपको गौर करना चाहिए, क्योंकि उन्हें गति देने का सबसे बड़ा प्रभाव हो सकता है।
आपका ऐप आपके विचार को प्रस्तुत करने में कितना समय व्यतीत कर रहा है? नियंत्रक कार्रवाई में? डेटाबेस मार रहा है? आंशिक प्रतिपादन?
वे सभी वास्तव में देखने में आसान हैं, नेत्रहीन:
एक और उपयोगी चीज है जो एक फ्लेमग्राफ आपको दिखा सकता है:
क्या आपको ऐसे स्पाइक्स का गुच्छा दिखाई दे रहा है, जिनकी ऊंचाई लगभग समान है?
अक्सर इसका मतलब है कि आपके पास किसी प्रकार की N+1 क्वेरी है। आपके पास एक includes
. नहीं है कहीं, या एक एपीआई को कॉल का एक गुच्छा बनाना। अगर आपने एक includes
, आपको एक फ्लेमग्राफ मिलेगा जो इस तरह दिखता है:
अधिकांश प्रदर्शन टूल के साथ N+1 SQL क्वेरी को देखना बहुत आसान है:आप केवल समान दिखने वाले SQL कॉल की तलाश करते हैं। लेकिन गैर-एसक्यूएल एन+1 मुद्दे, जैसे एपीआई को कई बार हिट करना, नोटिस करना बहुत कठिन है। विशेष रूप से अगर आपकी लॉगिंग इतनी अच्छी नहीं है।
फ्लेमग्राफ के साथ, हालांकि, वे समस्याएं बहुत अधिक दिखाई देती हैं।
क्या ध्यान न दें
फ्लेमग्राफ भारी हो सकते हैं। वे आपको बहुत सारी जानकारी दिखाते हैं, और आप इसे एक ही बार में लेने के लिए बहुत मजबूर हैं। तो आप किस चीज़ को नज़रअंदाज़ कर सकते हैं?
आमतौर पर, आप ग्राफ़ की निचली और ऊपरी परतों को छोड़ सकते हैं। इसके बजाय, मैं ग्राफ़ के बीच में, या शायद ऊपर के रास्ते के 3/4 भाग की खोज करना शुरू करता हूं। यहीं मेरा कोड हैंगआउट होता है।
ग्राफ़ का शीर्ष आमतौर पर ActiveRecord- या IO-संबंधित होता है, और नीचे रेल फ्रेमवर्क कोड होता है, इसलिए यह समझ में आता है कि आपका कोड कहीं बीच में होगा।
क्या आपने कभी फ्लेमग्राफ का इस्तेमाल किया है? वे अनुकूलित करने के लिए सर्वोत्तम स्थान खोजने का एक शानदार तरीका हैं। कोशिश करके देखें! rack-mini-profiler
जोड़ें और flamegraph
आपके Gemfile
. के लिए रत्न . आपको आश्चर्य होगा कि आपको अपने कोड में कितनी अधिक जानकारी मिलेगी।