NPgsql 连接池和性能计数器
NPgsql connection pool and performance counters
首先介绍一下背景:
1. 了解 NPGSQL 如何在 ASP.NET REST API
中使用连接池
环境:
- 我们有一个 REST API 控制器,它首先查询项目列表(到 RDS),然后每个列表中的每个项目我们需要获得一些额外的值,所以我们使用 Parallel.ForEach 语句
- 每次我们使用连接时,我们都会妥善处理它
- 我看到每次调用此端点时连接数都会增加,然后它们会被删除。
进程:
我已经按照 http://www.npgsql.org/doc/performance.html#performance-counters 检查 NPGSQL 如何处理连接,还在连接字符串中添加了以下内容:
"CommandTimeout=50000;TIMEOUT=1024;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=100;Use Perf Counters=true;"
但我发现了一个奇怪的结果:
NumberOfNonPooledConnections 和 NumberOfPooledConnections 在我的例子 (56) 中始终相同,我们使用 Parallel.ForEach 查询多个项目。
NumberOfActiveConnectionPools 的值为 1。
一开始我不太明白这是怎么回事,真的是用连接池吗?
然后我停止进程删除“;POOLING=True;”来自连接字符串,我得到了相同的结果。
最后我设置了“;POOLING=false;”并再次执行,现在 NumberOfPooledConnections 达到了 2378,然后它开始超时打开新连接。
我还在 RDS 性能指标中注意到连接数从未超过 110 个连接。
所以问题是:
设置 MaxPoolSize 参数的标准是什么? 100 好像很正常。
在ASP.NET中连接池是由实例处理的?所以从 IIS 中的同一个应用程序池建立的所有连接都将被重用或每次执行?
首先,ASP.NET(web端)对Npgsql的连接池或一般的ADO.NET绝对没有影响,所以最好不考虑Npgsql和ADO.NET的推理关于网络。
其次,您没有说明您使用的是哪个版本的 Npgsql。
除此之外,在查看性能计数器之前,您看到的问题到底是什么?您是否在 PostgreSQL 端看到太多连接?你可以检查这个 by querying pg_stat_activity
.
如果启用了 Npgsql 池(连接字符串中的 Pooling=true
,它也是默认设置),那么当您调用 NpgsqlConnection.Open()
时,如果物理连接可用,将从池中获取一个物理连接。当您关闭或处置该 NpgsqlConnection 时,它将返回到池中以供以后重用。如果您看到 PostgreSQL 端的物理连接增加太多,这可能表明您忘记了 close/dispose 代码中的连接并且存在泄漏。
性能计数器功能有助于了解正在发生的事情,但不幸的是它没有经过充分测试并且可能包含错误。因此,在开始查看之前请确保存在实际问题(并且至少报告您正在使用的 Npgsql 版本)。
首先介绍一下背景: 1. 了解 NPGSQL 如何在 ASP.NET REST API
中使用连接池环境: - 我们有一个 REST API 控制器,它首先查询项目列表(到 RDS),然后每个列表中的每个项目我们需要获得一些额外的值,所以我们使用 Parallel.ForEach 语句
- 每次我们使用连接时,我们都会妥善处理它
- 我看到每次调用此端点时连接数都会增加,然后它们会被删除。
进程:
我已经按照 http://www.npgsql.org/doc/performance.html#performance-counters 检查 NPGSQL 如何处理连接,还在连接字符串中添加了以下内容: "CommandTimeout=50000;TIMEOUT=1024;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=100;Use Perf Counters=true;"
但我发现了一个奇怪的结果:
NumberOfNonPooledConnections 和 NumberOfPooledConnections 在我的例子 (56) 中始终相同,我们使用 Parallel.ForEach 查询多个项目。
NumberOfActiveConnectionPools 的值为 1。
一开始我不太明白这是怎么回事,真的是用连接池吗?
然后我停止进程删除“;POOLING=True;”来自连接字符串,我得到了相同的结果。
最后我设置了“;POOLING=false;”并再次执行,现在 NumberOfPooledConnections 达到了 2378,然后它开始超时打开新连接。 我还在 RDS 性能指标中注意到连接数从未超过 110 个连接。
所以问题是: 设置 MaxPoolSize 参数的标准是什么? 100 好像很正常。
在ASP.NET中连接池是由实例处理的?所以从 IIS 中的同一个应用程序池建立的所有连接都将被重用或每次执行?
首先,ASP.NET(web端)对Npgsql的连接池或一般的ADO.NET绝对没有影响,所以最好不考虑Npgsql和ADO.NET的推理关于网络。
其次,您没有说明您使用的是哪个版本的 Npgsql。
除此之外,在查看性能计数器之前,您看到的问题到底是什么?您是否在 PostgreSQL 端看到太多连接?你可以检查这个 by querying pg_stat_activity
.
如果启用了 Npgsql 池(连接字符串中的 Pooling=true
,它也是默认设置),那么当您调用 NpgsqlConnection.Open()
时,如果物理连接可用,将从池中获取一个物理连接。当您关闭或处置该 NpgsqlConnection 时,它将返回到池中以供以后重用。如果您看到 PostgreSQL 端的物理连接增加太多,这可能表明您忘记了 close/dispose 代码中的连接并且存在泄漏。
性能计数器功能有助于了解正在发生的事情,但不幸的是它没有经过充分测试并且可能包含错误。因此,在开始查看之前请确保存在实际问题(并且至少报告您正在使用的 Npgsql 版本)。