限制请求的数量是多少?为什么`从池中获取连接时超时?

时间:2015-02-03 15:38:09

标签: c# postgresql nhibernate npgsql

在高负载条件下,NHibernate有时会在调用BeginTransaction时抛出异常。该消息在Npgsql的RequestConnector方法中包含Timeout while getting a connection from pool

在pg_log中:could not receive data from client: No connection could be made because the target machine actively refused it.

Postgres统计数据不显示任何昂贵的查询。

该机器有足够的免费CPU和RAM资源。

版本:Postgres 9.4.0 64位,NHibernate 3.3.1.4000,Npgsql 2.2.3。

Postgres设置:

shared_buffers = 128MB
max_connections = 300
checkpoint_segments = 6

连接字符串设置:

Pooling = true;
MINPOOLSIZE=20;
MAXPOOLSIZE=1000;

Postgres和应用程序位于同一台机器上。

所有NHibernate事务和会话都与using一起处理。

3 个答案:

答案 0 :(得分:1)

此问题是由磁盘瓶颈引起的。使用SSD可以更好地工作。

答案 1 :(得分:0)

我过去看到的一个问题是可以同时打开的最大套接字数以及从套接字关闭到释放之间的延迟时间。在庞大的数量下,这已经成为问题。以下是一些讨论此问题的链接Link 1 Link 2

答案 2 :(得分:0)

我们注意到类似的问题,我在Npgsql github上发现,他们已经在2.1版本中将DNS解析从同步更改为异步,并导致此错误。 直到今天(版本2.2.4.3)它还没有修复。

这是修复(恢复): Npgsql fork - commit