गाए गए, रूबी और रेल अनुप्रयोगों के लिए एक प्रोफाइलर फ्रंट-एंड

May 09 2023
क्या आपने कभी खुद को यह समझने के लिए इच्छुक पाया है कि रूबी कोड का एक ब्लॉक, एक विशेष वेब अनुरोध, या एक निश्चित नियंत्रक कार्रवाई इतनी धीमी गति से क्यों चल रही थी? हो सकता है कि आपने अतीत में स्पीडस्कोप जैसे कुछ प्रोफाइलिंग टूल का उपयोग किया हो, लेकिन यह बोझिल हो, या आपने कोशिश की हो लेकिन यह पता लगाने में विफल रहे कि उनका उपयोग कैसे किया जाए। पेश है सिंग्ड, जोश निकोल्स (उर्फ @technicalpickles) द्वारा लिखित गस्टो का एक नया प्रोफाइलिंग फ्रंटएंड।

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

फ्लेमग्राफ: कुछ भी... और बस!

पेश है सिंगड , जोश निकोल्स (उर्फ @technicalpickles) द्वारा लिखित गस्टो का एक नया प्रोफाइलिंग फ्रंटएंड । Singed को कई टूल्स ( स्टैकप्रोफ , आरबीएसपीई , और स्पीडस्कोप ) के लिए एक स्विस-आर्मी-नाइफ फ्रंटएंड के रूप में बनाया गया था, जो आपको फ्लेमग्राफ को आसानी से पकड़ने और देखने में मदद करता है, जहां पहले आपको शुरू करने के लिए बॉयलरप्लेट या अस्थायी कोड का एक गुच्छा लिखना पड़ता था। .

एक और प्रोफाइलिंग टूल क्यों?

Singed कर्नेल पर एक नई विधि जोड़ता है, हर जगह उपलब्ध:

flamegraph {
  # your code here
}

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

हालाँकि, हम अक्सर उन चीज़ों को प्रोफ़ाइल करना चाहते हैं जो हमारे ब्राउज़र के नेविगेशन बार में केवल वर्तमान URL नहीं हैं।

उदाहरण के लिए, हम एक ग्राफक्यूएल अनुरोध को प्रोफाइल करना चाह सकते हैं, जो अपोलो जैसे गेटवे के माध्यम से किया जाता है। हो सकता है कि हम उस URL को आसानी से न खोज पाएं जिसका उपयोग अपोलो गेटवे अपना अनुरोध करने के लिए कर रहा है, इसलिए फ्लेमग्राफ को कैप्चर करने के लिए रैक-मिनी-प्रोफाइलर को दोहराना और उपयोग करना मुश्किल है।

या, हो सकता है कि हम रूबी कोड या बैकग्राउंड जॉब, या यहां तक ​​​​कि एक परीक्षण के ब्लॉक को प्रोफाइल करना चाहें। ऐसा करने के लिए आप अपना खुद का कोड लिख सकते हैं और स्वयं स्टैकप्रोफ को कॉल कर सकते हैं, लेकिन आउटपुट को फ़ाइल में रीडायरेक्ट करने के लिए बॉयलरप्लेट की कुछ दर्जन लाइनें हैं, और फिर भी आपको इसे अपने ब्राउज़र में मैन्युअल रूप से खोलना होगा।

स्पीडस्कोप, स्टैकप्रोफ और आरबीएसपीई का उपयोग क्यों करें?

गाना मूल रूप से तीन अलग-अलग उपकरणों के आसपास एक आवरण है:

  • स्पीडस्कोप , एक फ्लेमग्राफ विजुअलाइज़र।
  • स्टैकप्रोफ , रूबी के लिए एक नमूना प्रोफाइलर।
  • rbspy , रुबी के लिए एक और सैंपलिंग प्रोफाइलर, जिसे रस्ट में लिखा गया है।
स्पीडस्कोप का विजुअलाइजर सुंदर और काफी तेज है, यहां तक ​​कि बड़े प्रोफाइल पर भी।

स्टैकप्रोफ रूबी के लिए एक नमूना प्रोफाइलर है। यह रूबी वीएम के लिए सी-एक्सटेंशन है, जिसका अर्थ है कि इसे एक ही समय में आपकी रूबी प्रक्रिया के साथ "शुरू" करना होगा। rbspy अलग तरीके से काम करता है - यह वास्तव में बाहर से रूबी प्रक्रिया की स्मृति को पढ़ने के लिए सूडो विशेषाधिकारों का उपयोग करता है। जैसे, इसे किसी भी समय रूबी प्रक्रिया से जोड़ा जा सकता है, यही वजह है कि Singed इसका उपयोग CLI से रूबी प्रक्रियाओं को प्रोफाइल करने के लिए करता है।

स्टैकप्रोफ और आरबीएसपी जैसे नमूना प्रोफाइलर एक बढ़िया विकल्प हैं क्योंकि वे बड़े कोडबेस के लिए काफी अच्छे हैं। हमारे एप्लिकेशन को चलाने में शामिल भारी मात्रा में कोड के कारण ट्रेसिंग प्रोफाइलर, जैसे रूबी-प्रोफ , गस्टो-स्केल में विफल हो जाते हैं।

अंत में, स्टैकप्रोफ और आरबीएसपीई के पास समुदाय में बड़ी मात्रा में समर्थन है। उदाहरण के लिए, नए रूबी संस्करणों का समर्थन करने के लिए हमें प्रोफाइलर का अपना अपग्रेड करने की ज़रूरत नहीं है।

एक त्वरित फीचर टूर

आइए देखें कि सिंगड वास्तव में क्या कर सकता है। Singed का उपयोग करने के मेरे पसंदीदा तरीकों में से एक है हमारे रेल ऐप में कोड के एक साधारण ब्लॉक को प्रोफाइल करना।

उदाहरण के लिए, मान लीजिए कि मैं एक बैकग्राउंड जॉब MyWorker को प्रोफाइल करना चाहता हूं। मैं myprofile.rb नामक एक फाइल बनाउंगा, इसे हमारे रेल एप्लिकेशन रूट में डालूंगा, और फिर जोड़ूंगा:

user = User.first
flamegraph { MyWorker.new.perform(user) }

bin/rails runner myprofile.rb

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

Singed एक परीक्षण को प्रोफाइल करना वास्तव में आसान बनाता है। इसका मतलब है कि आप निश्चित रूप से अपने टेस्ट सूट को प्रोफाइल और ऑप्टिमाइज़ कर सकते हैं, लेकिन वास्तव में मुझे प्रोफाइलिंग कोड के लिए यह अधिक उपयोगी लगता है जिसके लिए बहुत से विशेष सेटअप की आवश्यकता होती है:

require 'singed/rspec'
RSpec.describe YourClass do
  it "is slow :(", flamegraph: true do
    # your code here
  end
end

Singed के लिए एक अन्य उपयोग मामला प्रोफाइलिंग अनुरोध है। गुस्टो में, हमारे पास एक ग्राफक्लाइन गेटवे (अपोलो) है जो हमारे रेल बैकएंड के लिए अनुरोध करता है। कभी-कभी, मैं उन अनुरोधों को प्रोफाइल करना चाहता हूं, लेकिन रैक-मिनी-प्रोफाइलर के साथ ऐसा करना काफी मुश्किल है क्योंकि मुझे यूआरएल नहीं पता है और शरीर से अनुरोध करता है कि अपोलो बैकएंड रेल को भेज रहा है। इसके बजाय, सिंगड के साथ, मैं क्या करता हूं:

  • ग्राफ़िकल बैकएंड अनुरोध को फ्रंटएंड से ट्रिगर करें।
  • Chrome DevTools में, मैं उस अनुरोध को "fetch" के रूप में कॉपी करता हूं। यह मुझे इसे अपने जावास्क्रिप्ट कंसोल में पेस्ट करने और इस एक ग्राफक्यूएल अनुरोध को ऑन-डिमांड ट्रिगर करने की अनुमति देता है।
  • मैं अपने बैकएंड सर्वर को रोकता और पुनः आरंभ करता हूं, इस बार SINGED_MIDDLEWARE_ALWAYS_CAPTURE=1 पर्यावरण चर जोड़ रहा हूं।
  • मैं अपने जावास्क्रिप्ट कंसोल में अनुरोध को फिर से ट्रिगर करता हूं।

आप रेल एप्लिकेशन बूट को आसानी से प्रोफाइल भी कर सकते हैं:

bundle binstub singed
bin/singed -- bin/rails runner 'true'

कई उपयोगों वाला एक प्रोफाइलर फ्रंटेंड

उम्मीद है कि मैंने आपको सिंग्ड को आज़माने के लिए मना लिया है। मैं इसे यहां गुस्टो में लगभग रोजाना इस्तेमाल करता हूं।

यदि आपको यह रोचक लगा है, तो इसे GitHub पर देखें ।