2012-05-02 11 views
15

को गति देने में कैसे मदद करता है मेरे पास कुछ प्रबंधन आदेश हैं जो कि गेवेन्ट पर आधारित हैं। चूंकि मेरा प्रबंधन कमांड हजारों अनुरोधों को बनाता है, इसलिए मैं सभी सॉकेट कॉल को गीवेंट का उपयोग करके गैर-अवरुद्ध कॉल में बदल सकता हूं। यह वास्तव में मेरे आवेदन को गति देता है क्योंकि मैं एक साथ अनुरोध कर सकता हूं।पीजी बाउंसर Django

वर्तमान में मेरे आवेदन में बाधा पोस्टग्रेस प्रतीत होती है। ऐसा लगता है कि ऐसा इसलिए है क्योंकि Djyango से कनेक्ट करने के लिए उपयोग की जाने वाली साइकोप लाइब्रेरी सी में लिखी गई है और एसिंक्रोनस कनेक्शन का समर्थन नहीं करती है।

मैंने यह भी पढ़ा है कि पीजी बाउंसर का उपयोग करके पोस्टग्रेस को 2 एक्स तक बढ़ाया जा सकता है। यह बहुत अच्छा लगता है लेकिन अगर कोई यह बता सकता है कि pgBouncer कैसे काम करता है और मदद करता है तो यह बहुत अच्छा होगा?

धन्यवाद

+0

यह भी एक मौका है कि आपका डेटाबेस मॉडल उन प्रश्नों से मेल नहीं खाता है जो आप इसे फायर कर रहे हैं। आम तौर पर, नेटवर्क ओवरहेड डिस्क से डेटा के ब्लॉक लाने के लिए आवश्यक काम की तुलना में बहुत छोटा होता है, यह भी प्रदर्शन की लागत नहीं है, केवल विलंबता। (शायद अक्सर लगातार कनेक्ट/डिस्कनेक्ट के मामले के लिए) – wildplasser

उत्तर

65

& कनेक्ट करने के ओवरहेड को सहेजने के अलावा, जहां यह प्रत्येक अनुरोध पर अन्यथा किया जाता है, एक कनेक्शन पूलर बड़ी संख्या में क्लाइंट कनेक्शन को वास्तविक डेटाबेस कनेक्शनों तक सीमित कर सकता है। PostgreSQL में, सक्रिय डेटाबेस कनेक्शन की इष्टतम संख्या आमतौर पर कहीं ((2 * core_count) + effect_spindle_count) होती है। इस संख्या के ऊपर, थ्रूपुट और विलंबता दोनों खराब हो जाते हैं।

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

यह समझने के लिए कि यह सच क्यों है, इस विचार प्रयोग में मदद करनी चाहिए। साझा करने के लिए केवल एक संसाधन के साथ एक hypothetical डेटाबेस सर्वर मशीन पर विचार करें - एक कोर। यह कोर बिना किसी ओवरहेड के सभी समवर्ती अनुरोधों के बीच समान रूप से समय-टुकड़ा करेगा। आइए मान लें कि सभी अनुरोध एक ही पल में आते हैं, जिनमें से प्रत्येक को CPU समय के एक सेकंड की आवश्यकता होती है। कोर उन सभी पर काम करता है, उनमें से समय-टुकड़ा करना जब तक कि वे सभी 100 सेकंड बाद खत्म नहीं हो जाते। अब विचार करें कि क्या होता है यदि आप सामने कनेक्शन कनेक्शन डालते हैं जो 100 क्लाइंट कनेक्शन स्वीकार करेगा लेकिन डाटाबेस सर्वर पर एक समय में केवल एक ही अनुरोध करेगा, कनेक्शन को कतार में व्यस्त होने पर आने वाले किसी भी अनुरोध को डालने पर। अब जब एक ही समय में 100 अनुरोध आते हैं, तो एक ग्राहक को 1 सेकंड में प्रतिक्रिया मिलती है; दूसरे को 2 सेकंड में प्रतिक्रिया मिलती है, और अंतिम ग्राहक को 100 सेकंड में प्रतिक्रिया मिलती है। प्रतिक्रिया प्राप्त करने के लिए किसी को भी लंबे समय तक इंतजार नहीं करना पड़ा, थ्रूपुट समान है, लेकिन औसत विलंबता 100 सेकंड के बजाय 50.5 सेकंड है।

एक वास्तविक डेटाबेस सर्वर में अधिक संसाधन होते हैं जिनका उपयोग समानांतर में किया जा सकता है, लेकिन एक ही सिद्धांत धारण करने के बाद, एक ही सिद्धांत धारण करता है, आप केवल समवर्ती डेटाबेस अनुरोध जोड़कर चीजों को चोट पहुंचाते हैं। यह वास्तव में उदाहरण से भी बदतर है, क्योंकि अधिक कार्यों के साथ आपके पास अधिक कार्य स्विच हैं, ताले और कैश, एल 2 और एल 3 कैश लाइन विवाद के लिए विवाद बढ़ गया है, और कई अन्य मुद्दे जो थ्रूपुट और विलंबता दोनों में कटौती करते हैं। उस पर, जबकि उच्च work_mem सेटिंग कई तरीकों से एक क्वेरी की सहायता कर सकती है, यह सेटिंग प्रत्येक कनेक्शन के लिए प्रति योजना नोड की सीमा है, इसलिए बड़ी संख्या में कनेक्शनों के साथ आपको इसे बहुत छोटा छोड़ने की आवश्यकता है फ्लशिंग कैश या यहां तक ​​कि स्वैपिंग की ओर अग्रसर होता है, जिससे धीमी योजनाएं या ऐसी चीजें होती हैं जैसे हैश टेबल डिस्क पर फैलती हैं।

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

+1

उत्कृष्ट उत्तर। मैं ज्यादा सहमत नहीं हो सकती। – wildplasser

+0

ये फ्रंट-एंड हिप्पी सभी जितनी जल्दी हो सके कनेक्शन बनाना और तोड़ना चाहते हैं, और अगर वे अपने प्राकृतिक-उच्च राज्य तक नहीं पहुंच पा रहे हैं तो कनेक्शन पूलर्स को सामने रखें। मुझे 2 * नकोर + एनस्पिंडल फॉर्मूला पसंद है। प्रत्येक प्रक्रिया को डिस्क पढ़ने में अवरुद्ध माना जाता है। – wildplasser

+0

@kgrittn मैं उपरोक्त आपके विचार प्रयोग में मानता हूं, प्रत्येक अनुरोध अन्य अनुरोधों की अनुपस्थिति में चलाने के लिए एक सेकंड लेता है? –

9

PgBouncer एक प्रॉक्सी जो एक कनेक्शन पूल का कहना है के रूप में सेवारत द्वारा कनेक्शन स्थापित करने में विलंबता कम करता है। यदि आप Postgres के लिए कई अल्पकालिक कनेक्शन खोल रहे हैं तो यह आपके एप्लिकेशन को तेज़ी से बढ़ाने में मदद कर सकता है। यदि आपके पास केवल कुछ ही कनेक्शन हैं, तो आपको अधिक जीत दिखाई नहीं देगी।

+0

यदि मुझे यह सही समझ में आया - Django अभी भी कनेक्शन बार-बार बनाता है लेकिन pgBouncer इस कनेक्शन को बनाने के लिए आवश्यक समय को कम कर देता है। मैंने सुना है कि Django प्रत्येक अनुरोध के लिए एक नया कनेक्शन बनाता है। अनुरोध से लोगों का मतलब है कि एक पृष्ठ लाने के लिए वेब अनुरोध (जिसका अर्थ है कि एक दृश्य के चक्र में निष्पादित प्रत्येक एकल आदेश एक एकल डेटाबेस कनेक्शन के माध्यम से जाता है) या अनुरोध का मतलब है कि प्रत्येक व्यक्तिगत डेटाबेस हिट (चयन, इन्सर्ट, अद्यतन और हटाएं) इस मामले में प्रत्येक एकल कमांड को नए कनेक्शन के भीतर निष्पादित किया जाएगा, भले ही वे एक ही दृश्य चक्र –

+2

हां में हों, हां, एक नया कनेक्शन बनाएगा, लेकिन कनेक्शन तेजी से स्थापित किया जाएगा क्योंकि यह स्थानीय पीजीबाउंसर उदाहरण के लिए होगा। Django प्रत्येक वेब अनुरोध के लिए एक नया कनेक्शन का उपयोग करेगा, डेटाबेस क्वेरी नहीं। –

+1

आपको [यह सवाल] मिल सकता है (http://stackoverflow.com/questions/1125504/django-persistent-database-connection) में कुछ और रोचक जानकारी है। लेकिन ध्यान दें कि प्रत्येक अनुरोध पर नए कनेक्शन खोले जाने का एक कारण है। अगर अनुरोध में कोई त्रुटि आती है, तो संभव है कि लेन-देन अप्रत्याशित परिणामों की ओर अग्रसर हो (अन्य चीजों के साथ)। –

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