Я запускаю pgBouncer перед занятой базой данных Postgres 9. Большую часть времени работает нормально. Но каждые несколько часов я получаю сообщение об ошибке из моего приложения, за исключением psycopg2:
OperationalError ('не удалось подключиться к серверу: невозможно назначить запрошенный адрес. Сервер работает на хосте "neo-hulk" и принимает соединения TCP / IP через порт 6432?')
Это приложение на Python с кучей рабочих из сельдерея, выполняющих задания. Когда появляются эти ошибки, я проверяю pgbouncer db и размер пула находится в допустимых пределах. После некоторых экспериментов я установил максимальный размер пула равным 400, а размер пула равным 200. Режим пула - это «сессия» (запросы в основном автоматические, почти нет транзакций).
Что делает pgBouncer «исчезающим» таким образом? это только в течение коротких периодов времени (и в целом мы говорим о крошечном количестве запросов по сравнению с огромным количеством запросов, которые он обрабатывает), но те запросы, которые терпят неудачу, важны.
Спасибо!
источник
-vvv
и посмотреть, сможете ли вы сопоставить аномальный вывод журнала с вашими ошибками во времени.Ответы:
Часть « Невозможно назначить запрошенный адрес » в сообщении об ошибке происходит из стека TCP ядра. При периодическом обнаружении это обычно означает, что пространство доступных сокетов исчерпано из-за слишком большого количества сокетов в состоянии ожидания (
TIME_WAIT
или менее вероятноFIN_WAIT_1
илиFIN_WAIT_2
)Диапазон портов сокетов может быть выведен с помощью
cat /proc/sys/net/ipv4/ip_local_port_range
. Значение по умолчанию для стандартного ядра Linux обычно32768 61000
.Вы можете проверить результат
netstat -ton|grep WAIT
на клиенте (ах) и на хосте pgBouncer, когда система занята.-o
Флаг будет показывать счетчики времени ожидания , связанные с состояниями ожидания.Если общее количество TCP-сокетов близко к
61000-32768=28232
этому, вероятно, проблема в исчерпании этого диапазона. Поскольку закрытый сокет проводит вTIME_WAIT
состоянии 60 секунд в нормальном состоянии, если клиентский хост подключается более 28232 раз в течение одной минуты, новые соединения не будут работать с указанной ошибкой, пока порты не будут освобождены.В качестве первого обходного пути диапазон портов TCP может быть расширен:
Если это не устраивает, проверьте
tcp_tw_recycle
иtcp_tw_reuse
флаги, а также перестройка через/proc/sys/net/ipv4
иsysctl
.Они определены как (от
man tcp
):Лично я имел успех,
tcp_tw_recycle
когда столкнулся с этой проблемой с клиентским приложением MySQL, но не воспринимайте это как рекомендацию, мое понимание TCP в лучшем случае поверхностно.источник
/etc/sysctl.conf
так,net.ipv4.ip_local_port_range = 1025 65535
чтобы она сохранялась при перезагрузке.