यह आलेख आपके हार्डवेयर की आदर्श संगामिति (पारिस्थितिकी तंत्र में सबसे उद्धृत कनेक्शन पूल साइज़िंग फॉर्मूला) की गणना करने के लिए PostgreSQL विकी द्वारा प्रकाशित सूत्र देता है, बताता है कि प्रत्येक कनेक्शन की लागत एक एप्लिकेशन थ्रेड से अधिक क्यों होती है, फिर अनुमान लगाए बिना max_connections सेट करने की प्रक्रिया का विवरण देता है। हमारी बेंचमार्क कार्यप्रणाली इस ब्लॉग पर किसी भी प्रदर्शन दावे के लिए उपयोग किए जाने वाले माप प्रोटोकॉल का दस्तावेजीकरण करती है।
अनिवार्य है
- पूलिंग के बिना, max_connections को सभी समवर्ती क्लाइंट कनेक्शन को कवर करना चाहिए, न कि केवल उन लोगों को जिन्हें Postgres समानांतर में कुशलतापूर्वक संसाधित कर सकता है।
- PostgreSQL विकी संदर्भ सूत्र: आदर्श सक्रिय संगामिति = (भौतिक कोर × 2) + कुशल डिस्क। माप द्वारा मान्य किया जाने वाला प्रारंभिक बिंदु, कोई कठोर सीमा नहीं।
- max_connections एक
postmasterसंदर्भ पैरामीटर है: इसे बदलने के लिए सर्वर के पूर्ण पुनरारंभ की आवश्यकता होती है, न कि साधारण पुनः लोड की। - प्रत्येक पोस्टग्रेज कनेक्शन एक अलग सिस्टम प्रक्रिया है, न कि कोई हल्का धागा: यह वह है जो कनेक्शन की संख्या बढ़ते ही ओवरहेड को वास्तविक बना देता है।
- कोड में सत्यापित: अपने समर्पित पोस्टग्रेज़ क्लस्टर पर, ऑराबेस क्लस्टर के आकार के आधार पर अधिकतम कनेक्शन 50 (फ्री टियर) से 400 (एंटरप्राइज़ टियर) तक भिन्न होता है।
पोस्टग्रेज़ कनेक्शन की लागत एप्लिकेशन थ्रेड से अधिक क्यों होती है?
पोस्टग्रेज़ अपने कनेक्शन के लिए हल्के थ्रेड पूल का उपयोग नहीं करता है। प्रत्येक क्लाइंट कनेक्शन एक पूर्ण सिस्टम प्रक्रिया को ट्रिगर करता है।
postmaster प्रक्रिया प्रत्येक कनेक्शन प्रयास के लिए एक नया ("कांटा") बनाती है, जो इस एकल सत्र के बंद होने तक समर्पित होती है। आधिकारिक परियोजना दस्तावेज वास्तुशिल्प बुनियादी बातों पर अपने अध्याय में इस तंत्र का सटीक वर्णन करता है (postgresql.org/docs/current/connect-estab.html, "कनेक्शन सिमेंटिक्स" अनुभाग, 24 अगस्त, 2026 को एक्सेस किया गया)।
इस विकल्प का एक वास्तविक लाभ है: एक कनेक्शन पर क्रैश होने से दूसरे पर कोई प्रभाव नहीं पड़ता है, प्रत्येक प्रक्रिया बाकी सर्वर से अलग हो जाती है। इसकी एक प्रत्यक्ष लागत भी है: प्रत्येक अतिरिक्त कनेक्शन अपने स्वयं के मेमोरी स्पेस और कर्नेल के लिए अपने स्वयं के संदर्भ स्विचिंग ओवरहेड के साथ शेड्यूल करने के लिए एक संपूर्ण ओएस प्रक्रिया जोड़ता है।
एक एप्लिकेशन जो पूलिंग के बिना पोस्टग्रेज़ के लिए 500 सीधे कनेक्शन खोलता है, सर्वर को 500 एक साथ सिस्टम प्रक्रियाओं को प्रबंधित करने के लिए मजबूर करता है, भले ही उनमें से अधिकांश दो अनुरोधों के बीच निष्क्रिय रहें।
एक कनेक्शन वास्तव में क्या उपभोग करता है: साझा मेमोरी और वर्क_मेम
दो अलग-अलग तंत्र स्मृति को प्रभावित करते हैं, और उन्हें भ्रमित करने से लगभग हमेशा गलत निदान होता है।
पहला तय हो गया है. स्टार्टअप पर, पोस्टग्रेज साझा मेमोरी संरचनाओं (लॉक, प्रोसेस टेबल) को max_connections के मूल्य पर आरक्षित करता है, भले ही ये कनेक्शन बाद में खोले गए हों या नहीं। सेटिंग के लिए आधिकारिक दस्तावेज़ स्पष्ट रूप से इंगित करता है: इसे बढ़ाने के लिए आपके OS के डिफ़ॉल्ट कॉन्फ़िगरेशन की अनुमति से अधिक सिस्टम साझा मेमोरी की आवश्यकता हो सकती है (postgresql.org/docs/current/runtime-config-connection.html, 24 अगस्त, 2026 को एक्सेस किया गया)।
दूसरा परिवर्तनशील है, और पैमाने पर बहुत अधिक खतरनाक है: work_mem को प्रति कनेक्शन एक बार आवंटित नहीं किया जाता है, बल्कि क्वेरी योजना में प्रति सॉर्टिंग या हैशिंग ऑपरेशन के लिए एक बार आवंटित किया जाता है। इस बिंदु पर आधिकारिक दस्तावेज स्पष्ट है: एक जटिल क्वेरी इनमें से कई ऑपरेशनों को समानांतर में लॉन्च कर सकती है, और कई सत्र एक साथ ऐसा कर सकते हैं, ताकि वास्तव में उपयोग की गई मेमोरी कई बार काम करने योग्य हो सके (postgresql.org/docs/current/runtime-config-resource.html, 24 अगस्त 2026 को एक्सेस किया गया)।
यह केवल max_connections ×work_mem नहीं है जो सर्वर की मेमोरी को खतरे में डालता है। यह प्रति क्वेरी समवर्ती संचालन की अधिकतम_कनेक्शन × वर्क_मेम × संख्या है। यह वह उत्पाद है जो एक ऐसे सर्वर की व्याख्या करता है जो अहानिकर माने जाने वाले max_connections में वृद्धि के बाद स्वैप हो जाता है, या जिसकी मेमोरी खत्म हो जाती है।
PostgreSQL विकी आकार निर्धारण सूत्र
आधिकारिक PostgreSQL प्रोजेक्ट विकी यह गणना करने के लिए एक बेंचमार्क फॉर्मूला दस्तावेज करता है कि आपका हार्डवेयर कितने सक्रिय कनेक्शन को समानांतर में कुशलतापूर्वक संसाधित कर सकता है, न कि कुल कितने कनेक्शन खुलते हैं (wiki.postgresql.org/wiki/Number_Of_Database_Connections, 24 अगस्त 2026 को एक्सेस किया गया)।
आदर्श सक्रिय संगामिति = (भौतिक कोर × 2) + कुशल डिस्क। कोर की संख्या में हाइपरथ्रेडिंग शामिल नहीं है। आधुनिक एसएसडी स्टोरेज पर प्रभावी डिस्क की संख्या 1 के करीब रहती है, जहां एक अलग भौतिक डिस्क ("स्पिंडल") की धारणा अपने मूल अर्थ को खो देती है।
8 भौतिक कोर और एसएसडी स्टोरेज वाले सर्वर पर, थ्रूपुट ख़राब होने से पहले सूत्र (8 × 2) + 1 = 17 सक्रिय कनेक्शन देता है। यह आंकड़ा अक्सर आश्चर्यजनक होता है: किसी एप्लिकेशन द्वारा व्यवहार में खोले जाने वाले सैकड़ों कनेक्शनों की तुलना में यह छोटा लगता है। यह बिल्कुल निम्नलिखित पैराग्राफ का विषय है।
The number calculated by the formula measures the concurrency that the CPU and disk can absorb, not the number of client connections your application needs to open. A fleet of 20 application processes, each with its own pool of 10 connections, opens 200 simultaneous connections to Postgres even if only 17 of them are actively working at any given time. Without a pooler, max_connections must cover the 200, not the 17. It is this gap that pushes most architectures to add a pooler in transaction mode, even if it means choosing which one (see our comparison PgBouncer, Supavisor and PgCat).
max_connections को कैसे बदलें (और रीबूट की आवश्यकता क्यों है)
max_connections हॉट स्वैप नहीं है. यह एक postmaster संदर्भ पैरामीटर है: पोस्टग्रेज़ अपनी साझा मेमोरी को आकार देने के लिए, स्टार्टअप पर इसे एक बार पढ़ता है। कॉन्फ़िगरेशन पुनः लोड (pg_reload_conf() या SIGHUP) पर्याप्त नहीं है, आपको सर्वर को पुनरारंभ करना होगा।
पहले वर्तमान मान और उसके संदर्भ की जाँच करें, यह पुष्टि करने के लिए कि पुनः आरंभ करना आवश्यक होगा:
फिर नया मान लागू करें, फिर पुनरारंभ करें:
max_connections में डिफ़ॉल्ट रूप से superuser_reserved_connections (डिफ़ॉल्ट रूप से 3) शामिल होता है: ये कनेक्शन संतृप्ति के मामले में सुपरयूज़र के लिए आरक्षित होते हैं, वे आपके एप्लिकेशन के लिए कभी भी उपलब्ध नहीं होते हैं, भले ही वैश्विक काउंटर अभी तक नहीं पहुंचा हो।
ऑराबेस अपने पोस्टग्रेज क्लस्टर पर max_connections का बजट कैसे बनाता है
max_connections को आकार देना केवल एक सैद्धांतिक अभ्यास नहीं है। यहां बताया गया है कि ऑराबेस अपने प्रबंधित पोस्टग्रेज क्लस्टर पर इसका बजट कैसे बनाता है:
समर्पित क्लस्टर: प्रति प्रोजेक्ट एक पोस्टग्रेज क्लस्टर
इस स्तर पर (हमारी तुलना समर्पित बनाम साझा आधारदेखें), प्रत्येक प्रोजेक्ट को अपना स्वयं का CloudNativePG क्लस्टर और अपना स्वयं का max_connections बजट प्राप्त होता है, जिसका आकार उदाहरण के आकार के साथ होता है:
| निःशुल्क (समर्पित) | max_connections 50 | 1 उदाहरण · 500 मीटर वीसीपीयू · 512 एमआई |
|---|---|---|
| प्रो (डिफ़ॉल्ट) | max_connections 200 | 2 उदाहरण · 1 वीसीपीयू · 2जीआई |
| टीम | max_connections 300 | 3 उदाहरण · 2 वीसीपीयू · 3जीआई |
| व्यापार | max_connections 400 | 3 उदाहरण · 2 वीसीपीयू · 4जीआई |
साझा क्लस्टर: एक संगठन की कई परियोजनाएं, एक साझा बजट
इस दूसरे पथ पर, एक ही संगठन की सभी परियोजनाएँ एक साझा प्राथमिक के सामने एक CNPG पूलर (PgBouncer, transactionमोड) के माध्यम से जुड़ती हैं:
| मुक्त | max_connections 50 | max_client_conn 100 | max_user_connections 20 |
|---|---|---|---|
| प्रो | max_connections 100 | max_client_conn 200 | max_user_connections 60 |
| टीम | max_connections 200 | max_client_conn 400 | max_user_connections 150 |
किसी संगठन में सभी परियोजनाएँ एक साझा अनुप्रयोग भूमिका के माध्यम से जुड़ती हैं। max_user_connections इसलिए अकेले कुल सर्वर कनेक्शन को सीमित करता है जिसे यह भूमिका पूरे क्लस्टर में खोल सकती है: यह वास्तविक क्लस्टर-वैश्विक सुरक्षा है, न कि max_client_conn, जो केवल क्लाइंट कनेक्शन को पूलर तक ही सीमित करता है।
हालाँकि, यह पूलर केवल SDK एप्लिकेशन ट्रैफ़िक प्रदान करता है। PostgREST, अपनी ओर से, सीधे प्राथमिक (-rwसेवा) से जुड़ा रहता है: लेनदेन मोड में पूलिंग इसके स्कीमा रीलोडिंग तंत्र को तोड़ देगी, जो pgrstनामक एक समर्पित LISTEN चैनल को सुनता है। इसके स्वयं के कनेक्शन (साझा स्तर पर 2 प्रति प्रतिकृति, समर्पित स्तर पर 10 प्रति प्रतिकृति) इसलिए किसी भी पूलर के बाहर सीधे प्राथमिक के अधिकतम_कनेक्शन बजट में गिने जाते हैं, ठीक उसी प्रकार का "भूल गए" कनेक्शन जो नीचे दी गई प्रक्रिया के चरण 1 में शामिल होना चाहिए।
कोड स्पष्ट रूप से इन साझा पूलर बजटों को लोड के तहत pg_stat_activity को मापकर वास्तविक स्थितियों में कैलिब्रेट किए जाने वाले शुरुआती मूल्यों के रूप में दस्तावेज करता है, न कि किसी प्रकाशित बेंचमार्क से निश्चित आंकड़ों के रूप में। यह वही अनुशासन है जो हमारी बेंचमार्क पद्धतिमें वर्णित है: समायोजन से पहले मापें, अनुमान न लगाएं, फिर आशा करें। ये क्लस्टर PostgreSQL 16 पर चलते हैं, जो हमारे पोस्टग्रेज 16 बनाम 17 बनाम 18तुलना में प्रलेखित एक विकल्प है।
पूलिंग के बिना max_connections को आकार देने की 5-चरणीय प्रक्रिया
यह प्रक्रिया किसी विशेष उपकरण पर निर्भर नहीं करती है: यह प्रबंधित या स्व-होस्ट किए गए किसी भी पोस्टग्रेज सर्वर पर लागू होती है।
- अपने वास्तविक ग्राहक कनेक्शन की गणना करें। एप्लिकेशन प्रक्रियाओं की संख्या उनके आंतरिक पूल के आकार, साथ ही प्रशासन उपकरण, प्रतिकृति और निगरानी से गुणा की जाती है। यह यह संख्या है, सूत्र नहीं, जो अधिकतम_कनेक्शन स्तर निर्धारित करता है।
- PostgreSQL विकी के सूत्र के साथ अपने हार्डवेयर की आदर्श संगामिति की गणना करें: (भौतिक कोर × 2) + कुशल डिस्क। यह आंकड़ा इंगित करता है कि इनमें से कितने कनेक्शन वास्तव में थ्रूपुट को कम किए बिना समानांतर में काम कर सकते हैं।
- चरण 1 के लिए वास्तविक आवश्यकता के ऊपर max_connections सेट करें,
superuser_reserved_connectionsके लिए मार्जिन के साथ और किसी भी व्यवस्थापक टूल के लिए जो एप्लिकेशन के बाहर अपने स्वयं के कनेक्शन खोलते हैं। - ALTER SYSTEM SET के साथ परिवर्तन लागू करें, फिर सर्वर को पुनरारंभ करें। यह एक पोस्टमास्टर पैरामीटर है: जैसा कि ऊपर बताया गया है, एक साधारण पुनः लोड पर्याप्त नहीं है।
- समय के साथ pg_stat_activity की निगरानी करें। यदि निष्क्रिय कनेक्शनों की संख्या सक्रिय कनेक्शनों की संख्या से बहुत अधिक है, तो यह max_connections समस्या नहीं है: यह संकेत है कि आपको सर्वर के सामने एक पूलर की आवश्यकता है, न कि अधिक संख्या की।
चरण 5 से निगरानी अनुरोध, सीधे प्रयोग योग्य:
जब सूत्र पर्याप्त नहीं रह जाता है: संकेत बताते हैं कि आपको पूलर की आवश्यकता है
जब max_connections अकेले पर्याप्त नहीं रह जाता है, तो तीन सिग्नल व्यवस्थित रूप से वापस आते हैं, चाहे उसका मूल्य कुछ भी हो।
FATAL: sorry, too many clients alreadyत्रुटि चरम लोड के दौरान दिखाई देती है, जबकिpg_stat_activityद्वारा प्रदर्शित अधिकांश कनेक्शन निष्क्रिय अवस्था में होते हैं।- एप्लिकेशन सर्वर रहित वातावरण में या अल्पकालिक श्रमिकों (एज फ़ंक्शंस, छोटी नौकरियां) के साथ चलता है, जो पोस्टग्रेज़ के प्रक्रिया-प्रति-कनेक्शन मॉडल को समायोजित करने के लिए डिज़ाइन किए गए कनेक्शन की तुलना में बहुत तेज़ी से कनेक्शन खोलता और बंद करता है।
- उपरोक्त सूत्र और प्रक्रिया पहले ही लागू की जा चुकी है, और क्लाइंट कनेक्शन की वास्तविक आवश्यकता वर्क_मेम या शेयर्ड_बफ़र्स को खतरे में डाले बिना उपलब्ध मेमोरी द्वारा आवंटित की जा सकने वाली क्षमता से अधिक बनी हुई है।
इन तीन मामलों में, सही उत्तर लगभग हमेशा एप्लिकेशन और पोस्टग्रेज़ के बीच स्थित एक पूलर होता है, न कि उच्चतर max_connections। हमारी तुलना PgBouncer, Supavisor और PgCat तीन विकल्पों का विवरण देती है, और लेनदेन मोड के लिए हमारी मार्गदर्शिका पूलर स्थापित होने के बाद सबसे आम समझौते की व्याख्या करती है। कनेक्शन से परे सभी पोस्टग्रेज ट्यूनिंग के लिए, हमारी प्रोडक्शन पोस्टग्रेज ट्यूनिंग चेकलिस्टदेखें।