增加 SQL Server 中最大池大小的成本

El *_*oZo 5 sql-server connection-pooling

我们有一个大部分时间运行良好的公共前台网站。但我们有时会遇到连接高峰(例如在邮件活动之后),并且我们会收到如下错误:

超时已过。从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小

我们非常确定所有连接都已正确关闭(没有连接泄漏)。

因此我们决定增加池中允许的连接数(默认为 100)。

我们将其增加到 1000(max pool size=1000;在我们的连接字符串中),现在我们的站点可以处理大多数连接峰值。(我精确地说该网站在专用服务器上运行)

我的问题是:最大连接池的增加可能会产生哪些负面影响?

编辑:这是我在这些高峰期间使用 sp_who2 时所得到的:

如果最大池设置为 100,则我有超过 100 行“等待命令”行:

SPID 地位 登录 主机名 块通过 数据库名称 命令 中央处理器时间 磁盘IO 最后一批 程序名称 SPID 请求ID
数字 睡眠 数据库用户 我网站的 IIS 池名称 我的数据库名称 等待命令 0 0 05/10 14:48:59 .Net SqlClient 数据提供程序 137 0

我可以看到所有“LastBatch”都是在几秒钟前执行的。

J.D*_*.D. 8

将服务器的CPU想象成一个馅饼,而 SQL Server 是一个聚会,连接就是聚会上的客人。如果您知道将有 10 位客人(联系人),那么您需要将馅饼切成 10 等份,以便每个人都能公平分享一块。

现在想象一下这样的场景:您有 10 位客人,但意外又出现了 10 位客人,因此聚会上总共有 20 位客人。好吧,您仍然可以将馅饼切成 10 个相等的切片,然后一次只有 10 名客人可以吃甜点,或者您可以将这 10 片切得更小,这样您现在就有 20 个大小相等的馅饼,这样您就可以给每位客人提供相同的甜点切片(例如增加最大池大小)。

因此,本质上您允许更多的连接到您的 SQL Server,这需要为每个连接分配相当数量的CPU。使用固定数量的CPU(将扩展云服务排除在本次讨论之外),这意味着其他连接可用于执行其需要运行的查询的CPU 可能会减少,理论上这可能会使这些查询需要更长时间才能完成。其他服务器资源也可能以类似的方式受到影响(如 nbk 提到的),例如内存,因为更多的连接现在也将为其查询竞争可用内存。

这取决于您的应用程序的设计方式以及负载可以达到的繁忙程度,但增加最大池大小是尝试解决您面临的问题的公平解决方案。尽管一开始你可能不想跳这么大。也许可以尝试将初始设置增加一倍或三倍,然后逐步提高。如果您仍然遇到该错误或其他性能问题,那么您唯一的选择可能是为服务器提供更多 CPU,查看如何优化应用程序,使其执行的数据库操作更快、更智能,然后查看查询和/或数据库设计本身是否存在性能优化机会。