SQL 服务器 internal/default 资源池随时间增加
SQL Server internal/default resource pool increasing over time
问题
我有一个 SQL Server 2017 数据库部署在安装了单个数据库的客户 VM 上。该数据库有一个单独的 Web 应用程序,在高峰时段连接到大约 100 个活跃用户。在过去的几个月里,客户不得不在使用 5 天后重新启动 sql 服务器实例,因为应用程序开始显示性能下降的迹象(有时加载一个页面需要一秒钟,然后同一页面可能需要 15秒)。几个月来我一直在监视查询存储并对查询进行性能优化,但是我仍然无法阻止数据库在本周末遇到性能问题。
当问题出现时(正常运行 5 天后)服务器显示高 cpu 和内存使用率,尽管查询频率和查询类型 运行ning 在整个过程中完全相同星期。在遇到问题时查看查询存储后,我没有看到任何长的 运行ning 查询,并且在 CPU 或内存分析图表上没有什么比我在应用程序 [=] 时看到的更高=60=]宁晴.
我注意到的一件事是 internal/default 资源池在整个星期内的使用率都在增加。
重新启动后不久,资源池使用率看起来很低:
5 天后,资源池看起来高了很多:
我注意到,当我 运行 查询时,资源池在查询 运行ning 时增加,但内存总是在查询完成 运行ning 后释放,看起来这在客户实例上没有正确发生,否则我不明白为什么资源池会随着时间的推移而增加。
问题
资源池使用量是否会随时间增加而导致性能问题?
资源池内存释放不掉的原因是什么?
我为缓解我们一直面临的性能问题而实施的措施如下:
- 打开 READ_COMMITTED_SNAPSHOT 隔离,这有助于缓解应用程序因锁定而出现无响应的问题。
- 设置最大服务器内存以确保它不会让 OS。
- 花了几个月的时间优化了一堆查询以减少 CPU 持续时间和逻辑读取,还添加了索引,这对我有一定帮助,但并没有解决我所有的问题。
我相信我已经找到了这个问题的罪魁祸首。用于连接数据库和执行查询的 sqljdbc4.2.jar 存在内存泄漏。在 运行 应用程序负载测试和监控 sys.dm_os_memory_clerks 之后,我可以看到 MEMORYCLERK_SQLCONNECTIONPOOL pages_kb 随着对数据库执行的查询越来越多而增加。这也增加了资源池中的 'used memory' 作为副作用。
将 jdbc 库更新到更高版本后,MEMORYCLERK_SQLCONNECTIONPOOL 没有随着时间的推移而增加。
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre8</version>
</dependency>
问题
我有一个 SQL Server 2017 数据库部署在安装了单个数据库的客户 VM 上。该数据库有一个单独的 Web 应用程序,在高峰时段连接到大约 100 个活跃用户。在过去的几个月里,客户不得不在使用 5 天后重新启动 sql 服务器实例,因为应用程序开始显示性能下降的迹象(有时加载一个页面需要一秒钟,然后同一页面可能需要 15秒)。几个月来我一直在监视查询存储并对查询进行性能优化,但是我仍然无法阻止数据库在本周末遇到性能问题。
当问题出现时(正常运行 5 天后)服务器显示高 cpu 和内存使用率,尽管查询频率和查询类型 运行ning 在整个过程中完全相同星期。在遇到问题时查看查询存储后,我没有看到任何长的 运行ning 查询,并且在 CPU 或内存分析图表上没有什么比我在应用程序 [=] 时看到的更高=60=]宁晴.
我注意到的一件事是 internal/default 资源池在整个星期内的使用率都在增加。
重新启动后不久,资源池使用率看起来很低:
5 天后,资源池看起来高了很多:
我注意到,当我 运行 查询时,资源池在查询 运行ning 时增加,但内存总是在查询完成 运行ning 后释放,看起来这在客户实例上没有正确发生,否则我不明白为什么资源池会随着时间的推移而增加。
问题
资源池使用量是否会随时间增加而导致性能问题?
资源池内存释放不掉的原因是什么?
我为缓解我们一直面临的性能问题而实施的措施如下:
- 打开 READ_COMMITTED_SNAPSHOT 隔离,这有助于缓解应用程序因锁定而出现无响应的问题。
- 设置最大服务器内存以确保它不会让 OS。
- 花了几个月的时间优化了一堆查询以减少 CPU 持续时间和逻辑读取,还添加了索引,这对我有一定帮助,但并没有解决我所有的问题。
我相信我已经找到了这个问题的罪魁祸首。用于连接数据库和执行查询的 sqljdbc4.2.jar 存在内存泄漏。在 运行 应用程序负载测试和监控 sys.dm_os_memory_clerks 之后,我可以看到 MEMORYCLERK_SQLCONNECTIONPOOL pages_kb 随着对数据库执行的查询越来越多而增加。这也增加了资源池中的 'used memory' 作为副作用。
将 jdbc 库更新到更高版本后,MEMORYCLERK_SQLCONNECTIONPOOL 没有随着时间的推移而增加。
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>8.4.1.jre8</version>
</dependency>