Go कोड का प्रोफाइलिंग: अड़चनों का पता लगाना
प्रदर्शन अनुकूलन डेवलपर के प्रमुख कार्यों में से एक है, खासकर जब Go पर उच्च-लोड सिस्टम की बात आती है। हालांकि, कुछ भी अनुकूलित करने से पहले, आपको यह जानना होगा कि कोड के कौन से हिस्से अड़चनें हैं। इसके लिए प्रोफाइलिंग मौजूद है - प्रोग्राम निष्पादन मेट्रिक्स का संग्रह और विश्लेषण।
इस लेख में, हम जानेंगे कि अंतर्निहित टूल: pprof और trace का उपयोग करके Go एप्लिकेशन को कैसे प्रोफाइल किया जाए। आप सीखेंगे कि CPU, मेमोरी, लॉक और गोरूटीन के अनुसार समस्या वाले स्थानों का पता कैसे लगाएं, और प्राप्त डेटा की व्याख्या कैसे करें।
प्रोफाइलिंग क्या है और इसकी आवश्यकता क्यों है?
प्रोफाइलिंग प्रोग्राम के निष्पादन के दौरान उसके काम करने के बारे में डेटा एकत्र करने की प्रक्रिया है। यह डेटा निम्नलिखित प्रश्नों के उत्तर देने में मदद करता है:
- कौन से फंक्शन सबसे अधिक CPU समय का उपभोग करते हैं?
- बड़ी मात्रा में मेमोरी कहाँ आवंटित की जा रही है?
- कौन सी गोरूटीन ब्लॉक हो रही हैं और किस कारण?
- सिस्टम कॉल या I/O ऑपरेशन में कितना समय लगता है?
Go बॉक्स से बाहर प्रोफाइलिंग के लिए शक्तिशाली टूल प्रदान करता है। इनमें से मुख्य हैं वेब एप्लिकेशन के लिए net/http/pprof और CLI उपयोगिताओं के लिए runtime/pprof।
pprof टूल: CPU और मेमोरी प्रोफाइल
pprof Go प्रोफाइलिंग के लिए मुख्य टूल है। यह CPU, मेमोरी, लॉक, गोरूटीन और म्यूटेक्स प्रतिस्पर्धा के प्रोफाइल एकत्र कर सकता है।
वेब एप्लिकेशन में pprof जोड़ना
प्रोफाइलिंग कनेक्ट करने का सबसे आसान तरीका net/http/pprof पैकेज को इम्पोर्ट करना है:
package main
import ( "net/http" _ "net/http/pprof" // pprof हैंडलर रजिस्टर करता है)
func main() { // आपका एप्लिकेशन http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}इसके बाद, /debug/pprof/ पते पर विभिन्न प्रोफाइल उपलब्ध होंगे। उदाहरण के लिए:
/debug/pprof/profile— CPU प्रोफाइल (डिफ़ॉल्ट 30 सेकंड)/debug/pprof/heap— मेमोरी प्रोफाइल (heap)/debug/pprof/goroutine— सभी गोरूटीन का डंप/debug/pprof/block— ब्लॉकिंग प्रोफाइल
CPU प्रोफाइल एकत्र करना
CPU प्रोफाइल एकत्र करने के लिए कमांड का उपयोग करें:
go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30संग्रह पूरा होने के बाद, pprof इंटरैक्टिव कंसोल खुल जाएगा। सबसे उपयोगी कमांड:
top— सबसे अधिक CPU उपभोग करने वाले फंक्शन दिखाएंlist <function>— समय का लाइन-बाय-लाइन ब्रेकडाउन दिखाएंweb— ब्राउज़र में कॉल ग्राफ खोलें (Graphviz आवश्यक)peek <function>— कॉल करने वाले और कॉल किए जाने वाले फंक्शन दिखाएं
top आउटपुट का उदाहरण:
Showing nodes accounting for 3.50s, 70% of 5.00s total flat flat% sum% cum cum% 1.20s 24.00% 24.00% 1.20s 24.00% encoding/json.(*Decoder).Decode 0.80s 16.00% 40.00% 0.80s 16.00% runtime.mallocgc 0.60s 12.00% 52.00% 1.80s 36.00% main.processData 0.50s 10.00% 62.00% 0.50s 10.00% runtime.memmove 0.40s 8.00% 70.00% 0.40s 8.00% strings.ToLowerमेमोरी प्रोफाइल एकत्र करना
मेमोरी उपयोग के विश्लेषण के लिए:
go tool pprof http://localhost:8080/debug/pprof/heapमेमोरी के लिए pprof में महत्वपूर्ण कमांड:
top— सबसे अधिक मेमोरी आवंटित करने वाले फंक्शनsample_index=alloc_space— आवंटित मेमोरी की कुल मात्रा पर स्विच करेंsample_index=inuse_space— वर्तमान उपयोग में मेमोरी पर स्विच करेंtr