Ich führe pgBouncer vor einer ausgelasteten Postgres 9-Datenbank aus. Meistens funktioniert es gut. Aber alle paar Stunden erhalte ich eine Fehler-E-Mail von meiner Anwendung, mit Ausnahme von psycopg2:
OperationalError ('Verbindung zum Server konnte nicht hergestellt werden: Angeforderte Adresse kann nicht zugewiesen werden. Wird der Server auf dem Host "neo-hulk" ausgeführt und akzeptiert TCP / IP-Verbindungen auf Port 6432?')
Dies ist eine Python-App mit einer Reihe von Sellerie-Arbeitern, die Aufgaben ausführen. Wenn diese Fehler auftreten, überprüfe ich die pgbouncer-Datenbank und die Poolgröße ist in Grenzen. Nach einigen Experimenten habe ich die maximale Poolgröße auf 400 und die Poolgröße auf 200 festgelegt. Der Poolmodus ist "Sitzung" (Anforderungen werden meistens automatisch festgeschrieben, fast keine Transaktionen).
Was lässt pgBouncer so "verschwinden"? Es ist nur für kurze Zeiträume (und insgesamt sprechen wir über eine winzige Anzahl von Anfragen im Vergleich zu der Menge an Anfragen, die es bearbeitet), aber diejenigen Anfragen, die fehlschlagen, sind wichtig.
Vielen Dank!
quelle
-vvv
und prüfen, ob Sie die anomale Protokollausgabe rechtzeitig mit Ihren Fehlern abgleichen können.Antworten:
Der Teil " Angeforderte Adresse kann nicht zugewiesen werden " in der Fehlermeldung stammt vom Kernel-TCP-Stack. Wenn dies zeitweise auftritt, bedeutet dies normalerweise, dass der Speicherplatz der verfügbaren Steckdosen aufgrund zu vieler Steckdosen im Wartezustand (
TIME_WAIT
oder weniger wahrscheinlichFIN_WAIT_1
oderFIN_WAIT_2
) erschöpft ist.Der Bereich der Socket-Ports kann von ausgegeben werden
cat /proc/sys/net/ipv4/ip_local_port_range
. Der Standardwert für einen Standard-Linux-Kernel ist im Allgemeinen32768 61000
.Sie können das Ergebnis
netstat -ton|grep WAIT
auf den Clients und auf dem Host des pgBouncer überprüfen, wenn das System ausgelastet ist. Das-o
Flag zeigt die Zeitüberschreitungszähler an, die sich auf Wartezustände beziehen.Wenn die Gesamtzahl der TCP-Sockets nahe beieinander liegt,
61000-32768=28232
ist die Erschöpfung dieses Bereichs wahrscheinlich Ihr Problem. Da ein geschlossener SocketTIME_WAIT
im Normalzustand 60 Sekunden im Status verbringt , schlagen neue Verbindungen mit dem genannten Fehler fehl, bis Ports freigegeben werden, wenn ein Client-Host in einer Minute mehr als 28232 Mal eine Verbindung herstellt.Als erste Problemumgehung kann der Bereich der TCP-Ports erweitert werden:
Wenn es nicht zufriedenstellend ist, überprüfen Sie die
tcp_tw_recycle
undtcp_tw_reuse
-Flaggen, die auch durch/proc/sys/net/ipv4
und eingestellt werden könnensysctl
.Sie sind definiert als (von
man tcp
):Persönlich hatte ich Erfolg mit
tcp_tw_recycle
diesem Problem mit einer MySQL-Client-App, aber nehme dies nicht als Empfehlung, da mein Verständnis von TCP bestenfalls oberflächlich ist.quelle
/etc/sysctl.conf
so einstellennet.ipv4.ip_local_port_range = 1025 65535
, dass sie auch nach einem Neustart erhalten bleibt.