PRODसंप्रभु यूरोपीय BaaS मंचडैशबोर्ड खोलें →

प्रदर्शन · 9 मिनट पढ़ा

Postgres max_connections बिना पूलर के

Affane Daylami · Fondateur · 6 जून 2026

ब्लॉग पर वापस जाएँ

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

यह अंग्रेजी पाठ फ़्रेंच मूल से स्वचालित रूप से उत्पन्न हुआ था और अभी तक इसकी समीक्षा नहीं की गई है।
यह पृष्ठ स्वचालित रूप से अनुवादित किया गया था. अंग्रेजी संस्करण प्रामाणिक है.

यह आलेख आपके हार्डवेयर की आदर्श संगामिति (पारिस्थितिकी तंत्र में सबसे उद्धृत कनेक्शन पूल साइज़िंग फॉर्मूला) की गणना करने के लिए 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 में वृद्धि के बाद स्वैप हो जाता है, या जिसकी मेमोरी खत्म हो जाती है।

#
FORMULA

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) पर्याप्त नहीं है, आपको सर्वर को पुनरारंभ करना होगा।

पहले वर्तमान मान और उसके संदर्भ की जाँच करें, यह पुष्टि करने के लिए कि पुनः आरंभ करना आवश्यक होगा:

psqlsql
SHOW max_connections;

SELECT name, setting, context
FROM pg_settings
WHERE name = 'max_connections';

-- context='पोस्टमास्टर' पुष्टि करता है कि रीबूट की आवश्यकता है

फिर नया मान लागू करें, फिर पुनरारंभ करें:

psqlsql
ALTER SYSTEM SET max_connections = '300';

-- Postgresql.auto.conf में लिखा गया है।
-- Postgres पुनः आरंभ होने तक कोई प्रभाव नहीं।
terminalbash
# सिस्टमड के साथ
sudo systemctl restart postgresql

# सिस्टमडी के बिना, सीधे pg_ctl के साथ
pg_ctl restart -D $PGDATA -m fast
एक मार्जिन जिसे बहुत से लोग भूल जाते हैं

max_connections में डिफ़ॉल्ट रूप से superuser_reserved_connections (डिफ़ॉल्ट रूप से 3) शामिल होता है: ये कनेक्शन संतृप्ति के मामले में सुपरयूज़र के लिए आरक्षित होते हैं, वे आपके एप्लिकेशन के लिए कभी भी उपलब्ध नहीं होते हैं, भले ही वैश्विक काउंटर अभी तक नहीं पहुंचा हो।

#
कोड में चेक किया गया

ऑराबेस अपने पोस्टग्रेज क्लस्टर पर max_connections का बजट कैसे बनाता है

max_connections को आकार देना केवल एक सैद्धांतिक अभ्यास नहीं है। यहां बताया गया है कि ऑराबेस अपने प्रबंधित पोस्टग्रेज क्लस्टर पर इसका बजट कैसे बनाता है:

100
पोस्टग्रेज़ डिफ़ॉल्ट
किसी भी ट्यूनिंग से पहले max_connections
50→400
समर्पित ऑरबेस बियरिंग्स
सीएनपीजी क्लस्टर द्वारा उद्यम के लिए निःशुल्क
3
सुपरयूजर आरक्षित
superuser_reserved_connections, पोस्टग्रेज़ डिफ़ॉल्ट

समर्पित क्लस्टर: प्रति प्रोजेक्ट एक पोस्टग्रेज क्लस्टर

इस स्तर पर (हमारी तुलना समर्पित बनाम साझा आधारदेखें), प्रत्येक प्रोजेक्ट को अपना स्वयं का CloudNativePG क्लस्टर और अपना स्वयं का max_connections बजट प्राप्त होता है, जिसका आकार उदाहरण के आकार के साथ होता है:

निःशुल्क (समर्पित)max_connections 501 उदाहरण · 500 मीटर वीसीपीयू · 512 एमआई
प्रो (डिफ़ॉल्ट)max_connections 2002 उदाहरण · 1 वीसीपीयू · 2जीआई
टीमmax_connections 3003 उदाहरण · 2 वीसीपीयू · 3जीआई
व्यापारmax_connections 4003 उदाहरण · 2 वीसीपीयू · 4जीआई

साझा क्लस्टर: एक संगठन की कई परियोजनाएं, एक साझा बजट

इस दूसरे पथ पर, एक ही संगठन की सभी परियोजनाएँ एक साझा प्राथमिक के सामने एक CNPG पूलर (PgBouncer, transactionमोड) के माध्यम से जुड़ती हैं:

मुक्तmax_connections 50max_client_conn 100max_user_connections 20
प्रोmax_connections 100max_client_conn 200max_user_connections 60
टीमmax_connections 200max_client_conn 400max_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-चरणीय प्रक्रिया

यह प्रक्रिया किसी विशेष उपकरण पर निर्भर नहीं करती है: यह प्रबंधित या स्व-होस्ट किए गए किसी भी पोस्टग्रेज सर्वर पर लागू होती है।

  1. अपने वास्तविक ग्राहक कनेक्शन की गणना करें। एप्लिकेशन प्रक्रियाओं की संख्या उनके आंतरिक पूल के आकार, साथ ही प्रशासन उपकरण, प्रतिकृति और निगरानी से गुणा की जाती है। यह यह संख्या है, सूत्र नहीं, जो अधिकतम_कनेक्शन स्तर निर्धारित करता है।
  2. PostgreSQL विकी के सूत्र के साथ अपने हार्डवेयर की आदर्श संगामिति की गणना करें: (भौतिक कोर × 2) + कुशल डिस्क। यह आंकड़ा इंगित करता है कि इनमें से कितने कनेक्शन वास्तव में थ्रूपुट को कम किए बिना समानांतर में काम कर सकते हैं।
  3. चरण 1 के लिए वास्तविक आवश्यकता के ऊपर max_connections सेट करें, superuser_reserved_connections के लिए मार्जिन के साथ और किसी भी व्यवस्थापक टूल के लिए जो एप्लिकेशन के बाहर अपने स्वयं के कनेक्शन खोलते हैं।
  4. ALTER SYSTEM SET के साथ परिवर्तन लागू करें, फिर सर्वर को पुनरारंभ करें। यह एक पोस्टमास्टर पैरामीटर है: जैसा कि ऊपर बताया गया है, एक साधारण पुनः लोड पर्याप्त नहीं है।
  5. समय के साथ pg_stat_activity की निगरानी करें। यदि निष्क्रिय कनेक्शनों की संख्या सक्रिय कनेक्शनों की संख्या से बहुत अधिक है, तो यह max_connections समस्या नहीं है: यह संकेत है कि आपको सर्वर के सामने एक पूलर की आवश्यकता है, न कि अधिक संख्या की।

चरण 5 से निगरानी अनुरोध, सीधे प्रयोग योग्य:

psqlsql
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state
ORDER BY count(*) DESC;
#
चेतावनी संकेत

जब सूत्र पर्याप्त नहीं रह जाता है: संकेत बताते हैं कि आपको पूलर की आवश्यकता है

जब max_connections अकेले पर्याप्त नहीं रह जाता है, तो तीन सिग्नल व्यवस्थित रूप से वापस आते हैं, चाहे उसका मूल्य कुछ भी हो।

  1. FATAL: sorry, too many clients already त्रुटि चरम लोड के दौरान दिखाई देती है, जबकि pg_stat_activity द्वारा प्रदर्शित अधिकांश कनेक्शन निष्क्रिय अवस्था में होते हैं।
  2. एप्लिकेशन सर्वर रहित वातावरण में या अल्पकालिक श्रमिकों (एज फ़ंक्शंस, छोटी नौकरियां) के साथ चलता है, जो पोस्टग्रेज़ के प्रक्रिया-प्रति-कनेक्शन मॉडल को समायोजित करने के लिए डिज़ाइन किए गए कनेक्शन की तुलना में बहुत तेज़ी से कनेक्शन खोलता और बंद करता है।
  3. उपरोक्त सूत्र और प्रक्रिया पहले ही लागू की जा चुकी है, और क्लाइंट कनेक्शन की वास्तविक आवश्यकता वर्क_मेम या शेयर्ड_बफ़र्स को खतरे में डाले बिना उपलब्ध मेमोरी द्वारा आवंटित की जा सकने वाली क्षमता से अधिक बनी हुई है।

इन तीन मामलों में, सही उत्तर लगभग हमेशा एप्लिकेशन और पोस्टग्रेज़ के बीच स्थित एक पूलर होता है, न कि उच्चतर max_connections। हमारी तुलना PgBouncer, Supavisor और PgCat तीन विकल्पों का विवरण देती है, और लेनदेन मोड के लिए हमारी मार्गदर्शिका पूलर स्थापित होने के बाद सबसे आम समझौते की व्याख्या करती है। कनेक्शन से परे सभी पोस्टग्रेज ट्यूनिंग के लिए, हमारी प्रोडक्शन पोस्टग्रेज ट्यूनिंग चेकलिस्टदेखें।

#
अक्सर पूछे जाने वाले प्रश्नों

पूछे जाने वाले प्रश्न

PostgreSQL का डिफ़ॉल्ट max_connections क्या है?+
100, डिफ़ॉल्ट रूप से सुपरयूजर के लिए 3 कनेक्शन आरक्षित हैं (superuser_reserved_connections)। यह डिफ़ॉल्ट कई अनुप्रयोगों के लिए उपयुक्त है जो पूलर से गुजरते हैं, लेकिन जैसे ही एप्लिकेशन प्रक्रियाओं का एक बेड़ा कनेक्शन का अपना बैच खोलता है, पूलिंग के बिना जल्दी ही अपर्याप्त हो जाता है।
क्या हम PostgreSQL को पुनरारंभ किए बिना max_connections बदल सकते हैं?+
नहीं, max_connections एक पोस्टमास्टर संदर्भ पैरामीटर है: पोस्टग्रेज अपनी साझा मेमोरी को आकार देने के लिए स्टार्टअप पर इसे एक बार पढ़ता है। ALTER SYSTEM SET postgresql.auto.conf पर नया मान लिखता है, लेकिन केवल पूर्ण सर्वर पुनरारंभ ही इसे लागू करता है; पुनः लोड करना या SIGHUP पर्याप्त नहीं है।
एक निष्क्रिय PostgreSQL कनेक्शन कितनी मेमोरी की खपत करता है?+
कोई एकल आधिकारिक संख्या नहीं है: यह वर्क_मेम, शेयर्ड_बफ़र्स और प्रति सत्र लोड किए गए एक्सटेंशन पर निर्भर करता है। हालाँकि, दस्तावेज़ में यह बताया गया है कि वर्क_मेम को क्वेरी में प्रति सॉर्टिंग या हैशिंग ऑपरेशन के लिए आवंटित किया जाता है, प्रति कनेक्शन के लिए नहीं: इसलिए एक जटिल क्वेरी एक ही सक्रिय कनेक्शन पर कई बार वर्क_मेम का उपभोग कर सकती है।
क्या हमें हमेशा उच्चतर max_connections के बजाय PgBouncer जैसे पूलर को प्राथमिकता देनी चाहिए?+
अधिकांश मामलों में, हाँ, जैसे ही वास्तविक क्लाइंट कनेक्शन की संख्या PostgreSQL विकी फॉर्मूला द्वारा गणना की गई आदर्श संगामिति से बहुत अधिक हो जाती है। एक लेन-देन मोड पूलर एप्लिकेशन पक्ष पर बहुत बड़ी संख्या में तार्किक कनेक्शन के बीच छोटी संख्या में भौतिक कनेक्शन को पूल करता है। किसे चुनने के लिए PgBouncer, Supavisor और PgCat की हमारी तुलना देखें।
सूत्र (कोर × 2) + कुशल डिस्क वास्तव में क्या मापता है?+
यह आदर्श सक्रिय संगामिति का अनुमान लगाता है: अनुरोधों की संख्या जो किसी दिए गए सर्वर का सीपीयू और डिस्क थ्रूपुट को कम किए बिना समानांतर में संसाधित कर सकते हैं, न कि max_connections में खोलने के लिए कनेक्शन की कुल संख्या। यह माप द्वारा मान्य किया जाने वाला एक प्रारंभिक बिंदु है, जिसे आधिकारिक PostgreSQL प्रोजेक्ट विकि द्वारा प्रलेखित किया गया है, कोई कठिन सीमा नहीं।
मुझे कैसे पता चलेगा कि मेरा पोस्टग्रेज़ सर्वर अपनी कनेक्शन सीमा के करीब है?+
pg_stat_activity को क्वेरी करें और सक्रिय स्थिति में कनेक्शनों की संख्या की तुलना निष्क्रिय स्थिति में कनेक्शनों से करें। max_connections कैप के पास बड़ी संख्या में निष्क्रिय कनेक्शन, जिसके पीछे कोई सक्रिय अनुरोध नहीं है, लगभग हमेशा max_connections को और बढ़ाने की आवश्यकता के बजाय पूल करने की आवश्यकता को इंगित करता है।

तैनाती के लिए तैयार हैं?

पाँच मिनट में आपका बैकएंड।

किसी क्रेडिट कार्ड की आवश्यकता नहीं · 500 एमबी निःशुल्क · 50,000 एमएयू