PRODEgemen Avrupa BaaS platformuKontrol Panelini Aç →

Performans · 9 dk. okuma

Postgres havuzlayıcı olmadan max_connections

Affane Daylami · Fondateur · 6 Haziran 2026

Bloga geri dön

Sunucunuzun önünde havuz oluşturmadan max_connections, Postgres'in paralel olarak verimli bir şekilde işleyebileceği istek sayısını değil, her açık istemci bağlantısını aynı anda kapsamalıdır. Bu iki sayının karıştırılması, yanlış ayarlanmış max_connections'ın en yaygın nedenidir: yükü absorbe edemeyecek kadar düşük veya mevcut bellek için çok yüksek.

Bu İngilizce metin, Fransızca orijinalinden otomatik olarak oluşturulmuştur ve henüz incelenmemiştir.
Bu sayfa otomatik olarak çevrildi. İngilizce versiyonu yetkilidir.

Bu makale, donanımınızın ideal eşzamanlılığını hesaplamak için PostgreSQL wiki tarafından yayınlanan formülü verir (ekosistemde en çok alıntı yapılan bağlantı havuzu boyutlandırma formülü), her bağlantının neden bir uygulama iş parçacığından daha pahalı olduğunu açıklar ve ardından tahmin etmeden max_connections ayarlama prosedürünü ayrıntılarıyla anlatır. kıyaslama metodolojimiz bu blogdaki tüm performans iddiaları için kullanılan ölçüm protokolünü belgelemektedir.

Temeller

  • Havuzlama olmadan max_connections, yalnızca Postgres'in paralel olarak verimli bir şekilde işleyebileceği bağlantıları değil, tüm eşzamanlı istemci bağlantılarını kapsamalıdır.
  • PostgreSQL wiki referans formülü: ideal aktif eşzamanlılık = (fiziksel çekirdekler × 2) + verimli diskler. Kesin bir sınır değil, ölçümle doğrulanacak bir başlangıç ​​noktası.
  • max_connections bir postmaster bağlam parametresidir: bunu değiştirmek, basit bir yeniden yüklemeyi değil, sunucunun tamamen yeniden başlatılmasını gerektirir.
  • Her Postgres bağlantısı, hafif bir iş parçacığı değil, ayrı bir sistem işlemidir: bağlantı sayısı arttıkça yükü gerçek kılan şey budur.
  • Kodda doğrulanmıştır: Aurabase, özel Postgres kümelerinde, kümenin boyutuna bağlı olarak max_connections sayısını 50 (ücretsiz katman) ile 400 (kurumsal katman) arasında değiştirir.
#
Teşhis

Postgres bağlantısı neden uygulama iş parçacığından daha pahalı?

Postgres, bağlantıları için hafif bir iş parçacığı havuzu kullanmaz. Her istemci bağlantısı tam teşekküllü bir sistem sürecini tetikler.

postmaster işlemi, kapatılana kadar her bağlantı denemesi için bu tek oturuma ayrılmış yeni bir ("çatal") oluşturur. Resmi proje belgeleri, mimari temeller bölümünde bu mekanizmayı tam olarak açıklamaktadır (postgresql.org/docs/current/connect-estab.html, “Bağlantı Semantiği” bölümü, 24 Ağustos 2026'da erişildi).

Bu seçimin gerçek bir avantajı vardır: Bir bağlantıdaki çökme diğerlerini etkilemez, her işlem sunucunun geri kalanından izole edilir. Aynı zamanda doğrudan bir maliyeti de vardır: her ek bağlantı, kendi bellek alanı ve çekirdek için kendi içerik değiştirme yüküyle birlikte, zamanlamaya tam bir işletim sistemi süreci ekler.

Pratikte neyi değiştirir?

Postgres'e havuzlama olmadan 500 doğrudan bağlantı açan bir uygulama, büyük çoğunluğu iki istek arasında boşta kalsa bile sunucuyu 500 eşzamanlı sistem sürecini yönetmeye zorlar.

#
Bellek maliyeti

Bir bağlantının gerçekte tükettiği şey: paylaşılan hafıza ve iş_mem

Belleği etkileyen iki farklı mekanizma vardır ve bunların karıştırılması neredeyse her zaman yanlış tanıya yol açar.

İlki sabittir. Başlangıçta Postgres, bu bağlantıların daha sonra açılıp açılmadığına bakılmaksızın, max_connections değerine göre boyutlandırılmış paylaşılan bellek yapılarını (kilitlemeler, işlem tablosu) ayırır. Bu ayara ilişkin resmi belgeler açıkça şunu belirtmektedir: bunun arttırılması, işletim sisteminizin varsayılan yapılandırmasının izin verdiğinden daha fazla sistem paylaşımlı belleği gerektirebilir (postgresql.org/docs/current/runtime-config-connection.html, 24 Ağustos 2026'da erişildi).

İkincisi değişkendir ve ölçekte çok daha tehlikelidir: work_mem bağlantı başına bir kez değil, sorgu planındaki sıralama veya karma işlemi başına bir kez tahsis edilir. Resmi belgeler bu noktada açıktır: karmaşık bir sorgu bu işlemlerin birçoğunu paralel olarak başlatabilir ve birkaç oturum aynı anda aynısını yapabilir, böylece gerçekte kullanılan belleğin değeri birkaç kat daha fazla olabilir work_mem (postgresql.org/docs/current/runtime-config-resource.html, 24 Ağustos 2026'da erişildi).

Hatırlanması gereken en kötü durum

Bir sunucunun belleğini tehdit eden yalnızca max_connections × work_mem değildir. Bu, max_connections × iş_mem × sorgu başına eşzamanlı işlem sayısıdır. Zararsız kabul edilen max_connections artışından sonra değişen veya belleği tükenen bir sunucuyu açıklayan bu üründür.

#
Formül

PostgreSQL wiki boyutlandırma formülü

Resmi PostgreSQL projesi wiki'si, donanımınızın paralel olarak kaç tane aktif bağlantı verimli bir şekilde işleyebileceğini hesaplamak için bir kıyaslama formülü belgelemektedir; toplamda kaç bağlantı açıldığını değil (wiki.postgresql.org/wiki/Number_Of_Database_Connections, 24 Ağustos 2026'da erişildi).

Formül

ideal aktif eşzamanlılık = (fiziksel çekirdekler × 2) + verimli diskler. Çekirdek sayısına hiper iş parçacığı dahil değildir. Ayrı bir fiziksel disk ("iş mili") kavramının orijinal anlamını büyük ölçüde kaybettiği modern SSD depolamada etkin disk sayısı 1'e yakın kalır.

8 fiziksel çekirdeğe ve SSD depolamaya sahip bir sunucuda formül, verim düşmeye başlamadan önce (8 × 2) + 1 = 17 aktif bağlantı sağlar. Bu rakam genellikle şaşırtıcıdır: Bir uygulamanın pratikte açtığı yüzlerce bağlantıyla karşılaştırıldığında çok küçük görünür. Aşağıdaki paragrafın konusu tam olarak budur.

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).

#
Prosedür

max_connections nasıl değiştirilir (ve yeniden başlatmanın neden gerekli olduğu)

max_connections çalışırken değiştirilemez. Bu bir postmaster bağlam parametresidir: Postgres, paylaşılan belleğini boyutlandırmak için başlangıçta bunu bir kez okur. Yapılandırmanın yeniden yüklenmesi (pg_reload_conf() veya SIGHUP) yeterli değildir; sunucuyu yeniden başlatmanız gerekir.

Yeniden başlatmanın gerekli olup olmadığını doğrulamak için öncelikle mevcut değeri ve içeriğini kontrol edin:

psqlsql
SHOW max_connections;

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

-- context='postmaster' yeniden başlatmanın gerekli olduğunu doğrular

Ardından yeni değeri uygulayın ve yeniden başlatın:

psqlsql
ALTER SYSTEM SET max_connections = '300';

-- Postgresql.auto.conf'ta yazılmıştır.
-- Postgres yeniden başlatılana kadar hiçbir etkisi olmaz.
terminalbash
# Sistemd ile
sudo systemctl restart postgresql

# Systemd olmadan, doğrudan pg_ctl ile
pg_ctl restart -D $PGDATA -m fast
Birçok kişinin unuttuğu bir marj

max_connections varsayılan olarak superuser_reserved_connections (varsayılan olarak 3) içerir: bu bağlantılar doyum durumunda bir süper kullanıcı için ayrılır, genel sayaca henüz ulaşılmasa bile uygulamanız için hiçbir zaman kullanılamazlar.

#
Giriş kodu

Aurabase, Postgres kümelerinde max_connections'a nasıl bütçe ayırıyor?

max_connections'ın boyutlandırılması yalnızca teorik bir alıştırma değildir. Aurabase, yönetilen Postgres kümelerinde bütçesini şu şekilde ayırıyor:

100
POSTGRES VARSAYILANI
herhangi bir ayarlamadan önce max_connections
50→400
ÖZEL AURABASE RULMANLARI
CNPG kümesi tarafından kurumsal ücretsiz
3
SÜPER KULLANICI AYRILDI
superuser_reserved_connections, Postgres varsayılanı

Özel kümeler: proje başına bir Postgres kümesi

Bu düzeyde (bkz. ayrılmış ve paylaşılan tabankarşılaştırmamız), her proje kendi CloudNativePG kümesini ve örneğin boyutuna göre boyutlandırılmış kendi max_connections bütçesini alır:

ücretsiz (özel)max_connections 501 örnek · 500 milyon vCPU · 512Mi
profesyonel (varsayılan)max_connections 2002 örnek · 1 vCPU · 2Gi
takımmax_connections 3003 örnek · 2 vCPU · 3Gi
işmax_connections 4003 örnek · 2 vCPU · 4Gi

Paylaşılan kümeler: bir kuruluşun çeşitli projeleri, paylaşılan bir bütçe

Bu ikinci yolda, aynı kuruluşun tüm projeleri, paylaşılan bir birincilin önünde bir CNPG havuzlayıcı (PgBouncer, transactionmodu) aracılığıyla bağlanır:

ücretsizmax_connections 50max_client_conn 100max_user_connections 20
profesyonelmax_connections 100max_client_conn 200max_user_connections 60
takımmax_connections 200max_client_conn 400max_user_connections 150

Bir kuruluştaki tüm projeler, paylaşılan bir uygulama rolü aracılığıyla bağlanır. Bu nedenle, max_user_connections tek başına bu rolün tüm küme genelinde açabileceği toplam sunucu bağlantılarını sınırlar: bu, yalnızca havuz oluşturucunun kendisiyle olan istemci bağlantılarını sınırlayan max_client_conndeğil, gerçek küme geneli korumadır.

Ancak bu havuz oluşturucu yalnızca SDK uygulama trafiğine hizmet eder. PostgREST, birincil hizmete (-rw) doğrudan bağlı kalır: işlem modunda havuzlama, pgrstadlı özel bir LISTEN kanalını dinleyen şema yeniden yükleme mekanizmasını bozar. Kendi bağlantıları (paylaşılan düzeyde çoğaltma başına 2, tahsis edilmiş düzeyde çoğaltma başına 10), bu nedenle herhangi bir havuzlayıcının dışında doğrudan birincilin max_connections bütçesinde sayılır ve tam olarak aşağıdaki prosedürün 1. adımının içermesi gereken türden "unutulmuş" bağlantıdır.

Şu anda kalibre edilen rakamlar, öyle varsayılıyor

Kod, bu paylaşılan havuzlayıcı bütçelerini, yayınlanmış bir karşılaştırmalı değerlendirmeden elde edilen sabit rakamlar olarak değil, yük altında pg_stat_activity ölçülerek gerçek koşullarda kalibre edilecek başlangıç değerleri olarak açıkça belgelemektedir. Bu, kıyaslama metodolojimiz'de açıklanan disiplinin aynısıdır: ayarlamadan önce ölçün, tahmin etmeyin, sonra umut edin. Bu kümeler, Postgres 16 vs 17 vs 18karşılaştırmamızda belgelenen bir seçim olan PostgreSQL 16 üzerinde çalışır.

#
Yöntem

Max_connections'ı havuzlama olmadan boyutlandırmak için 5 adımlı prosedür

Bu prosedür herhangi bir araca bağlı değildir: yönetilen veya kendi kendine barındırılan herhangi bir Postgres sunucusu için geçerlidir.

  1. Gerçek istemci bağlantılarınızı sayın. Uygulama işlemlerinin sayısı ile dahili havuzlarının boyutunun çarpımı, ayrıca yönetim araçları, çoğaltma ve izleme. max_connections tabanını belirleyen formül değil bu sayıdır.
  2. Donanımınızın ideal eşzamanlılığını PostgreSQL wiki'sindeki formülle hesaplayın: (fiziksel çekirdekler × 2) + verimli diskler. Bu şekil, bu bağlantılardan kaçının gerçekte verimi düşürmeden paralel olarak çalışabileceğini gösterir.
  3. Maksimum_bağlantıları, superuser_reserved_connections ve uygulama dışında kendi bağlantılarını açan tüm yönetici araçları için kenar boşluğuyla birlikte, 1. adım için gerçek ihtiyacın üzerine ayarlayın.
  4. Değişikliği ALTER SYSTEM SET ile uygulayın ve ardından sunucuyu yeniden başlatın. Bu bir postmaster parametresidir: yukarıda açıklandığı gibi basit bir yeniden yükleme yeterli değildir.
  5. Zaman içindeki pg_stat_aktivitesini izleyin. Boştaki bağlantıların sayısı etkin bağlantıların sayısını büyük ölçüde aşarsa, bu bir max_connections sorunu değildir: bu, daha yüksek bir sayı değil, sunucunun önünde bir havuzlayıcıya ihtiyacınız olduğunun sinyalidir.

5. adımdaki izleme isteği doğrudan kullanılabilir:

psqlsql
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state
ORDER BY count(*) DESC;
#
Uyarı sinyali

Formül artık yeterli olmadığında: bir havuzcuya ihtiyacınız olduğunu gösteren işaretler

Değeri ne olursa olsun max_connections artık yeterli olmadığında üç sinyal sistematik olarak geri döner.

  1. FATAL: sorry, too many clients already hatası, en yüksek yük sırasında görünürken, pg_stat_activity tarafından görüntülenen bağlantıların çoğunluğu boş durumda.
  2. Uygulama, sunucusuz bir ortamda veya bağlantıları Postgres'in bağlantı başına işlem modelinin uyum sağlamak üzere tasarlandığı zamandan çok daha hızlı açıp kapatan geçici çalışanlarla (uç işlevler, kısa işler) çalışır.
  3. Yukarıdaki formül ve prosedür zaten uygulanmıştır ve istemci bağlantılarına olan gerçek ihtiyaç, iş_mem veya paylaşılan_buffer'ları tehlikeye atmadan kullanılabilir belleğin ayırabileceği miktarı aşmaya devam etmektedir.

Bu üç durumda doğru cevap, daha yüksek bir max_connections değil, neredeyse her zaman uygulama ile Postgres arasında konumlandırılan bir havuzlayıcıdır. karşılaştırmamız PgBouncer, Supavisor ve PgCat üç seçeneğin ayrıntılarını verir ve işlem modu kılavuzumuz havuzlayıcı devreye girdiğinde en yaygın uzlaşmayı açıklar. Bağlantıların ötesindeki tüm Postgres ayarlamaları için üretim Postgres ayarlama kontrol listemizebakın.

#
Sıkça Sorulan Sorular

SSS

PostgreSQL'in varsayılan max_connections değeri nedir?+
100, varsayılan olarak süper kullanıcıya ayrılmış 3 bağlantıyla (superuser_reserved_connections). Bu varsayılan, bir havuzlayıcıdan geçen birçok uygulama için uygundur, ancak bir uygulama filosunun her biri kendi bağlantı grubunu açtığında, havuzlama yapılmadan hızla yetersiz hale gelir.
PostgreSQL'i yeniden başlatmadan max_connections'ı değiştirebilir miyiz?+
Hayır. max_connections bir postmaster bağlam parametresidir: Postgres, paylaşılan belleğin boyutunu belirlemek için başlangıçta bunu bir kez okur. ALTER SYSTEM SET yeni değeri postgresql.auto.conf dosyasına yazar, ancak yalnızca sunucunun tam olarak yeniden başlatılması bunu uygular; yeniden yükleme veya SIGHUP yeterli değildir.
Boş bir PostgreSQL bağlantısı ne kadar bellek tüketir?+
Tek bir resmi sayı yoktur: Work_mem'e, paylaşılan_buffer'lara ve oturum başına yüklenen uzantılara bağlıdır. Ancak belgelenen şey, iş_mem'in bağlantı başına değil, bir sorgudaki sıralama veya karma işlemi başına tahsis edildiğidir: dolayısıyla tek bir karmaşık sorgu, tek bir etkin bağlantıda iş_mem'i birkaç kez tüketebilir.
Her zaman PgBouncer gibi bir havuz oyuncusunu daha yüksek bir max_connections'a mı tercih etmeliyiz?+
Çoğu durumda, evet, gerçek istemci bağlantılarının sayısı PostgreSQL wiki formülü tarafından hesaplanan ideal eşzamanlılığı büyük ölçüde aştığında. İşlem modu havuzlayıcısı, uygulama tarafında çok daha fazla sayıda mantıksal bağlantı arasında az sayıda fiziksel bağlantıyı bir havuzda toplar. Hangisini seçmek için PgBouncer, Supavisor ve PgCat karşılaştırmamıza bakın.
(Çekirdek × 2) + verimli diskler formülü tam olarak neyi ölçer?+
İdeal aktif eşzamanlılığı tahmin eder: max_connections'ta açılacak bağlantıların toplam sayısı değil, belirli bir sunucunun CPU'sunun ve diskinin verimi düşürmeden paralel olarak işleyebileceği isteklerin sayısı. Bu, katı bir sınır değil, resmi PostgreSQL proje wiki'si tarafından belgelenen, ölçümle doğrulanacak bir başlangıç ​​noktasıdır.
Postgres sunucumun bağlantı sınırına yakın olup olmadığını nasıl anlarım?+
Pg_stat_activity'yi sorgulayın ve etkin durumdaki bağlantı sayısını boş durumdakilerle karşılaştırın. Max_connections sınırına yakın, arkasında etkin bir istek bulunmayan çok sayıda boş bağlantı, neredeyse her zaman max_connections'ı daha da yükseltme ihtiyacından ziyade havuz oluşturma ihtiyacını gösterir.

DAĞITILMAYA HAZIR MISINIZ?

Beş dakika içinde arka ucunuz.

Kredi kartı gerekmez · 500 MB ücretsiz · 50.000 MAU