क्या आपका Rails ऐप धीमा है?
जब जो एक साधारण व्यू होना चाहिए उसे लोड होने में सेकंड लगते हैं, तो आपके पास खुदाई करने लायक समस्या है।
आपके पास बहुत सारे डेटाबेस कॉल या कुछ धीमे मेथड हो सकते हैं। या शायद यह वह स्पीडअप लूप है जिसे किसी ने आपके कोड में डाला और भूल गया।
आपको यह पता लगाने में मदद करने के लिए बहुत सारे टूल मिल सकते हैं कि आपके ऐप को क्या धीमा कर रहा है। कुछ हफ्ते पहले, मैंने rbtrace के बारे में बात की थी। New Relic के rpm जेम ने भी मेरे ऐप्स को तेज करने में मदद की है।
लेकिन मेरा पसंदीदा टूल प्रदर्शन समस्याओं का पता लगाने के लिए इससे कहीं अधिक करता है। बॉक्स से बाहर, यह आपको दिखाता है कि आपका कोड क्या कर रहा है। लेकिन जब आप इसमें एक प्लगइन जोड़ते हैं, तो यह और भी शक्तिशाली हो जाता है। यह आपको आपके ऐप की प्रदर्शन समस्याओं को देखने में मदद करता है, नेत्रहीन। और यह आपको धीमे ऐप्स को तेजी से ढूंढने और ठीक करने में मदद कर सकता है।
मेरा पसंदीदा Rails प्रोफाइलर
मेरा पसंदीदा Rails प्रदर्शन टूल rack-mini-profiler कहलाता है। जब आप उस जेम को अपने ऐप में जोड़ते हैं, तो आपको अपने प्रत्येक पेज पर एक छोटा इंडिकेटर मिलता है। यह ऐसा दिखता है:

अगर आप उस बॉक्स पर क्लिक करते हैं, तो यह विस्तारित होता है और आप सभी प्रकार की अच्छी चीजें देख सकते हैं। कौन से SQL स्टेटमेंट चले, पार्शियल रेंडर करने में कितना समय लगा, और बहुत कुछ:

MiniProfiler आपको हर पेज को लोड होने में कितना समय लगता है, इसकी निरंतर याद दिलाता है। यह आपको यह सीखने में मदद करता है कि आपका ऐप कैसा प्रदर्शन कर रहा है। आप एक सहज ज्ञान विकसित करेंगे कि कौन से पेज धीमे हैं, और कौन से तेज़। आप ध्यान देना शुरू कर देंगे जब एक पेज अप्रत्याशित रूप से लंबा समय लेता है। और आप इसे तुरंत ठीक करना शुरू कर सकते हैं, जबकि यह अभी भी आपके दिमाग में है।
MiniProfiler और अधिक कर सकता है। लेकिन पहले, आपको flamegraph जेम इंस्टॉल करना होगा।
जब आप ऐसा करते हैं, तो आप अपने ऐप के प्रदर्शन को देखने का एक नया तरीका अनलॉक करेंगे।
Flamegraphs: ठीक वैसे ही मजेदार जैसे वे सुनाई देते हैं
एक flamegraph ऐसा दिखता है:

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



