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

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

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

नाम कहां से आता है, यह बहुत स्पष्ट है, है ना?
rack-mini-profiler जेम और flamegraph जेम इंस्टॉल करने के बाद, आप अपने किसी भी अनुरोध के लिए एक फ्लेमग्राफ देख सकते हैं। बस एक HTTP पैरामीटर के रूप में pp=flamegraph जोड़ें, जो ऐसा दिखेगा:
https://www.example.com/restaurants?pp=flamegraph
फ्लेमग्राफ पॉप अप होगा, और आप ज़ूम इन और आउट कर सकते हैं, चारों ओर स्क्रॉल कर सकते हैं, और एक्सप्लोर करने के लिए दिलचस्प चीजें ढूंढने की कोशिश कर सकते हैं।
फ्लेमग्राफ में प्रत्येक "लेयर" एक स्टैक ट्रेस में एक लाइन है:

और क्षैतिज अक्ष समय है। इसलिए ग्राफ का सुदूर बायां हिस्सा वह है जब आपका अनुरोध शुरू हुआ, और सुदूर दायां हिस्सा वह है जब अनुरोध समाप्त हुआ।
तो, यह निश्चित रूप से कूल दिखता है। लेकिन आप फ्लेमग्राफ के साथ क्या कर सकते हैं?
फ्लेमग्राफ का उपयोग कैसे करें
क्योंकि X अक्ष समय को दर्शाता है, आप वास्तव में एक स्पष्ट तस्वीर प्राप्त कर सकते हैं कि आपका ऐप कहां अटक रहा है। सबसे चौड़ी लेयर्स चलने में सबसे लंबा समय लेती हैं। वे पहले क्षेत्र हैं जिनकी आपको जांच करनी चाहिए, क्योंकि उन्हें तेज करने से सबसे बड़ा प्रभाव पड़ सकता है।
आपका ऐप आपके व्यू को रेंडर करने में कितना समय खर्च कर रहा है? कंट्रोलर एक्शन में? डेटाबेस हिट करने में? पार्शियल रेंडर करने में?
वे सभी नेत्रहीन रूप से देखना वास्तव में आसान हैं:

एक और उपयोगी चीज है जो एक फ्लेमग्राफ आपको दिखा सकता है:
क्या आप एक गुच्छा स्पाइक्स देखते हैं जो सभी लगभग समान ऊंचाई के हैं, जैसे यह?

इसका अक्सर मतलब होता है कि आपके पास किसी प्रकार का N+1 क्वेरी है। आप कहीं एक includes भूल रहे हैं, या एक API के लिए ढेर सारे कॉल कर रहे हैं। यदि आपने एक includes जोड़ा, तो आपको एक फ्लेमग्राफ मिलेगा जो ऐसा दिखता है:

N+1 SQL क्वेरीज अधिकांश प्रदर्शन टूल्स के साथ देखना काफी आसान है: आप बस उन SQL कॉल्स को देखते हैं जो समान दिखते हैं। लेकिन गैर-SQL N+1 मुद्दे, जैसे किसी API को बहुत बार हिट करना, नोटिस करना बहुत कठिन है। विशेषकर यदि आपका लॉगिंग इतना अच्छा नहीं है।
हालांकि, फ्लेमग्राफ के साथ, वे समस्याएं बहुत अधिक दृश्यमान हैं।
किस पर ध्यान न दें
फ्लेमग्राफ भारी हो सकते हैं। वे आपको बहुत सारी जानकारी दिखाते हैं, और आप बहुत ज्यादा एक बार में इसे लेने के लिए मजबूर होते हैं। तो आप क्या अनदेखा कर सकते हैं?
आमतौर पर, आप ग्राफ के नीचे और ऊपर की लेयर्स को छोड़ सकते हैं। इसके बजाय, मैं ग्राफ के बीच में, या शायद शीर्ष से 3/4 रास्ते के आसपास एक्सप्लोर करना शुरू करता हूं। वहीं मेरा कोड घूमता रहता है।
ग्राफ का शीर्ष आमतौर पर ActiveRecord- या IO-संबंधित होता है, और नीचे रेल्स फ्रेमवर्क कोड होता है, इसलिए यह समझ में आता है कि आपका कोड बीच की ओर कहीं होगा।
क्या आपने कभी फ्लेमग्राफ का उपयोग किया है? वे अनुकूलित करने के लिए सर्वोत्तम स्थानों को खोजने का एक शानदार तरीका हैं। तो इसे आजमाएं! rack-mini-profiler और flamegraph जेम्स को अपने Gemfile में जोड़ें। आप आश्चर्यचकित होंगे कि आप अपने कोड में कितना अधिक अंतर्दृष्टि प्राप्त करेंगे।