Postgresql: не удалось установить соединение, поскольку целевая машина активно отказалась от него

запуск Postgresql 9.5 на windows server 2012 R2 в Azure

при запуске некоторых loadtests в моем приложении я получаю ошибки при невозможности подключения к серверу postgres. В логах postgres я получаю следующее сообщение:

не удалось получить данные от клиента: не удалось установить соединение потому что целевая машина активно отказалась от него.

это происходит только тогда, когда loadtest переходит к следующему сценарию, нажимая другая часть кода. Поэтому требуются новые подключения к базе данных. Но через 10-20 секунд остальная часть сценария работает безупречно, не задевая никаких других икот. Таким образом, проблема заключается в tcp-соединениях. (Мой код повторяет попытку пару раз, но невозможно позволить ему повторить попытку в течение 20 секунд)

Я использую следующие настройки в конфигурационные файлы

postgresql.conf

listen_addresses = '*'
max_connections = 500   
shared_buffers = 1024MB     
temp_buffers = 2MB
work_mem = 2MB  
maintenance_work_mem = 128MB        

файл pg_hba.conf

host    all             all             0.0.0.0/0               trust
host    all             all             ::/0                    trust

Я знаю, я знать.. Это не сохранить, чтобы принимать соединения от всех, но это только для целей тестирования и убедиться, что эти настройки не блокируют любое соединение. Итак, этот ответ пуст

я отслеживал количество соединений на сервере и под нагрузкой он стабилен на 75. Postgres использует около 350mb ОЗУ. Поэтому, учитывая конфигурацию и спецификации vm (7gb ram), должно быть много места для создания большего количества соединений. Однако, когда следующий сценарий закручивается количество соединений не увеличивается, он остается на уровне и начинает давать эти сообщения журнала о том, что соединение не может быть сделано.

что может быть проблемой здесь?

2 ответов


похоже, что это не проблема Postgres (следовательно, никаких изменений в статистике БД, которую вы проверяете), а то, что трафик останавливается сервером. Возможно, потому, что трафик на этом порту насыщен при обработке ваших запросов нагрузочного тестирования?

это не звучит, как вы ударяете любой из ограничения ресурсов Azure (включая ограничения базы данных если это относится к вашей настройке?), но без более подробной информации о ваших нагрузочных тестах это сложно сказать именно то, что нужно.

решения со всего интернета и другие ответы so предлагают:

  • отключить автонастройку TCP и настроить ключи реестра TCP/IP на сервере, например, set TcpAckFrequency - см. в этой статье дополнительные сведения
  • сделайте настройки настройки TCP (например,WinsockListenBacklog) - что может зависеть от того, используется пул соединений или нет - см. эта статья поддержки MS, который для SQL Server 2005, но имеет некоторые отличные советы по устранению неполадок отклоненных TCP / IP-соединений (с помощью сетевого монитора, но применяется к более новым средствам)
  • более быстрая обработка запросов, если у вас достаточно контроля над сервером -источник
  • отключение сетевого проксирования (в приложении для тестирования нагрузки):<defaultProxy> <proxy usesystemdefault="False"/> </defaultProxy> -источник

наиболее возможной причиной является Брандмауэр / антивирус:

  • Программное Обеспечение / Личные Настройки Брандмауэра
  • Множественное Программное Обеспечение / Личные Брандмауэры
  • антивирусные программы
  • слой LSP
  • (Виртуальная) Прошивка Маршрутизатора

содержит ли текущая инфраструктура Azure брандмауэр или антивирус ?

кроме того, при выполнении некоторых дополнительных поисков, похоже, что это стандартное соединение Windows сообщение "отказано", которое предполагает, что PostgreSQL пытается подключиться к чему-то и получает отказ.

также возможно, что один сетевой элемент в вашей сети-при условии, что вы все еще подключены к серверу - задержит или отбросит некоторые сетевые пакеты входа/аутентификации DB (рассматриваемые, например, как поддельная аутентификация.переигрывать. )..

вы также можете использовать анализатор пакетов (например,Wireshark) для записи / проверки сетевого потока при ошибке появиться.

в отношении