在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),应该有足够的空间来创建更多连接。但是,当下一个场景开始旋转时,连接数不会增加,它会保持水平并开始提供这些关于无连接的日志消息。
这可能是什么问题?
答案 0 :(得分:4)
听起来这听起来不是Postgres问题(因此您正在检查的DB统计数据没有变化),而是服务器正在停止流量。可能是因为在处理负载测试查询时该端口上的流量已经饱和?
听起来你没有点击任何Azure resource limits(包括database limits,如果这适用于您的设置?),但是如果没有关于负载测试的更多详细信息,则很难说到底需要什么。
来自网络和其他SO答案的解决方案建议:
TcpAckFrequency
- 有关详细信息,请参阅this article <defaultProxy> <proxy usesystemdefault="False"/> </defaultProxy>
- source 答案 1 :(得分:1)
最可能的原因是防火墙/防病毒:
您当前的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;
}
}
为解决此问题,我执行了以下步骤。
Postgresql
services.msc
服务是否正在运行
pgAdmin
所有内容都是文件,并且您知道 5432 是Postgresql
的默认端口,并且以某种方式我在应用程序连接字符串中使用了不同的端口,将其更改为5432可以解决此问题给我的问题。
"ConnectionString": "User Id=postgres;Password=mypwd;Host=localhost;Port=5432;Database=mydb;"