2011-05-10 16 views
15

मेरे पास सर्वर 2008 R2 + IIS 7.5 पर चल रहे ASP.NET अनुप्रयोग में कुछ कोड था। जब भी मैंने एक विशेष पृष्ठ लोड किया, तो यह हमेशा के लिए लटका होगा और आईआईएस को 100% सीपीयू उपयोग में भेज देगा। अंत में मैंने समस्या को ट्रैक किया।.NET में स्टैक ओवरफ़्लो IIS को 100% CPU उपयोग भेजता है - क्यों नहीं StackOverflowException?

public string Comments 
{ 
    get { return this.Comments; } 
} 

ओप्स - return this.Photo.Comments होना चाहिए था। तो, मेरा सवाल यह है कि .NET ने StackOverflowException क्यों नहीं बनाया, बल्कि इसके बजाय IIS को 100% CPU पर चलने से कहीं अधिक समय तक चलने दें। .NET के साथ अपने अनुभव प्रोग्रामिंग में, ऊपर की तरह कुछ करने पर StackOverflowException प्राप्त करने में सेकंड या उससे कम समय लगता है। तो आईआईएस पर लगभग 30 मिनट तक यह अभी भी कैसे चल सकता है?

+0

वर्कर प्रोसेस शायद मर था और ऑपरेशन पुन: प्रयास? मैंने गलती से दूसरे दिन एक एसओ कोड किया, और उसने एएसपी.NET (मेरे मामले में शेयरपॉइंट) को बहुत जल्दी मार दिया। – leppie

+1

के बाद से .net 4 पूंछ प्रत्यावर्तन का अनुकूलन, यह एक पाश के लिए फिर से लिखा गया हो सकता है। आप आईएल को देखकर इसे सत्यापित कर सकते हैं। – Heinzi

+0

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

उत्तर

5

यह संभव है JIT कम्पाइलर बाहर अनुकूलित YourClass::get_Comments() करने के लिए एक विधि कॉल (जो क्या आईएल कैसा दिखेगा है) और एक jmp साथ कोड inlined (या जो भी 86 कोडांतरक होगा) पाश का निर्माण क्योंकि वहाँ किसी भी नहीं थे मूल्यों को पारित किया जा रहा है। सिर्फ एक विचार।

यह पुराने लेख एक नज़र लायक है:।

Jit Optimizations: Inlining (II)

"इनलाइन किए जाने वाले एक बहुत अच्छी उम्मीदवार का एक विशिष्ट उदाहरण एक संपत्ति गेटर/सेटर है ये आम तौर पर वास्तव में छोटे तरीके हैं आमतौर पर केवल मेमोरी फ़ेच या स्टोर करते हैं, इसलिए यह आमतौर पर इनलाइन करने के लिए आकार और गति जीत है। "

के रूप में है: अनुकूलन के साथ बंद कर दिया

class Program 
{ 
    static void Main(string[] args) 
    { 
    MyClass mc = new MyClass(); 
    string s = mc.Comments; 
    } 
} 

public class MyClass 
{ 
    public string Comments 
    { 
    get { return this.Comments; } 
    } 
} 

डीबग मोड में मैं एक ढेर मिलती है:

Writing High-Performance Managed Applications : A Primer - Managed Code and the CLR JIT

मैं भी एक साधारण सांत्वना आवेदन के साथ इस reproduced अतिप्रवाह अपवाद फेंक दिया। जिट ऑप्टिमाइज़ेशन को चालू करने और रिलीज को संकलित करने पर ऐप सिर्फ हमेशा के लिए चलता है। इससे पता चलता है कि एक लूप में रेखांकन शायद हुआ है।

यह सी # 2.0, 3.0 और 4.0 के मामले में भी प्रतीत होता है।

+0

यह समझ में आता है, धन्यवाद। मैंने डीबग मोड की कोशिश की और दिलचस्प बात यह सिर्फ आईआईएस को दुर्घटनाग्रस्त कर दिया और मुझे 503 दे दिया। वैसे भी, समस्या हल हो गई। –

0

क्या यह विकास के साथ-साथ रिलीज में भी होता है?

मुझे खेद है कि मैं निश्चित रूप से नहीं जानता, लेकिन यहां मेरी अटकलें हैं। कहीं आपके पास एक ऑटो-रीट्री कॉन्फ़िगर किया गया है। तो ऑपरेशन प्रक्रिया StackOverflowException से विफल हो जाती है। उपयोगकर्ता को संदेश प्राप्त करने के बजाय, आईआईएस एक नई प्रक्रिया के साथ पुनः प्रयास करता है। यह आगे और आगे चला जाता है। और इसलिए दोहराया retries सभी सीपीयू खाते हैं।

मैंने एक ऑटो-रीट्री तंत्र को खोजने और खोजने के लिए खोज की है जो इसके लिए जिम्मेदार हो सकती है, लेकिन अब तक कोई भाग्य नहीं है, लेकिन आप अपनी कॉन्फ़िगरेशन के बारे में और जानेंगे।

एक और जांच जो आप कोशिश कर सकते हैं वह कुछ लिखना है जो बड़ी मात्रा में स्मृति आवंटित करता है और देखता है कि क्या एक ही चीज़ OutOfMemoryException के साथ होती है। अगर ऐसा होता है, तो यह लगभग निश्चित रूप से एक ऑटो-रीट्री है।

1

मैं एक वर्ग पुस्तकालय में इस कोड को डालने और एक इकाई के परीक्षण के साथ इसे चलाने की कोशिश की।

यह एक ढेर अतिप्रवाह अपवाद के साथ एमएस परीक्षण एजेंट दुर्घटनाओं।

क्या हो रहा हो सकता है कि आप एक stackoverflow अपवाद हो रही है है। यह एप्लिकेशन पूल को दुर्घटनाग्रस्त कर रहा है।/बंद हो जाता है आईआईएस तो अनुप्रयोग पूल की एक नई प्रतिलिपि को खींचती है, और इसे फिर से दुर्घटनाग्रस्त हो गया हो जाता है ....

अनुप्रयोग पूल रीसाइक्लिंग के लिए प्रवेश करने के लिए अपने घटना की जाँच करें।

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