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
postmasterbağ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.
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.
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.
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).
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.
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).
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).
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:
Ardından yeni değeri uygulayın ve yeniden başlatın:
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.
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:
Ö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 50 | 1 örnek · 500 milyon vCPU · 512Mi |
|---|---|---|
| profesyonel (varsayılan) | max_connections 200 | 2 örnek · 1 vCPU · 2Gi |
| takım | max_connections 300 | 3 örnek · 2 vCPU · 3Gi |
| iş | max_connections 400 | 3 ö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:
| ücretsiz | max_connections 50 | max_client_conn 100 | max_user_connections 20 |
|---|---|---|---|
| profesyonel | max_connections 100 | max_client_conn 200 | max_user_connections 60 |
| takım | max_connections 200 | max_client_conn 400 | max_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.
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.
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.
- 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.
- 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.
- Maksimum_bağlantıları,
superuser_reserved_connectionsve 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. - 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.
- 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:
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.
FATAL: sorry, too many clients alreadyhatası, en yüksek yük sırasında görünürken,pg_stat_activitytarafından görüntülenen bağlantıların çoğunluğu boş durumda.- 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.
- 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.