Saya menjalankan pgBouncer di depan database postgres 9 yang sibuk. Untuk sebagian besar waktu itu berfungsi dengan baik. Tetapi setiap beberapa jam saya akan mendapatkan email kesalahan dari aplikasi saya dengan pengecualian dari psycopg2:
OperationalError ('tidak dapat terhubung ke server: Tidak dapat menetapkan alamat yang diminta Apakah server berjalan pada host "neo-hulk" dan menerima koneksi TCP / IP pada port 6432?')
Ini adalah aplikasi python dengan sekelompok pekerja seledri yang menjalankan tugas. Ketika kesalahan-kesalahan itu tiba, saya memeriksa pgbouncer db dan ukuran kumpulan masih dalam batas. Setelah beberapa percobaan, saya telah mengatur ukuran max kolam ke 400 dan ukuran pool ke 200. Mode pool adalah "sesi" (sebagian besar permintaan komit otomatis, hampir tidak ada transaksi).
Apa yang membuat pgBuncer 'menghilang' seperti itu? ini hanya untuk periode waktu yang singkat (dan secara total kita berbicara tentang sejumlah kecil permintaan dibandingkan dengan volume permintaan yang diberikannya) tetapi permintaan yang gagal itu penting.
Terima kasih!
sumber
-vvv
dan melihat apakah Anda dapat mencocokkan keluaran log yang aneh dengan kesalahan Anda dalam waktu.Jawaban:
Bagian " Tidak dapat menetapkan alamat yang diminta " dalam pesan kesalahan berasal dari tumpukan TCP kernel. Ketika ditemui sesekali, ini biasanya berarti bahwa ruang soket yang tersedia habis karena terlalu banyak soket dalam keadaan menunggu (
TIME_WAIT
, atau kurang mungkinFIN_WAIT_1
atauFIN_WAIT_2
)Kisaran port soket dapat dihasilkan oleh
cat /proc/sys/net/ipv4/ip_local_port_range
. Nilai default pada kernel Linux stock umumnya32768 61000
.Anda dapat memeriksa hasil
netstat -ton|grep WAIT
pada klien dan host pgBuncer ketika sistem sedang sibuk. The-o
bendera akan menunjukkan counter batas waktu yang terkait dengan negara menunggu.Jika jumlah total soket TCP dekat dengan itu
61000-32768=28232
maka kelelahan rentang ini kemungkinan menjadi masalah Anda. Karena soket tertutup menghabiskan 60 detik dalamTIME_WAIT
kondisi normal, jika host klien menghubungkan lebih dari 28232 kali dalam satu menit, koneksi baru akan gagal dengan kesalahan yang disebutkan sampai port dibebaskan.Sebagai solusi pertama, rentang port TCP dapat diperpanjang:
Jika tidak memuaskan, periksa
tcp_tw_recycle
dantcp_tw_reuse
beri tanda, juga bisa dicari melalui/proc/sys/net/ipv4
dansysctl
.Mereka didefinisikan sebagai (dari
man tcp
):Secara pribadi saya berhasil
tcp_tw_recycle
ketika dihadapkan dengan masalah ini dengan aplikasi klien MySQL, tetapi jangan menganggap ini sebagai rekomendasi, pemahaman saya tentang TCP menjadi dangkal.sumber
/etc/sysctl.conf
karenanet.ipv4.ip_local_port_range = 1025 65535
untuk memilikinya bertahan di reboot.