2012-04-28 18 views
5

PgPool'u yaklaşık 150 istekleri kabul edecek şekilde yapılandırmaya çalışıyorum. Postgres sunucusu yalnızca 100 bağlantı kabul edecek şekilde yapılandırıldı. 100'ün ötesinde herhangi bir şey PgPool tarafından toplanmalıdır. Bunu anlayamıyorum. Sadece istekleri sıraya almak için PgPool'a ihtiyacım var, şu anki konfigürasyon bunu yapmıyor. JMeter testimden 100'ün ötesinde bağlantı kurmaya çalıştığımda, postgres bana PSQL hatası veren bir hata veriyor: sorry, too many clients.İyi bir PgPool II yapılandırması

yalnızca aşağıdaki parametrelerle pgpool yapılandırmış I:

listen_address = 'localhost' 
port = 9999 
backend_hostname0 = 'localhost' 
backend_port0 = 5432 
num_init_children = 100 
max_pool = 4 
child_life_time =120 
child_max_connections = 0 
connections_life_tome = 120 
client_idle_limit = 0 

Sadece pgpool ekstra bağlantıları isteklerini Kuyruğa gerektirdiğinden bu yukarıdaki konfigürasyon doğru mu? Lütfen uygun yapılandırma hakkında öneride bulunun.

+0

Postgresql'e doğrudan bağlanmak yerine uygulamanızda pgpool örneğini hedefliyor musunuz? –

+0

Postgre sunucusuna PGPool bağlantı noktası üzerinden bağlanıyorum 9999 'jdbc: postgresql: // localhost: 9999/dbname? User = kullanıcı adı ve parola = passwordofuser' –

cevap

2

İlk şey, maksimum havuz boyutunuz olarak istediğiniz şeyi bulmaktır. PostgreSQL performansı (her ikisi de verim ve gecikme açısından) genellikle en iyi aktif bağlantı sayısı bir yerde ((2 * çekirdek sayısı) + etkin iş mili sayısı) olduğunda en iyisidir. Etkili iş mili sayısı anlaşılması zor olabilir - etkin veri kümeniz tamamen önbelleğe alınmışsa, örneğin sıfır olarak sayın. Bu hesaplama için ekstra iş parçacıklarını hiper iş parçacığı olarak saymayın. Ayrıca, ağ gecikmesi sorunları nedeniyle, etkin numaralı bağlantı sayısını korumak için hesaplanan numaradan biraz daha büyük bir havuza ihtiyacınız olabilir. Donanımınız ve iş yükünüz için tatlı noktayı bulmak için bazı ölçütler yapmanız gerekebilir.

Ayarlamanız gereken ayar, num_init_children ile aynı veya daha düşük tutulan child_max_connections şeklindedir.

+0

2 * çekirdek sayısı + etkin işmili sayısı ?? num_init_children parametresi için? bir örnek verebilir misin Anladığımdan emin değilim .. –

+0

Hiper-iş parçacığı olan bir dört çekirdekli işlemci olduğunu varsayalım. Bu dört çekirdek, bu yüzden muhtemelen sekiz adete kadar aktif veritabanı bağlantısından faydalanabilirsiniz. Veriler için altı sürücülü bir RAID 10'unuz olduğunu varsayalım. Tamamen önbelleğe alınmışsanız, muhtemelen hiçbir şey eklemezsiniz, çünkü sürücüler çok sayıda rastgele okuma için kullanılmamaktadır. Eğer diske bağlı iseniz, altıya kadar sayıyorsunuz, 14 bağlantıya geçiyorsunuz. Kısmen önbelleğe alınmışsanız, etkin önbellek boyutu muhtemelen bir yerlerde olabilir. Oradan başlayın ve iş yükünüzle biraz daha büyük ve küçük havuzları test edin. – kgrittn

+0

PgPool wiki'nin bu ifadesi bana yardımcı oldu: - Özet olarak, max_pool, num_init_children, max_connections, superuser_reserved_connections, aşağıdaki formülü karşılamalıdır: max_pool * num_init_children <= (max_connections - superuser_reserved_connections) (sorgu iptali gerekmez). i 'localhost''a = listen_address 'benim konfigürasyonu değiştirilebilir noktası = 9999 backend_hostname0 =' localhost''a backend_port0 = 5432 num_init_children = 25 max_pool = 4 child_life_time = 120 child_max_connections = 100 connections_life_tome = 120 client_idle_limit = 25' –

4

pgpool'daki 'child_max_connections', DB'ye izin verilen maksimum bağlantı DEĞİLDİR. Bir havuzlanmış bağlantının, sonlanmadan ve yeniden başlatılmadan önce kullanılabilen sayısıdır. Bağlantı dişlerini geri dönüştürmek ve bellek sızıntılarını durdurmak için var.

Max_pool x num_init_children formülü, pgpool'un Postgresql yapacağı maksimum bağlantı sayısını tanımlar. Açıkçası, bunun postgresql'de ayarlanan 'max_connections' değerinden daha az olması gerekir, aksi halde pgpool DB'yi kullanılamaz bir arka uç olarak işaretler. Yönetici kullanımı için ayrılmış bazı DB bağlantılarınız varsa, daha fazla sayıda pgpool bağlantı sayısını azaltmanız gerekir.

Yani, diyorum ki, formüldeki 'max_connections', postgresql.conf dosyasında ayarlanan parametredir. Yukardaki yorumda 'child_max_connections' değerini 100'e ayarlamak, sadece, her 100 defada bir her 100 kez kapatılıp yeniden açıldığını gösterir.

İlgili konular