मेरे पास ASP.NET Core 3 वेबसाइट है जो अक्सर Azure पर मेमोरी से बाहर हो रही है।

enter image description here

रिपोर्ट तैयार करना हैवी-लिफ्टिंग (लेकिन अक्सर उपयोग किए जाने वाले) कार्यों में से एक है। तो मैंने सोचा कि क्या हो रहा है यह देखने के लिए मैं एक ऐसी रिपोर्ट का परीक्षण मामले के रूप में उपयोग करूंगा।

यहां एप्लिकेशन लोड होने के बाद एक मेमोरी स्नैपशॉट है, और फिर 9 बाद के अनुरोधों में से किसी एक रिपोर्ट के लिए अनुरोध किया गया है।

enter image description here

डायग्नोस्टिक्स को देखते हुए, EF परिवर्तन ट्रैकिंग ऑब्जेक्ट्स द्वारा बहुत सारी मेमोरी का उपभोग किया जाता है।

enter image description here

मैंने पाया है कि अगर मैं स्टार्टअप में options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); का उपयोग करता हूं, तो उसी गतिविधि के लिए स्नैपशॉट निम्नलिखित उत्पन्न करता है:

enter image description here

यह एक व्यापक सुधार है - प्रत्येक अनुरोध के लिए 2 एमबी जोड़ना व्यवहार्य नहीं है। क्या यह सामान्य है - मैंने सोचा होगा कि परिवर्तन ट्रैकिंग के साथ भी, जीसी इसे खराब नहीं होने देगा? या मेरे रिपोर्ट कोड में कुछ ऐसा हो सकता है जो इसे संदर्भों या कुछ और पर पकड़ बना रहा है - मैंने पढ़ा है कि स्थिर चर जीसी उन उदाहरणों को मुक्त नहीं कर सकता है, क्या यह एक संभावना है? मुझे यकीन नहीं है कि अगर कुछ डिफ़ॉल्ट कार्यक्षमता को बंद करना किसी और चीज के लिए सिर्फ एक बैंड-सहायता है, तो मैं मौलिक रूप से गलत कर रहा हूं (मुझे पूरा यकीन है कि मैं using स्टेटमेंट आदि के साथ हर चीज का निपटान कर रहा हूं)।

2
Sean 16 जिंदा 2021, 11:17

1 उत्तर

सबसे बढ़िया उत्तर

मैं कहूंगा कि सभी ईएफ प्रश्नों को NoTracking पर स्विच करते समय इस तरह के परिणाम की उम्मीद है, विशेष रूप से रिपोर्टिंग परिदृश्यों में जहां आप सबसे अधिक पढ़ रहे हैं और फिर स्मृति में कई वस्तुओं को ट्रैक कर रहे हैं।

में आधिकारिक दस्तावेज़ आप इस विषय के बारे में विस्तृत जानकारी प्राप्त कर सकते हैं। वहां आप दो प्रश्नों के प्रदर्शन की तुलना करते हुए एक बेंचमार्क भी देख सकते हैं, एक जो परिवर्तन ट्रैकर का उपयोग करता है और दूसरा जो नहीं करता है, एक छोटे डेटा सेट (प्रत्येक 20 पोस्ट वाले 10 ब्लॉग) का उपयोग करता है। डेटा की छोटी मात्रा के बावजूद, परिणाम आपके समान हैं: प्रदर्शन में लगभग 40% की वृद्धि और आवंटित स्मृति में समान-ईश कमी।

Stats

इसलिए, I'm not sure if switching off some default functionality is just a band-aid to something else I'm doing fundamentally wrong के संबंध में, मैं निश्चित रूप से कहूंगा कि यह एक बैंड-सहायता समाधान नहीं है जो इसे सिर्फ रिपोर्टिंग कार्यक्षमता के लिए करता है। इन केवल-पठन परिदृश्यों में जहां आपको प्रदर्शन को बढ़ावा देने की आवश्यकता है, गैर-ट्रैकिंग क्वेरी का उपयोग करना वास्तव में अनुशंसित है।

हालांकि, केवल एक चीज जो मुझे पता होगी वह यह है कि संभवत: आप अपने आवेदन में सभी प्रश्नों के लिए ट्रैकिंग व्यवहार को बंद नहीं करना चाहते हैं। ऐसा करने से, यदि आप एप्लिकेशन में कहीं और संस्थाओं के अपडेट करने के लिए चेंज ट्रैकर पर भरोसा करते हैं, तो वे अपडेट काम करना बंद कर देंगे।

उदाहरण के लिए:

var blog = context.Blogs
    .Where(blog => blog.Id = blogId)
    .SingleOrDeafult();

blog.Name = "Another Name";

context.SaveChanges() // If the default query behaviour is 'NoTracking', the Blog's name won't be updated since it wasn't in the ChangeTracker.

इसके बजाय मैं डिफ़ॉल्ट व्यवहार को ट्रैकिंग के रूप में रखने के लिए क्या करूंगा, लेकिन फिर मैं उन सभी प्रश्नों को बदल दूंगा जिनका उपयोग केवल रिपोर्ट में गैर ट्रैकिंग तरीके से किया जाता है। इसे हासिल करने के लिए, आपको जोड़ना होगा। .AsNoTracking() सभी रिपोर्टिंग EF क्वेरीज़ में।

उदाहरण के लिए:

var blogs = context.Blogs
    .AsNoTracking()
    .ToList();

इस तरह, आप बाकी एप्लिकेशन व्यवहार को प्रभावित किए बिना, अपने केवल-पढ़ने के लिए प्रश्नों के प्रदर्शन को काफी बढ़ावा देंगे।

1
dglozano 21 जिंदा 2021, 18:19
धन्यवाद, यह सुपर मददगार है। त्वरित प्रश्न: एक निकट-धार्मिक अभ्यास के रूप में, मैं हमेशा db.Entity(blog).state = EntityState.Modified; (/ जोड़ा/हटाया) को डीबी में लिखना चाहता हूं, क्योंकि जब मैं कोई बदलाव कर रहा होता हूं, तो मैं इस बारे में स्पष्ट होना पसंद करता हूं, और मुझे लगता है पढ़ने की तुलना में कम संपादन हैं। अगर ऐसा है, तो संभवत: इसे विश्व स्तर पर बंद करने का कोई मुद्दा नहीं है?
 – 
Sean
19 जिंदा 2021, 23:31
यह सुनकर खुशी हुई कि मैं मदद करने में सक्षम था। मुझे नहीं लगता कि मैं परिवर्तन ट्रैकर के बिना अपडेट करने के तरीके के बारे में आपके प्रश्न का उत्तर दे सकता हूं, क्योंकि मैंने इसे पहले स्वयं नहीं किया है। हालाँकि, यदि एप्लिकेशन ज्यादातर केवल-पढ़ने के लिए है और कुछ अपडेट हैं, तो अगर मैं आप होते तो मैं वही करता: डिफ़ॉल्ट रूप से ट्रैकिंग अक्षम करें और कुछ मौजूदा अपडेट मैन्युअल रूप से करें। हो सकता है कि आप docs.microsoft.com/en-us/ के माध्यम से पढ़ सकें ef/core/change-tracking यह जांचने के लिए कि क्या इसे केवल संशोधित के रूप में चिह्नित करना पर्याप्त है या कुछ और गायब है :) शुभकामनाएँ!
 – 
dglozano
21 जिंदा 2021, 13:18
एक बार फिर धन्यवाद। परिवर्तन ट्रैकिंग के साथ और राज्य को स्पष्ट रूप से सेट करने से अपेक्षा के अनुरूप काम करता है। मैं बस सोच रहा था कि क्या कोई अन्य, अनपेक्षित दुष्प्रभाव था। लेकिन यह ठीक लगता है। आपकी सभी मदद का धन्यवाद!
 – 
Sean
21 जिंदा 2021, 18:15