Mod_wsgi के माध्यम से Django चलाते समय मुझे WSGIDaemonProcess में कितनी प्रक्रियाएँ निर्दिष्ट करनी चाहिए?


23

मान लीजिए कि मेरे पास एक बॉक्स पर अपने अपाचे आभासी होस्ट से चलने वाली 2 साइटें (सुपरयूज़र और सर्वरफ़ॉल्ट) हैं। 2 साइटें Django द्वारा संचालित हैं और आधुनिक wsgi के साथ Apache पर चल रही हैं। साइट में से किसी एक के लिए एक विशिष्ट कॉन्फ़िगरेशन फ़ाइल निम्न की तरह दिखाई देगी:

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

मेजबान एक लिनक्स मशीन है जिसमें 4 जीबी रैम वाला उबंटू चल रहा है। क्या कोई ऐसी प्रक्रिया सुझा सकता है जिसे मुझे अपनी 2 साइटों के लिए निर्दिष्ट करना चाहिए? मान लेते हैं कि उनके पास वास्तविक सुपरयूज़र और सर्वरफ़ॉल्ट साइटों के समान ट्रैफ़िक है।

जवाबों:


22

ठीक है, कितना यातायात है वास्तविक सुपर उपयोगकर्ता और serverfault साइटों है? यदि उत्तर को आसान बनाने के लिए पर्याप्त जानकारी नहीं है तो हाइपोथेटिकल का अधिक उपयोग नहीं होता है ...

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

औसत मामले की गिनती समान है, लेकिन आप प्रत्येक कार्य के लिए प्रति सेकंड आपके अनुरोध के भारित माध्य द्वारा पुनः / सेकंड को विभाजित करते हैं (वजन उस अनुरोध का प्रतिशत है जो आप उस विशेष कार्रवाई को हिट करने की अपेक्षा करते हैं)। फिर, ठगना कारक उपयोगी हैं।

मशीन पर आप कितनी प्रक्रियाएँ चला सकते हैं इसकी वास्तविक ऊपरी सीमा प्रत्येक प्रक्रिया के स्मृति की ऊपरी मात्रा से तय होती है; एक प्रक्रिया को स्पूल करें, फिर विभिन्न प्रकार के मेमोरी-हंगर एक्शन (जो बहुत सारे डेटा को पुनः प्राप्त करते हैं और संसाधित करते हैं, आमतौर पर) इसके खिलाफ यथार्थवादी डेटा सेट के साथ चलाते हैं (यदि आप परीक्षण के लिए केवल एक खिलौना डेटा सेट का उपयोग करते हैं, तो 50 या 100 कहें पंक्तियाँ, फिर यदि आपकी कोई क्रिया तालिका में प्रत्येक पंक्ति को पुनः प्राप्त और हेरफेर करती है तो यह उस मेज के लिए 10,000 माप की वृद्धि के लिए एक अच्छा माप नहीं होगा) यह देखने के लिए कि मेमोरी उपयोग गुब्बारे क्या हैं। यदि आप उस स्क्रिप्ट के साथ अपने प्रति-प्रक्रिया मेमोरी उपयोग को कृत्रिम रूप से बाधित कर सकते हैं जो श्रमिकों को पढ़ता है जो एक निश्चित मेमोरी उपयोग सीमा तक पहुंचता है, तो यदि आप उस सीमा को बहुत कम सेट करते हैं तो बुरा समस्या पैदा करने के जोखिम में हैं।

एक बार जब आप अपनी मेमोरी उपयोग आकृति प्राप्त कर लेते हैं, तो आप सिस्टम ओवरहेड के लिए मेमोरी की कुछ राशि काट लेते हैं (मैं खुद को 512MB पसंद करता हूं), यदि आप एक ही मशीन (जैसे डेटाबेस) पर चलने वाली अन्य प्रक्रियाएं प्राप्त कर चुके हैं, तो ढेर को घटा दें और फिर यह सुनिश्चित करने के लिए कि आप डिस्क कैश स्थान से बाहर नहीं चलते हैं (आपकी डिस्क काम करने वाले सेट आकार पर निर्भर करती है, लेकिन फिर से मैं 512% से कम नहीं जाऊंगा)। वह मेमोरी की मात्रा है जिसे आप छत प्राप्त करने के लिए अपनी प्रति-प्रक्रिया मेमोरी उपयोग से विभाजित करते हैं।

यदि आपको अपने पीक लोड की सेवा के लिए आवश्यक प्रक्रियाओं की संख्या बॉक्स पर फिट होने वाली प्रक्रियाओं की संख्या से अधिक है, तो आपको अधिक मशीनों की आवश्यकता है (या डेटाबेस को किसी अन्य मशीन में स्थानांतरित करने के लिए, सरलतम स्थिति में)।

वहाँ आप अनुभव कर रहे हैं, कई वर्षों से अनुभव करने वाली वेबसाइटें एक छोटी और सरल एसएफ पोस्ट में आसुत हैं।


प्रक्रियाओं / थ्रेड्स की संख्या के लिए एक अन्य महत्वपूर्ण कारक यह है कि व्यक्तिगत अनुरोधों को कब तक संभाला जा सकता है और समय के सभी संभावित लंबाई में समग्र प्रसार हो सकता है। दूसरे शब्दों में, किसी भी एक समय में कितने अनुरोधों को संभालने की आवश्यकता है जो औसत प्रतिक्रिया समय से अधिक लेते हैं। इसलिए, यह केवल सैद्धांतिक अनुरोधों / सेकंड के रूप में सरल नहीं है क्योंकि उन लंबे समय तक चलने वाले अनुरोधों का प्रभाव महत्वपूर्ण हो सकता है और समग्र कॉन्फ़िगरेशन मापदंडों को स्पष्ट रूप से निर्धारित कर सकता है। FWIW mod_wsgi 3.0 में कॉन्फ़िगरेशन को सहायता करने के लिए डेटा को संग्रहित करने के लिए कुछ कैप्चर किए गए आँकड़े शामिल होंगे।
ग्राहम डम्पलटन

@ ग्राहम: मेरे जवाब को फिर से पढ़ें, मैंने उसे कुछ विस्तार से कवर किया। अनुरोध / सेकंड प्रतिक्रिया समय का केवल पारस्परिक है, और एक पूर्णांक प्रति / सेकंड से विभाजित करना आसान है, जितना कि एक दशमलव से गुणा करना है।
Womble

हालांकि आप केवल सबसे खराब स्थिति प्रतिक्रिया पर ध्यान केंद्रित नहीं कर सकते हैं, और न ही उस मामले के लिए औसत। यह समय अवधि में गिरने वाले अनुरोधों के प्रतिशत के आधार पर तरीकों से भारित किए जाने की आवश्यकता है, अर्थात, हर संभव समय में फैला हुआ। यदि आपने सही मायने में अपनी सबसे खराब स्थिति प्रतिक्रिया समय लिया तो आप अवास्तविक आवश्यकताओं के साथ आएंगे। समस्या यह जानना बहुत कठिन है कि किस सूत्र का उपयोग करना है। यही कारण है कि mod_wsgi 3.0 में इनबिल्ट आंकड़े एकत्रित होंगे जो थ्रेड के उपयोग को देखते हैं और गिनती और समय के हिसाब से कितने प्रतिशत तक किसी भी समय उपयोग में आते हैं।
ग्राहम डम्पलटन

3
समस्या शायद यह है कि आप केवल उन्हीं प्रक्रियाओं को देख रहे हैं, जहां मैं इस बात से चिंतित हूं कि प्रत्येक प्रक्रिया इसमें कैसे थ्रेड का उपयोग करती है और यह इतना सरल नहीं है। दूसरे शब्दों में, कि WSGIDaemonProcess निर्देश 5 प्रक्रियाओं को इंगित करता है जहां प्रत्येक प्रक्रिया 15 थ्रेड्स का उपयोग करके डिफ़ॉल्ट रूप से होती है। जितना मैंने आपके विवरण में पढ़ा है, यह एकल पिरोया प्रक्रियाओं को मान रहा है। यदि नहीं, तो मुझे इंगित करें कि आपका मॉडल जीआईएल के आसपास थ्रेड्स प्लस कंटेस्ट / स्केलिंग मुद्दों के लिए कैसे पूरा करता है। इसलिए, यह क्वालीफाई करें कि आपका विवरण केवल एकल थ्रेडेड प्रक्रियाओं के लिए मान्य है और मैं बहस नहीं करूंगा।
ग्राहम डम्पलटन

2
क्या "मल्टीथ्रेडेड-अपाचे + मल्टीप्रोसेस-वेस्गी" सबसे अच्छी शर्त नहीं है जब तक कि आप 99% सुनिश्चित नहीं हो जाते कि आपका पायथन कोड और सभी निर्भरता थ्रेड-सुरक्षित हैं?
टॉमस ज़ीलिएस्की

9

womble का जवाब बहुत ही बढ़िया है, भले ही अनुभवहीन को समझने और लागू करने के लिए थोड़ा कठिन हो। मैं कुछ अनुभवजन्य संख्याएँ देना चाहता हूँ, और "सरल सामग्री" बनाम "ई-कॉमर्स" अनुप्रयोग तुलना।

Mod_wsgi के उनके उपयुक्त कॉन्फ़िगरेशन के संबंध में विभिन्न उपयोग के मामलों को सेट करने के आसपास बहुत अधिक सामग्री नहीं है, इसलिए मुझे उम्मीद है कि यहां थोड़ा सा प्रोफ़ेसर का उपयोग करना ठीक है।

ए) सीएमएस साइटें और माइक्रोसाइट्स

हम कई ग्राहक वेबसाइट चलाते हैं, उनमें से ज्यादातर मुख्य रूप से सामग्री साइटें या माइक्रो साइटें हैं जो django CMS की मेजबानी करती हैं, कुछ कस्टम फॉर्म और कभी-कभी सेलेरी निर्धारित पृष्ठभूमि कार्यों के लिए। ये साइटें संसाधनों की भूखी नहीं हैं, उनमें से कई 32 जीबी रैम के साथ एक ही 4 कोर इंटेल एक्सोन पर समानांतर रूप से चलती हैं। यहाँ हम इस प्रकार की साइटों के लिए विन्यास का उपयोग करते हैं:

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

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

बी) ई-कॉमर्स साइटें

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

उन परिदृश्यों के लिए हमने 6बहुत अंतर देखे बिना प्रक्रियाओं का उपयोग करने की कोशिश की है , और हम 12प्रदर्शन और परिचालन स्थिरता में एक अतुलनीय बढ़ावा देखते हुए समाप्त हुए :

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

150 के साथ कुछ सरल भार परीक्षण, और 250 समानांतर उपयोगकर्ताओं को साइट को अच्छी तरह से उत्तरदायी रहते हुए नियंत्रित किया जाता है (जबकि 2प्रक्रियाओं के साथ साइट समानांतर में 50 उपयोगकर्ताओं को अनुपयोगी है)। 32 GB रैम के साथ 2 CPU 6 कोर इंटेल Xeon उस लोड के तहत 25% CPU उपयोग से नीचे चलता है, RAM का उपयोग लगभग 25% से कम पर भी स्थिर रहता है। ध्यान दें कि हम केवल एक साइट के लिए एक समर्पित मशीन का उपयोग करते हैं, इसलिए हम उन संसाधनों को चोरी नहीं करेंगे जिनकी अन्य साइटों को आवश्यकता हो सकती है।

निष्कर्ष

उपलब्ध सिस्टम संसाधनों का उपयोग करने या न करने की अनुमति देने के बीच अधिक संख्या में प्रक्रियाओं का उपयोग करना एक व्यापार बंद है। यदि आप "हमले" की स्थिति के तहत एक स्थिर सर्वर सिस्टम (वेबसाइट नहीं!) रखना चाहते हैं तो संख्या कम रखें। यदि आप चाहते हैं कि अपाचे आपको उच्च संख्या चुनने पर सिस्टम संसाधनों (सीपीयू, रैम) का उपयोग करने में मदद करें। ऊपर दिए गए स्वीकृत उत्तर में आप कितनी ऊंची गणना कर सकते हैं और उपलब्ध सीपीयू शक्ति और रैम द्वारा अंततः विवश है।

(पुनश्च: मैं अपाचे की तरह पृष्ठभूमि पढ़ने के लिए अपने तकिए के नीचे modwsgi परियोजना विकी के कॉन्फ़िगरेशनडायरेक्टिव खंड को रखता हूं। अपने अपाचे सर्वर के खुले कनेक्शनों को समझना और उनकी निगरानी करना सुनिश्चित करें ।)


महान पोस्ट, लेकिन आप थ्रेड काउंट क्यों सेट नहीं करते हैं? चूंकि पायथन के GIL ने थ्रेड्स के बहुत सारे फायदों की उपेक्षा की है, इसलिए मुझे लगता है कि आप थ्रेड्स की तुलना में अधिक प्रक्रियाएँ करना चाहते हैं, लेकिन क्या थ्रेड काउंट को निर्दिष्ट करने का कोई लाभ है?
सेरिन

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

इस अनुभवजन्य विन्यास के लिए धन्यवाद। हालाँकि, ध्यान रखें कि इस पोस्ट के अनुसारYou should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
रतिरु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.