2016-10-28 10 views
5

टीएल; डीआर: प्रदर्शन के लिए रीफैक्टरिंग बनाया गया, वेबसाइट धीमी हो गई। कंसुरेंसी विजुअलाइज़र को चलाएं, ग्राफ lock convoys जैसा दिखता है जैसा कि एमएसडीएन पर वर्णित है।एएसपी.नेट वेबसाइट

प्रसंग

मैं व्यापार वस्तुओं पर प्रस्तुति तर्क करते हैं और यह भी डेटाबेस उपयोगकर्ता नियंत्रण से किए गए कॉल को कम करने के डेटासेट पर व्यापार तर्क प्रदर्शन से उपयोगकर्ता नियंत्रण स्विच करने के लिए एक ASP.NET वेबसाइट पुनर्रचना के साथ मदद कर रहा हूँ।

मुद्दा

हम एक महत्वपूर्ण प्रदर्शन ड्रॉप (रुक जाता है/blockings) को शामिल क्या हम कई क्षेत्रों में प्रदर्शन में सुधार किया जाएगा सोचा था कि परिवर्तन शुरू करने के बाद देखा है।

हम अपनी वेबसाइट के प्रदर्शन की निगरानी के लिए लीन सेंट्री का उपयोग कर रहे हैं। हैंग डायग्नोस्टिक्स के मुताबिक, जीसी चलने पर धागा पूल थ्रेड से बाहर चला रहा था और (डायग्नोस्टिक्स पेज पर विवरण के अनुसार), यह अधिक धागे बनने से रोकता है। स्मृति निदान के अनुसार, जीसी हीप और जनरल 0 बहुत मेमोरी (~ 9 जीबी) का उपभोग कर रहे थे।

मैंने अभी तक क्या किया?

  1. मैं दृश्य स्टूडियो में स्मृति प्रोफाइलर का इस्तेमाल किया और हमारे अत्यधिक DataAdapter और DataTable उपयोग के साथ समस्याओं को पहचाना। मेमोरी खपत 3 जीबी तक गिर गई लेकिन इससे केवल जीसी अवरोधन में मदद मिली। बदलावों को पेश करने से पहले यह अभी भी धीमा है और मैं अभी भी CompilationLock.GetLock() और BuildManager.GetBuildResultFromCacheInternal() जैसे कार्यों के कारण उच्च लोड पर अवरुद्ध दिख रहा हूं। उन्हें गुगल करने से कुछ भी उपयोगी नहीं हुआ।

  2. यह एक ऐसी वेबसाइट है जो जेआईटी संकलन का उपयोग करती है। मैंने माना था कि CompilationLock के साथ समस्या जेआईटी संकलन और वेबसाइट को प्रीकंपिल्ड चलाने के लिए हो सकती है, लेकिन हमारी वैश्विक Utilities कक्षाओं में से एक ने अन्य Utilities वर्ग/नामस्थान के साथ अस्पष्टता उत्पन्न की है जिसे मैं नहीं जानता। मुझे पता चला है कि Microsoft.Build.Utilities नेमस्पेस है, लेकिन इसकी हमारी वेबसाइट में संदर्भ नहीं दिया गया है और जब मैं Microsoft.Build को संदर्भित करता हूं तो मैं अपने पर्यावरण में अस्पष्टता को पुन: पेश नहीं कर सकता, इसलिए मैं वेबसाइट को प्रीकंपील्ड मोड पर नहीं चला पा रहा था इस सिद्धांत का परीक्षण करने के लिए स्टेजिंग सर्वर।

  3. मैं स्मृति आवंटन और डेटाबेस कॉल की मात्रा पर अतिरिक्त परिवर्तन किए, दृश्य स्टूडियो की स्मृति आवंटन और इंस्ट्रूमेंटेशन प्रोफाइलर एक उपाय के रूप में प्रयोग है, लेकिन मैं प्रदर्शन पर कोई प्रगति नोटिस नहीं किया था।

  4. थ्रेड उपयोग पर अधिक जानकारी एकत्र करने के लिए मैंने समवर्ती प्रोफाइलर का उपयोग किया। मैंने पहले इस उपकरण का उपयोग नहीं किया है, इसलिए मुझे यहां मेरी व्याख्याओं के बारे में निश्चित नहीं है। प्रत्येक हैंडल में कई धागे हैं और एक हैंडल में मैं 42% विवाद देख रहा हूं। मैं देखता हूं कि DataAdapter.Fill और SqlHelper.ExecuteReader विधियां सबसे अधिक दिखाई देती हैं जब यह "केवल मेरा कोड दिखाएं" पर सेट होता है और WaitForSingleObjectExImplementation "सभी कोड दिखाएं" पर सेट होने पर सबसे अधिक दिखाता है।

  5. मैं a SO question about ASP.NET websites’ performance issues और प्रत्येक पृष्ठ के लिए निर्धारित EnableSessionState="ReadOnly" का सामना करना पड़ा है, लेकिन मैं इस परिवर्तन के साथ अंतर नोटिस नहीं किया था, या तो।

  6. Concurrency Visualizer और Common Patterns for Poorly-Behaved Multithreaded Applications ने मुझे इस मुद्दे की पहचान करने में मदद की। मेरा ग्राफ सीरियल निष्पादन की तरह प्रतीत नहीं होता है, लेकिन मुझे लॉक कन्वॉय ग्राफ में दिखाए गए अनुसार 80-90% सिंक्रनाइज़ेशन दिखाई देता है। मैंने a SO question on lock convoys debugging भी चेक आउट किया।

परीक्षण दृष्टिकोण

मैं मेंढक Screaming आदेश मुद्दों पुन: पेश करने में वेबसाइट क्रॉल करने और एक प्रदर्शन को मापने के रूप में दोनों Screaming मेंढक और लीन संतरी में दूसरे और प्रतिक्रिया समय के अनुसार अनुरोधों की संख्या लेने उपयोग कर रहा हूँ । यह सबसे अच्छा तरीका नहीं हो सकता है लेकिन अंतर ध्यान देने योग्य, पुनरुत्पादित है और इस बिंदु पर मेरे पास बहुत कुछ है। वेबसाइट

वेबसाइट के

वास्तुकला मूल रूप से कुछ संगतता समस्याओं को ठीक करने के बारे में 10 साल पहले .NET फ्रेमवर्क 1.0 के लिए VB.NET में कोडित, और .नेट फ्रेमवर्क 4.6.1 करने के लिए उन्नत किया गया था। अभी तक कोई वास्तुशिल्प परिवर्तन नहीं हुआ है। SqlHelper वर्ग साझा किया गया है, जो ExecuteDataset या ExecuteDatareader जैसे साझा डेटा एक्सेस फ़ंक्शंस का संग्रह है, जो या तो DataSet, DataReader या String मान लौटाता है। ये फ़ंक्शन web.config फ़ाइल से कनेक्शन स्ट्रिंग जानकारी पढ़ते हैं और डेटाबेस ऑपरेशंस करने के लिए नया SqlConnection, SqlDataAdapter, SqlDataReader और SqlCommand ऑब्जेक्ट बनाते हैं। डेटा साझा परत जो इस साझा कक्षा का उपभोग करती है, प्रत्येक मॉड्यूल नियंत्रण में तत्काल होने के लिए शॉपिंग कार्ट, श्रेणी, उत्पाद इत्यादि जैसे प्रत्येक मॉड्यूल के लिए कक्षाएं होती है और उनमें ऐसे फ़ंक्शन होते हैं जो डेटाबेस में संग्रहित प्रक्रियाओं का प्रतिनिधित्व करते हैं।

पुनर्रचना

हम कुछ नई वस्तुओं या तो संबंधित उपयोगकर्ता नियंत्रण के अंदर पृष्ठ लोड, या रिपीटर्स की OnItemDataBound घटना अंदर instantiated जा करने के लिए शुरू की है और अपने बच्चे को उपयोगकर्ता नियंत्रण 'सार्वजनिक गुण है, जो करने के लिए कर रहे हैं पुनर्संशोधित से जुड़ी है वस्तु का प्रयोग करें। हालांकि, अभी भी अन्य बाल उपयोगकर्ता नियंत्रण हैं जिन्हें एकाधिक डेटा टेबल की आवश्यकता है, इसलिए हमने ऑब्जेक्ट्स में से किसी एक में डेटा टेबल को स्टोर करने का निर्णय लिया और इसे अपने सार्वजनिक गुणों को निर्दिष्ट करके संबंधित उपयोगकर्ता नियंत्रणों को पास कर दिया।

मुझे लगता है कि हम इन वस्तुओं को पेश करके प्रदर्शन को नुकसान पहुंचाते हैं। भले ही डेटाबेस कॉल और मेमोरी खपत कम हो रही है, मैं सोच रहा हूं कि ऑब्जेक्ट्स थ्रेड को हर समय समन्वयित कर रहे हैं या नहीं।

ग्राफ किसी भी रिफैक्टरिंग से पहले हुआ:

ग्राफ सब पुनर्रचना के बाद मैं लागू किया उल्लेख:

तुम मुझे समस्या को पहचानने में मदद करेंगे?

उत्तर

0

आपकी समस्या अपेक्षाकृत जटिल है। मुझे लगता है कि आप दो मूल विकल्प आपके रिफैक्टरिंग प्रदर्शन के मुद्दों को हल करने के लिए है कि:

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

  2. कुछ नए जोड़े गए वर्गों को इंटरफेस का समर्थन करने वाले संस्करणों के साथ बदलें लेकिन प्रदर्शन ओवरहेड की कमी है। निष्पादन के मुद्दों को अलग करने के लिए यह चुनिंदा रूप से करें। शायद, वेबसाइट ने एक अज्ञात प्रदर्शन बग में टैप किया है जो अतिरिक्त कक्षाओं के पूर्व कार्यान्वयन से ट्रिगर नहीं हुआ था।

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

+0

हाय @ जॉन। आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने कोड के 3 अलग-अलग संस्करणों के साथ पहला दृष्टिकोण आजमाया है और ऐसा लगता है कि हमने प्रति सेकंड अनुरोधों में अधिक ड्रॉप पेश किए हैं। फिर मैंने डेटाबेस ऑब्जेक्ट से बचने के लिए उन ऑब्जेक्ट्स को कैश में संग्रहीत करने का प्रयास किया है और इसमें कोई सुधार नहीं हुआ है। फिर मैंने प्रति सेकंड अनुरोधों को देखकर अपना परीक्षण दृष्टिकोण उपयोगी नहीं पाया क्योंकि यह पृष्ठ के आकार से सीधे प्रभावित होता है जिसे मैंने केवल आउटपुट कैश वाले पृष्ठों को क्रॉल करके पुष्टि की है। हमने कोड तैनात किया और यह एक बेहतर स्थिति में प्रतीत होता है तो हमें उम्मीद थी। – Engin

+0

मुझे नहीं पता कि मुझे प्रोफाइलर्स से एकत्रित मीट्रिक पर गिनती को छोड़कर इस बिंदु पर परीक्षण कैसे करना चाहिए। – Engin

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