2009-07-15 22 views
9

पेर्फ सोम में हमारे आवेदन की निगरानी करते समय मैंने देखा कि समय में जीसी का समय 20-60% से कहीं भी है जबकि हमारा आवेदन लंबी चल रही प्रक्रिया कर रहा है (भिन्न होता है 30 सेकंड से 1.5 मिनट के बीच)। यह मेरे लिए थोड़ा अधिक लगता है। यह दो महत्वपूर्ण प्रश्न उठाता है।पेर्फ सोम में उच्च "% समय में जीसी" देखने के कारण

  1. क्या मैं यह अत्यधिक सही करता हूं?
  2. रूट्स मैं यह समझने के लिए ले सकता हूं कि जीसी क्यों हो रहा है?
+0

क्या यह एएसपी.नेट है? –

+0

ध्यान देने योग्य एक बात यह है कि यह प्रदर्शन काउंटर अंतिम अनुमानित मूल्य दिखाता है, न कि निरंतर औसत। यह केवल हर जीसी चक्र के अंत में अद्यतन किया जाता है। – adrianbanks

+0

यह एक स्वयं होस्टेड डब्ल्यूसीएफ सेवा में है। –

उत्तर

12

हां, यह अत्यधिक ध्वनि करता है। जीसी की मात्रा को कम करना संभवतः एकमात्र बेहतरीन कदम होगा जो आप अपने आवेदन के रनटाइम को कम करने के लिए ले सकते हैं (यदि यह आपका लक्ष्य है)।

जीसी में एक उच्च "% समय" आमतौर पर आवंटित करने और फिर हजारों या लाखों वस्तुओं को फेंकने के कारण होता है। क्या हो रहा है यह जानने का एक अच्छा तरीका है मेमोरी प्रोफाइलर टूल का उपयोग करना।

माइक्रोसॉफ्ट मुफ्त CLR Profiler प्रदान करता है। यह आपको हर आवंटन दिखाएगा, लेकिन आपके ऐप को 10-60 गुना धीमा कर देगा। आपको इसे कम इनपुट डेटा पर चलाने की आवश्यकता हो सकती है ताकि यह उचित समय में विश्लेषण समाप्त कर सके।

एक महान वाणिज्यिक उपकरण साइटेक के .NET Memory Profiler है। यह बहुत कम रनटाइम ओवरहेड लगाता है, और एक निशुल्क परीक्षण उपलब्ध है। आपकी प्रक्रिया चल रही है, जबकि कई स्नैपशॉट्स ले कर, आप यह पता लगा सकते हैं कि किस प्रकार की वस्तुओं को आवंटित किया जा रहा है (और फिर नष्ट हो गया)।

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

  • स्ट्रिंग। स्प्लिट सैकड़ों छोटे अल्पकालिक तारों को बना सकता है। यदि आप बहुत सी स्ट्रिंग मैनिपुलेशन कर रहे हैं, तो यह स्ट्रिंग को चरित्र-दर-चरित्र पर चलकर प्रक्रिया करने में मदद कर सकता है।
  • हजारों छोटी कक्षाओं (कहें, आकार में 24 बाइट्स के तहत) के सरणी या सूचियां बनाना महंगा हो सकता है; यदि उन वर्गों को मूल्य प्रकार के रूप में माना जा सकता है, तो यह कभी-कभी चीजों को बदलने के लिए चीजों को बेहतर बना सकता है।
  • हजारों छोटे सरणी बनाना स्मृति उपयोग को बहुत बढ़ा सकता है (क्योंकि प्रत्येक सरणी में थोड़ी सी ओवरहेड होती है); कभी-कभी इन्हें एक बड़े सरणी और इंडेक्स के साथ इसके उपधारा में बदल दिया जा सकता है।
  • बहुत से अंतिम वस्तुएं (विशेष रूप से यदि उनका निपटारा नहीं किया जा रहा है) होने से कचरा कलेक्टर पर बहुत अधिक दबाव हो सकता है; सुनिश्चित करें कि आप सभी आईडीस्पोजेबल ऑब्जेक्ट्स का सही ढंग से निपटान कर रहे हैं, और ध्यान दें कि आपके स्वयं के प्रकार (लगभग) never have finalizers होना चाहिए।
  • माइक्रोसॉफ्ट के पास प्रदर्शन में सुधार के लिए Garbage Collection Guidelines के साथ एक लेख है।
1

एक और कारण जीन -1 या जीन -2 संग्रहों का बहुत अधिक कारण हो सकता है, जिनमें से प्रत्येक को अधिक समय लगता है और ऑब्जेक्ट्स पर लंबे समय तक लटकने के कारण होता है।

मैंने यह देखा है कि यह वेब ऐप्स में होता है जब बग्गी ऑब्जेक्ट्स वास्तविक पृष्ठ ऑब्जेक्ट्स पर लटकते हैं - पृष्ठ को तब तक जीवित रहने के लिए मजबूर करते हैं जब तक अन्य ऑब्जेक्ट्स उनका जिक्र करते हैं।

ऑब्जेक्ट्स और पृष्ठों (इस मामले में) के बीच लिंक तोड़ने से जीसी बहुत कम मूल्यों तक गिर गया। हमारी साइट में अब 100+ हिट/सेकेंड हैं और जीसी समय आम तौर पर 1% या उससे कम है।

2

क्या मैं यह अत्यधिक सही करता हूं?

हाँ, आप सही

मार्गों मैं क्यों इतना जीसी हो रहा है यह पता लगाने के लिए उठा सकते हैं?

1.- Do PerfView

PerfView पर एक नज़र डालें एक प्रदर्शन-विश्लेषण उपकरण को अलग CPU- और स्मृति से संबंधित प्रदर्शन के मुद्दों में मदद करता है।

भी देखें: Improving Managed Code Performance

2.- अगर GC.Collect या GC.WaitForPendingFinalizers अपने कोड या तीसरे पक्ष के पुस्तकालय में कहीं भी बुलाया जा रहा है या नहीं। उत्तरार्द्ध उच्च CPU उपयोग कर सकता है।

संबंधित मुद्दे