什么是限制请求数?为什么“从池中获取连接时超时”?

What is limiting requests count? Why `Timeout while getting a connection from pool`?

在高负载条件下,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 处理。

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

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

这是一个修复(还原): Npgsql fork - commit

此问题是由磁盘瓶颈引起的。使用 SSD 效果更好。