मुझे यह सुनिश्चित करने के लिए क्या करना चाहिए कि IIS मेरे आवेदन को रीसायकल नहीं करता है?


82

मेरे पास IIS में होस्ट किया गया WCF सेवा ऐप है। स्टार्टअप पर, यह चला जाता है और स्थानीय कैश के रूप में उपयोग करने के लिए एक बहुत महंगा (समय और सीपीयू के संदर्भ में) संसाधन प्राप्त करता है।

दुर्भाग्य से, आईआईएस इस प्रक्रिया को काफी नियमित आधार पर रीसायकल करता है। इसलिए मैं यह सुनिश्चित करने के लिए एप्लिकेशन पूल पर सेटिंग्स बदलने की कोशिश कर रहा हूं कि IIS एप्लिकेशन को रीसायकल नहीं करता है। अब तक, मैंने निम्नलिखित परिवर्तन किया है:

  • सीपीयू के तहत इंटरवल को 5 से 0 तक सीमित करें।
  • प्रक्रिया मॉडल के तहत आइडल टाइम-आउट 20 से 0 तक।
  • 1740 से 0 तक पुनर्चक्रण के तहत नियमित समय अंतराल।

क्या यह पर्याप्त होगा? और मेरे द्वारा बदले गए आइटमों के बारे में विशिष्ट प्रश्न हैं:

  1. सीपीयू के तहत विशेष रूप से लिमिट इंटरवल सेटिंग का क्या मतलब है? क्या इसका मतलब है कि यदि एक निश्चित सीपीयू उपयोग से अधिक है, तो अनुप्रयोग पूल को पुनर्नवीनीकरण किया जाएगा?
  2. वास्तव में "पुनर्नवीनीकरण" का क्या अर्थ है? क्या आवेदन पूरी तरह से फटा हुआ है और फिर से शुरू हो गया है?
  3. "वर्कर प्रोसेस शटडाउन" और "एप्लिकेशन पूल रीसाइक्लिंग" के बीच अंतर क्या है? प्रक्रिया मॉडल के तहत आइडियल टाइम-आउट के लिए प्रलेखन कार्यकर्ता प्रक्रिया को बंद करने के बारे में बात करता है। जबकि रीसायकलिंग के तहत रेगुलर टाइम इंटरवल के लिए डॉक्स एप्लिकेशन पूल रीसाइक्लिंग के बारे में बात करते हैं। मैं दोनों के बीच के अंतर को कम नहीं करता। मुझे लगा कि w3wp.exe वर्कर प्रक्रिया है जो एप्लिकेशन पूल चलाता है। क्या कोई दोनों के बीच आवेदन के अंतर को समझा सकता है?

IIS7 और IIS7.5 टैग होने का कारण यह है कि ऐप दोनों में चलेगा और आशा करता है कि उत्तर दोनों संस्करणों के बीच समान होंगे।

संदर्भ के लिए चित्र: यहाँ छवि विवरण दर्ज करें


IIS के लिए सेटिंग्स के साथ आपको वह स्क्रीनशॉट कहां से मिला?
एंड्रयू विलियम रॉस

यह एडवांस्ड ऐप पूल प्रॉपर्टीज शीट है।
ट्रिस्टनके

जवाबों:


105

पुनर्चक्रण

पुनर्चक्रण आमतौर पर होता है * जहां IIS आपके आवेदन के लिए कंटेनर के रूप में एक नई प्रक्रिया शुरू करता है, और फिर पुराने को शटडाउनटाइमलिमिट तक देता है ताकि वह मारे जाने से पहले अपनी इच्छा से दूर जा सके।

* - आमतौर पर: DisallowOverlappingRotation / "अक्षम ओवरलैप किए गए रीसायकल" सेटिंग देखें

यह विनाशकारी है , इसमें मूल प्रक्रिया और इसकी सभी राज्य सूचनाओं को छोड़ दिया जाता है। आउट-ऑफ-प्रक्रिया सत्र राज्य (जैसे, स्टेट सर्वर या एक डेटाबेस, या यहां तक ​​कि अगर आपका राज्य छोटा है) का उपयोग करके आप इस के आसपास काम करने की अनुमति दे सकते हैं।

लेकिन यह डिफ़ॉल्ट रूप से ओवरलैप किया गया है - जिसका अर्थ है कि एक आउटेज की अवधि कम हो गई है क्योंकि नई प्रक्रिया शुरू होती है और अनुरोध कतार तक पहुंच जाती है, इससे पहले कि पुराने को "आपको [शटडाउनटाइमलिमिट] सेकंड्स दूर जाने के लिए कहा जाए। कृपया अनुपालन करें।"

समायोजन

आपके प्रश्न के लिए: उस पृष्ठ की सभी सेटिंग्स किसी तरह से रीसाइक्लिंग को नियंत्रित करती हैं। "शटडाउन" को "प्रोएक्टिव रीसाइक्लिंग" के रूप में वर्णित किया जा सकता है - जहां प्रक्रिया खुद तय करती है कि इसे जाने का समय है, और क्रमबद्ध तरीके से बाहर निकलता है।

प्रतिक्रियाशील पुनर्चक्रण वह जगह है जहां WAS एक समस्या का पता लगाता है और प्रक्रिया को शूट करता है (एक उपयुक्त प्रतिस्थापन W3WP की स्थापना के बाद)।

अब, यहाँ कुछ चीजें हैं जो एक रूप या किसी अन्य के पुनर्चक्रण का कारण बन सकती हैं:

  • एक ISAPI यह अस्वस्थ निर्णय ले रहा है
  • किसी भी मॉड्यूल दुर्घटनाग्रस्त
  • निष्क्रिय समय
  • सीपीयू सीमित
  • एप्लिकेशन पूल गुणों का समायोजन
    • जैसा कि आपकी मां ने एक बिंदु पर चिल्लाया हो सकता है: " इसे चुनना बंद करो , या यह कभी भी बेहतर नहीं होगा!"
  • "पिंग" विफलता * वास्तव में प्रति पिंग नहीं, क्योंकि यह एक नामित पाइप का उपयोग करता है - अधिक "जीवन का पता लगाने"
  • उपरोक्त स्क्रीनशॉट में सभी सेटिंग्स

क्या करें:

आम तौर पर:

  • अक्षम निष्क्रिय समय समाप्ति । निष्क्रियता के 20 मिनट = उछाल! अगले आने वाले अनुरोध पर नई प्रक्रिया। वह शून्य पर सेट करें।

  • नियमित समय अंतराल को अक्षम करें - 29 घंटे के डिफ़ॉल्ट को विभिन्न पक्षों द्वारा "पागल", "कष्टप्रद" और "चतुर" के रूप में वर्णित किया गया है। दरअसल, उनमें से केवल दो ही सच हैं।

  • वैकल्पिक रूप से DisallowRotationOnConfigChange (उपरोक्त, कॉन्फ़िगरेशन परिवर्तन के लिए पुन: व्यवस्थित करने पर अक्षम करें) को चालू करें यदि आप बस इसके साथ खेलना बंद नहीं कर सकते हैं - यह आपको किसी भी ऐप पूल सेटिंग को बदलने की अनुमति देता है इसके बिना कार्यकर्ता प्रक्रियाओं को तुरंत संकेत देता है कि इसे मारने की आवश्यकता है। सेटिंग्स को प्रभावी करने के लिए आपको ऐप पूल को मैन्युअल रूप से रीसायकल करने की आवश्यकता है, जो आपको सेटिंग्स को पूर्व-निर्धारित करने की अनुमति देता है और फिर अपनी रीसायकल प्रक्रिया के माध्यम से उन्हें लागू करने के लिए एक परिवर्तन विंडो का उपयोग करता है।

  • एक सामान्य सिद्धांत के रूप में, पिंगिंग को सक्षम छोड़ दें । वह आपकी सुरक्षा का जाल है। मैंने देखा है कि लोग इसे बंद कर देते हैं, और फिर साइट अनिश्चित काल तक लटकी रहती है, जिससे घबराहट होती है ... इसलिए यदि सेटिंग्स आपके जाहिरा तौर पर बहुत-बहुत-धीमी-से-प्रतिक्रिया ऐप के लिए आक्रामक हैं, तो उन्हें थोड़ा वापस करें और देखें कि आपको क्या मिलेगा, बजाय इसे बंद करने के। (जब तक आपको अपनी स्वयं की निगरानी प्रक्रिया के माध्यम से त्रिशंकु W3WP के लिए ऑटो-क्रैश-मोड डंपिंग स्थापित नहीं किया जाता है)

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

सीपीयू सीमित करना आम तौर पर दिलचस्प नहीं है , क्योंकि डिफ़ॉल्ट रूप से यह बंद हो गया है, और यह वैसे भी कुछ भी करने के लिए कॉन्फ़िगर किया गया है; यदि यह प्रक्रिया को मारने के लिए कॉन्फ़िगर किया गया था, तो सुनिश्चित करें कि यह एक रीसाइक्लिंग ट्रिगर होगा। इसे छोड़ दो। IIS 8.x, CPU थ्रॉटलिंग के लिए नोट भी एक विकल्प बन जाता है।

एक (IIS) AppPool एक (.Net) AppDomain नहीं है (लेकिन इसमें एक / कुछ हो सकता है)

लेकिन ... तब हम .Net भूमि और AppDomain रीसाइक्लिंग में लग जाते हैं, जिससे राज्य का नुकसान भी हो सकता है। (देखें: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

लघु संस्करण, आप अपने सामग्री फ़ोल्डर में एक web.config फ़ाइल (फिर से चुनने के साथ!), या उस फ़ोल्डर में एक फ़ोल्डर बनाकर, या एक ASPX फ़ाइल, या .. अन्य चीजों को स्पर्श करके ऐसा करते हैं ... और वह इस बारे में है एक अनुप्रयोग पूल रीसायकल, के रूप में के रूप में विनाशकारी शून्य से देशी-कोड स्टार्टअप लागत (यह विशुद्ध रूप से एक प्रबंधित कोड (नेट) की अवधारणा, इसलिए केवल प्रबंधित कोड सामग्री यहां मौजूद होता है)।

एंटीवायरस इसे ट्रिगर भी कर सकता है क्योंकि यह web.config फ़ाइलों को स्कैन करता है, जिससे एक परिवर्तन अधिसूचना होती है, जिससे…।


2
प्रतीक्षा करें प्रतीक्षा करें प्रतीक्षा करें ... क्यों एंटीवायरस से web.config को बदलना एक सूचना अधिसूचना को ट्रिगर करेगा? कोई भी एंटीवायरस जो बिना किसी कारण के web.config को "टच" करता है, कचरा इम्हो है।
शिव

एवी केवल पढ़ने के लिए नहीं हो सकता है, लेकिन लिख सकता है - उदाहरण के लिए एक वैकल्पिक डेटा स्ट्रीम, एक फ़ाइल को स्कैन करने के लिए अंतिम बार उपयोग किए गए इंजन संस्करण की रिकॉर्डिंग। एक विचार के रूप में।
ट्रिस्टनके

7

कृपया इसे जांचो,

हम अपने एप्लिकेशन पूल को क्यों रीसायकल करते हैं?

यदि आप इस कारण को खोजने के लिए वेब ब्राउज़ करते हैं कि एप्लिकेशन पूल को समय-समय पर स्वचालित रूप से रीसायकल करने के लिए कॉन्फ़िगर क्यों किया जाता है, तो आपको एक उचित उत्तर खोजने के लिए कठिन दबाया जाएगा जो स्मृति समस्याओं से संबंधित नहीं है। यह ऐसा है जैसे सामान्य रूप से समुदाय ने इस तथ्य को बहुत अधिक स्वीकार कर लिया है कि स्मृति समस्याओं से बचने के लिए हमारे वेब एप्लिकेशन (या IIS में होस्ट की गई लेयर) को पुनर्नवीनीकरण करने की आवश्यकता होगी।

मेरा हमेशा से यह मत रहा है कि यदि आपके कोड को सही ढंग से काम करने के लिए आवधिक पुनरारंभ की आवश्यकता होती है, तो कुछ स्पष्ट रूप से गलत है। कहीं न कहीं आपके कोड में एक बग है और आपको समस्या को 'दूर' करने के लिए कभी-कभी प्रक्रिया को पुनरारंभ करने के बजाय, इसे ठीक करने की आवश्यकता है।

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


3
एक कारण यह था कि .NET 'बड़ी वस्तुओं' (आमतौर पर 85K या उससे अधिक या कुछ) के लिए अलग-अलग हीप का उपयोग करता है जो कचरा संग्रह होने पर संकुचित नहीं होता है (हालांकि .NET 4.5.1 में मुझे लगता है कि उन्होंने LOH को कॉम्पैक्ट करने के लिए विकल्प जोड़ा था), और ASP.NET में जब सर्वर की ओर से HTML रेंडर किया जाता है तो यह 85K HTML (विशेष रूप से टेबल्स और ग्रिड जैसी दोहराई गई सामग्री के लिए) को देखने के लिए असामान्य नहीं है और यह HTML मूल रूप से एक बिंदु पर सर्वर पर केवल एक विशाल स्ट्रिंग ऑब्जेक्ट है, और यदि यह इस रूप में योग्य है एक बड़ी वस्तु, यह बड़े ऑब्जेक्ट हीप विखंडन में योगदान देता है, जिसके परिणामस्वरूप अंततः OutOfememExException है, इसलिए रीसाइक्लिंग
कुछ भी नहीं

0

ओपी परिदृश्य (स्टार्टअप / वार्म अप पर लंबे समय तक इनिशियलाइज़ेशन) के आधार पर, चेक करने के लिए एक और चीज़ स्टार्टअप टाइम लिमिट (सेकंड) है जिसका डिफ़ॉल्ट मान 90 सेकंड है। यदि प्रारंभ में स्टार्टअप समय सीमा से अधिक है, तो कार्यकर्ता प्रक्रिया समाप्त की जा सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.