pgBouncer harika çalışıyor ancak bazen kullanılamıyor


9

Ben meşgul bir postgres 9 veritabanı önünde pgBouncer çalıştırıyorum. Çoğu zaman iyi çalışır. Ancak birkaç saatte bir psycopg2 istisnası ile uygulamamdan bir hata e-postası alırım:

OperationalError ('sunucuya bağlanılamadı: İstenen adres atanamıyor Sunucu "neo-hulk" ana bilgisayarında mı çalışıyor ve 6432 numaralı bağlantı noktasında TCP / IP bağlantılarını kabul ediyor mu?')

Bu görevleri çalışan kereviz işçilerin bir grup ile bir python app. Bu hatalar geldiğinde ben pgbouncer db kontrol ve havuz boyutu sınırları içinde. Bazı denemelerden sonra havuz maksimum boyutunu 400 ve havuz boyutunu 200 olarak ayarladım. Havuz modu "oturum" dur (istekler çoğunlukla otomatik taahhüttür, neredeyse hiçbir işlem değildir).

PgBouncer'ı `` yok '' yapan nedir? sadece kısa süreler için (ve toplamda, taleplerin iş hacmine kıyasla küçük bir miktar talep hakkında konuşuyoruz), ancak başarısız olan talepler önemlidir.

Teşekkürler!


İşletim sistemi ve sürümü? Çekirdek sürümü Linux ise? Tam PostgreSQL ve PgBouncer sürümleri? PgBouncer'ı hata ayıklama günlüğü düzeyinde çalıştırdınız ve faydalı bir şey rapor edip etmediğini gördünüz mü?
Craig Ringer

Debian 6. Linux sürüm 2.6.32-5-amd64 (Debian 2.6.32-48squeeze1) pgbouncer sürüm 1.5.4 Postgres 9.1. Günlük, biraz fazla olduğunu düşündüğüm gibi bağlantı / bağlantıyı kesmiyor, ancak bu uygulama hataları atıldığında hiçbir hata yok. Hata psycopg2, konuşacak db sunucusu olmadığını düşünmekten geliyor, ancak bu sorun önceden mevcut değil
Harel

1
Hm, şu anki PgBouncer ve çekirdek eski ama oldukça kararlı. Ben PgBouncer ile daha ayrıntılı günlüğü etkinleştirmeniz gerektiğini düşünüyorum -vvvve anormal günlük çıktısını zaman içinde hataları ile eşleşip eşleşemeyeceğini görüyorum.
Craig Ringer

Bir "set verbose = 1; reload;" pgbouncer kabuğunda ve günlükte olağan dışı bir şey bulamadı. Bu bir üretim sistemidir, bu yüzden -vvv ile hizmetini arka plan programı olarak çalıştırmak için durdurulamaz. Umarım aynı sonucu aldım. hatanın pgbouncer'a hiç bağlanamadığını, yani bu bağlantı noktasında dinlediğini bulamadığını unutmayın. Her zaman binlerce bağlantı vardır ve az sayıda bağlantı bu şekilde başarısız olur.
Harel

Tricky; potansiyel bir yarış durumu gibi görünüyor, ama ne / nerede ...
Craig Ringer

Yanıtlar:


15

" Atanamıyor İstenen adres hata mesajında" kısmı çekirdek TCP yığını geliyor. Aralıklı olarak karşılaşılan, bu tipik kullanılabilir yuva alanı nedeniyle bekleme durumunda çok fazla priz bitkin (anlamına gelir TIME_WAIT, ya da daha az ihtimalle FIN_WAIT_1ya FIN_WAIT_2)

Soket bağlantı noktası aralığının çıkışı yapılabilir cat /proc/sys/net/ipv4/ip_local_port_range. Stok Linux çekirdeğindeki varsayılan değer genellikle değeridir 32768 61000.

netstat -ton|grep WAITSistem meşgulken, istemci (ler) ve pgBouncer'in ana bilgisayarındaki sonucunu kontrol edebilirsiniz . -oBayrak bekleme durumlarına ilişkin zaman aşımı sayaçları gösterecektir.

Toplam TCP soketi sayısı yakınsa 61000-32768=28232, bu aralığın tükenmesi muhtemelen sorun olabilir. Kapalı bir soket TIME_WAITnormal durumda 60 saniye geçirdiğinden , bir istemci ana bilgisayar bir dakika içinde 28232 kereden fazla bağlanırsa, bağlantı noktaları serbest bırakılana kadar yeni bağlantılar belirtilen hatayla başarısız olur.

İlk geçici çözüm olarak, TCP bağlantı noktaları aralığı genişletilebilir:

 # echo "1025 65535" >/proc/sys/net/ipv4/ip_local_port_range

Tatmin edici değilse, tcp_tw_recycleve tcp_tw_reuseişaretlerini de /proc/sys/net/ipv4ve üzerinden ayarlanabilir sysctl.

Bunlar (den man tcp) olarak tanımlanır :

       tcp_tw_recycle (Boolean; varsayılan: devre dışı; Linux 2.4'ten beri)
              TIME_WAIT soketlerinin hızlı geri dönüştürülmesini etkinleştirin. Bunu etkinleştirmek
              seçeneği, çalışma sırasında sorunlara neden olduğu için önerilmez‐
              NAT (Ağ Adres Çevirisi).

       tcp_tw_reuse (Boolean; varsayılan: devre dışı; Linux 2.4.19 / 2.6'dan beri)
              TIME_WAIT soketlerinin yeni bağlantılar için yeniden kullanılmasına izin ver
              protokol açısından güvenli. Olmadan değiştirilmemelidir
              teknik uzmanların tavsiyesi / talebi.

Şahsen tcp_tw_recyclebir MySQL istemci uygulaması ile bu sorunla karşı karşıya kaldığında başarı elde ettim , ama bunu bir öneri olarak almıyorum, TCP anlayışım en iyi yüzeysel.


1
Bu cevap, TCP'nin yüzeysel olarak anlaşıldığı her şeyi gösterir. Bunun için teşekkür ederim. Bağlantı noktası aralığını artırdım ve herhangi bir etkisi olup olmadığını görmek için bir süre çalışmasına izin verdim. (Ayarladıktan sonra yeniden başlatmam gerekir mi?)
Harel

Bence liman artışı bunu başardı. Şimdiye kadar herhangi bir hata almadım. Netstat satırlarının kabaca sayımı, istemcide 20K'ye yakın gösterir, bu nedenle oradan 28K varsayılan sınırına kadar uzun değildir. Bunun için teşekkürler!
Harel

1
İyi! Sen ayarı koymak istiyorum /etc/sysctl.confolarak net.ipv4.ip_local_port_range = 1025 65535o yeniden doğmuş arasında varlığını sahip olmak.
Daniel Vérité

Teşekkürler. O zamandan beri hatalar aldım ama bu değil, bu yüzden hala iyi. Birkaç gün çalışmasına izin vermek ve izin değişikliği yapacak. Şimdiye kadar çalışıyor gibi görünüyor sevindim çünkü diğer değişiklikler beni korkutuyor :)
Harel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.