टीएल; डीआर: प्रदर्शन के लिए रीफैक्टरिंग बनाया गया, वेबसाइट धीमी हो गई। कंसुरेंसी विजुअलाइज़र को चलाएं, ग्राफ lock convoys जैसा दिखता है जैसा कि एमएसडीएन पर वर्णित है।एएसपी.नेट वेबसाइट
प्रसंग
मैं व्यापार वस्तुओं पर प्रस्तुति तर्क करते हैं और यह भी डेटाबेस उपयोगकर्ता नियंत्रण से किए गए कॉल को कम करने के डेटासेट पर व्यापार तर्क प्रदर्शन से उपयोगकर्ता नियंत्रण स्विच करने के लिए एक ASP.NET वेबसाइट पुनर्रचना के साथ मदद कर रहा हूँ।
मुद्दा
हम एक महत्वपूर्ण प्रदर्शन ड्रॉप (रुक जाता है/blockings) को शामिल क्या हम कई क्षेत्रों में प्रदर्शन में सुधार किया जाएगा सोचा था कि परिवर्तन शुरू करने के बाद देखा है।
हम अपनी वेबसाइट के प्रदर्शन की निगरानी के लिए लीन सेंट्री का उपयोग कर रहे हैं। हैंग डायग्नोस्टिक्स के मुताबिक, जीसी चलने पर धागा पूल थ्रेड से बाहर चला रहा था और (डायग्नोस्टिक्स पेज पर विवरण के अनुसार), यह अधिक धागे बनने से रोकता है। स्मृति निदान के अनुसार, जीसी हीप और जनरल 0 बहुत मेमोरी (~ 9 जीबी) का उपभोग कर रहे थे।
मैंने अभी तक क्या किया?
मैं दृश्य स्टूडियो में स्मृति प्रोफाइलर का इस्तेमाल किया और हमारे अत्यधिक
DataAdapter
औरDataTable
उपयोग के साथ समस्याओं को पहचाना। मेमोरी खपत 3 जीबी तक गिर गई लेकिन इससे केवल जीसी अवरोधन में मदद मिली। बदलावों को पेश करने से पहले यह अभी भी धीमा है और मैं अभी भीCompilationLock.GetLock()
औरBuildManager.GetBuildResultFromCacheInternal()
जैसे कार्यों के कारण उच्च लोड पर अवरुद्ध दिख रहा हूं। उन्हें गुगल करने से कुछ भी उपयोगी नहीं हुआ।यह एक ऐसी वेबसाइट है जो जेआईटी संकलन का उपयोग करती है। मैंने माना था कि
CompilationLock
के साथ समस्या जेआईटी संकलन और वेबसाइट को प्रीकंपिल्ड चलाने के लिए हो सकती है, लेकिन हमारी वैश्विकUtilities
कक्षाओं में से एक ने अन्यUtilities
वर्ग/नामस्थान के साथ अस्पष्टता उत्पन्न की है जिसे मैं नहीं जानता। मुझे पता चला है किMicrosoft.Build.Utilities
नेमस्पेस है, लेकिन इसकी हमारी वेबसाइट में संदर्भ नहीं दिया गया है और जब मैंMicrosoft.Build
को संदर्भित करता हूं तो मैं अपने पर्यावरण में अस्पष्टता को पुन: पेश नहीं कर सकता, इसलिए मैं वेबसाइट को प्रीकंपील्ड मोड पर नहीं चला पा रहा था इस सिद्धांत का परीक्षण करने के लिए स्टेजिंग सर्वर।मैं स्मृति आवंटन और डेटाबेस कॉल की मात्रा पर अतिरिक्त परिवर्तन किए, दृश्य स्टूडियो की स्मृति आवंटन और इंस्ट्रूमेंटेशन प्रोफाइलर एक उपाय के रूप में प्रयोग है, लेकिन मैं प्रदर्शन पर कोई प्रगति नोटिस नहीं किया था।
थ्रेड उपयोग पर अधिक जानकारी एकत्र करने के लिए मैंने समवर्ती प्रोफाइलर का उपयोग किया। मैंने पहले इस उपकरण का उपयोग नहीं किया है, इसलिए मुझे यहां मेरी व्याख्याओं के बारे में निश्चित नहीं है। प्रत्येक हैंडल में कई धागे हैं और एक हैंडल में मैं 42% विवाद देख रहा हूं। मैं देखता हूं कि
DataAdapter.Fill
औरSqlHelper.ExecuteReader
विधियां सबसे अधिक दिखाई देती हैं जब यह "केवल मेरा कोड दिखाएं" पर सेट होता है औरWaitForSingleObjectExImplementation
"सभी कोड दिखाएं" पर सेट होने पर सबसे अधिक दिखाता है।मैं a SO question about ASP.NET websites’ performance issues और प्रत्येक पृष्ठ के लिए निर्धारित
EnableSessionState="ReadOnly"
का सामना करना पड़ा है, लेकिन मैं इस परिवर्तन के साथ अंतर नोटिस नहीं किया था, या तो।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 जा करने के लिए शुरू की है और अपने बच्चे को उपयोगकर्ता नियंत्रण 'सार्वजनिक गुण है, जो करने के लिए कर रहे हैं पुनर्संशोधित से जुड़ी है वस्तु का प्रयोग करें। हालांकि, अभी भी अन्य बाल उपयोगकर्ता नियंत्रण हैं जिन्हें एकाधिक डेटा टेबल की आवश्यकता है, इसलिए हमने ऑब्जेक्ट्स में से किसी एक में डेटा टेबल को स्टोर करने का निर्णय लिया और इसे अपने सार्वजनिक गुणों को निर्दिष्ट करके संबंधित उपयोगकर्ता नियंत्रणों को पास कर दिया।
मुझे लगता है कि हम इन वस्तुओं को पेश करके प्रदर्शन को नुकसान पहुंचाते हैं। भले ही डेटाबेस कॉल और मेमोरी खपत कम हो रही है, मैं सोच रहा हूं कि ऑब्जेक्ट्स थ्रेड को हर समय समन्वयित कर रहे हैं या नहीं।
ग्राफ किसी भी रिफैक्टरिंग से पहले हुआ:
ग्राफ सब पुनर्रचना के बाद मैं लागू किया उल्लेख:
तुम मुझे समस्या को पहचानने में मदद करेंगे?
हाय @ जॉन। आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने कोड के 3 अलग-अलग संस्करणों के साथ पहला दृष्टिकोण आजमाया है और ऐसा लगता है कि हमने प्रति सेकंड अनुरोधों में अधिक ड्रॉप पेश किए हैं। फिर मैंने डेटाबेस ऑब्जेक्ट से बचने के लिए उन ऑब्जेक्ट्स को कैश में संग्रहीत करने का प्रयास किया है और इसमें कोई सुधार नहीं हुआ है। फिर मैंने प्रति सेकंड अनुरोधों को देखकर अपना परीक्षण दृष्टिकोण उपयोगी नहीं पाया क्योंकि यह पृष्ठ के आकार से सीधे प्रभावित होता है जिसे मैंने केवल आउटपुट कैश वाले पृष्ठों को क्रॉल करके पुष्टि की है। हमने कोड तैनात किया और यह एक बेहतर स्थिति में प्रतीत होता है तो हमें उम्मीद थी। – Engin
मुझे नहीं पता कि मुझे प्रोफाइलर्स से एकत्रित मीट्रिक पर गिनती को छोड़कर इस बिंदु पर परीक्षण कैसे करना चाहिए। – Engin