Django: CONN_MAX_AGE कनेक्शन जारी रखता है, लेकिन PostgreSQL के साथ उनका पुन: उपयोग नहीं करता है


17

मेरे पास एक django सेटअप है जो Django 1.6.7 और Postgres 9.3 को Ubuntu 14.04 LTS पर उपयोग कर रहा है।

किसी भी समय, साइट को PostgreSQL डेटाबेस के बारे में ~ 250 एक साथ कनेक्शन मिलता है, जो कि 2.5GHz पर एक Quad Core Xeon E5-2670 है, और इसमें 16GB RAM है। दिन भर में उस विशेष मशीन पर लोड औसत लगभग 20 से 30 है।

कभी-कभी मुझे डेटाबेस से कनेक्शन टाइमिंग के बारे में संतरी में ईमेल मिलेंगे, और मुझे लगता है कि कुछ प्रकार के कनेक्शन पूलिंग को सक्षम करने से इस समस्या को कम करने में मदद मिलेगी, साथ ही डेटाबेस पर लोड थोड़ा कम होगा।

जब से हम Django 1.6 का उपयोग कर रहे हैं, हमारे पास हमारे लिए उपलब्ध पूलिंग है। हालाँकि, जब मैं CONN_MAX_AGE को 10 सेकंड, या 60 सेकंड पर सेट करता हूं, तो लगभग तुरंत ही एक साथ कनेक्शन की संख्या अधिकतम अनुमत सेटिंग (जो कि आमतौर पर हम देखते हैं के बारे में दोगुनी है) के लिए कूद जाती है, और कनेक्शन अस्वीकार होने लगते हैं।

इसलिए, यह जो भी हो, कनेक्शन के लिए प्रकट होता है कर रहे हैं बने हैं, लेकिन वे नहीं कर रहे हैं पुन: उपयोग किया जा रहा है।

इसका कारण क्या हो सकता है?

पुनश्च। हम भी साथ काम कर रहे हैं gunicorn --worker-class = eventlet। शायद यह हमारे संकट का स्रोत है?

जवाबों:


18

कुछ और प्रयोग करते हुए, मैंने पाया है कि हमारी समस्या का कारण वास्तव में गॉइकोर्न की घटना कार्यकर्ता वर्ग था। प्रत्येक माइक्रोथ्रेड ने इसे स्वयं का लगातार कनेक्शन बना दिया, और उनमें से किसी का पुन: उपयोग करने का कोई तरीका नहीं था।

निष्क्रिय होने की घटना ने हमारे वेबसर्वरों पर लोड बढ़ा दिया है (लेकिन बहुत अधिक नहीं), लेकिन पोस्टग्रेज लोड अब औसतन ३. ३ से नीचे है।


2
आपने अभी हमें एक टन समय बचाया है! हम ठीक उसी व्यवहार का निरीक्षण करते हैं और हम ईवेंटलेट का उपयोग कर रहे हैं। कनेक्शन पूलिंग पर स्विच करने का प्रयास करेंगे और देखेंगे कि यह कैसे काम करेगा।
साइलेंसर

3
अपडेट: pgBouncer के साथ पूलिंग डेटाबेस कनेक्शन समस्या को हल करने के लिए लग रहा था (हम अभी भी ईवेंटलेट का उपयोग कर रहे हैं)
साइलेंसर

जाहिर तौर पर मानस भी है: pypi.python.org/pypi/psycogreen/1.0 (मैंने इसे एक बार आजमाया नहीं, क्योंकि जब मैंने CONN_MAX_AGE को शून्य पर सेट किया, तो यह हमारे सिस्टम को एक DB कनेक्शन बनाने के लिए 20ms लेता है, इसलिए हमें केवल पूलिंग की आवश्यकता नहीं है)
डैरेन

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