Postgresql:无法建立连接,因为目标计算机主动拒绝它

时间:2016-08-02 20:40:41

标签: windows postgresql azure database-connection windows-server-2012-r2

在Azure中的Windows Server 2012 R2上运行Postgresql 9.5

在我的应用程序上运行一些加载测试时,由于无法连接到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

我知道,我知道..接受来自所有人的连接并不是保存,但这仅用于测试目的,并确保这些设置不会阻止任何连接。 So this answer is void

我一直在监视服务器上的连接数量,在负载下它稳定在75. Postgres正在使用大约350mb的RAM。因此,给定配置和vm规范(7gb ram),应该有足够的空间来创建更多连接。但是,当下一个场景开始旋转时,连接数不会增加,它会保持水平并开始提供这些关于无连接的日志消息。

这可能是什么问题?

3 个答案:

答案 0 :(得分:4)

听起来这听起来不是Postgres问题(因此您正在检查的DB统计数据没有变化),而是服务器正在停止流量。可能是因为在处理负载测试查询时该端口上的流量已经饱和?

听起来你没有点击任何Azure resource limits(包括database limits,如果这适用于您的设置?),但是如果没有关于负载测试的更多详细信息,则很难说到底需要什么。

来自网络和其他SO答案的解决方案建议:

  • 禁用TCP自动调整并调整服务器上的TCP / IP注册表项,例如设置TcpAckFrequency - 有关详细信息,请参阅this article
  • 进行TCP设置调整(如WinsockListenBacklog) - 可能会受到连接池是否正在使用的影响 - 请参阅this MS support article,这是针对SQL Server 2005但有一些关于故障排除的重要提示拒绝TCP / IP连接(使用网络监视器,但适用于较新的工具)
  • 如果您对服务器有足够的控制权,请加快请求处理速度 - source
  • 禁用网络代理(在您的负载测试应用中):<defaultProxy> <proxy usesystemdefault="False"/> </defaultProxy> - source

答案 1 :(得分:1)

最可能的原因是防火墙/防病毒:

  • 软件/个人防火墙设置
  • 多个软件/个人防火墙
  • 防病毒软件
  • LSP Layer
  • (虚拟)路由器固件

您当前的Azure基础架构是否包含防火墙或防病毒软件?

此外,在进行一些额外的搜索时,看起来这是一个标准的Windows&#34;连接被拒绝&#34;消息,这表明PostgreSQL试图连接某些东西并被拒绝。

网络中的一个网络元素(假设您仍然连接到服务器)也可能会延迟或丢弃某些数据库登录/身份验证网络数据包(例如假设为伪造的auth.replay)......

当错误出现时,您也可以使用数据包分析器(如Wireshark)来记录/检查网络流量。

此致

答案 2 :(得分:0)

当我尝试从应用程序连接Postgresql时,我在AspNet核心应用程序中遇到了相同的问题。当我调用Program.cs函数时,在Migrate文件中引发了错误。

public static void Main(string[] args) {
    try {
        var host = BuildWebHost(args);
        using(var scope = host.Services.CreateScope()) {
            // Migrate once after app is started.
            scope.ServiceProvider.GetService <MyDatabaseContext>().Migrate();
        }
        host.Run();
    }
    catch(Exception e) {
        //NLog: catch setup errors
        _logger ? .Error(e, "Stopped program because of exception: ");
        throw;
    }
}

为解决此问题,我执行了以下步骤。

  1. 转到Postgresql
  2. 检查services.msc服务是否正在运行
  3. 试图使用我在数据库上下文中提供的用户名和密码登录pgAdmin

所有内容都是文件,并且您知道 5432 Postgresql的默认端口,并且以某种方式我在应用程序连接字符串中使用了不同的端口,将其更改为5432可以解决此问题给我的问题。

"ConnectionString": "User Id=postgres;Password=mypwd;Host=localhost;Port=5432;Database=mydb;"