asp.net - 从池中获取连接之前经过的超时时间

标签 asp.net sql performance timeout

我们的网站在一天中的90%时间内都可以正常运行,然后在高峰时段流量约为正常水平的两倍时,一切都会变慢。通常为1秒的页面加载时间需要30秒。检查我们的错误日志,看来这可能是连接池问题。我们有3个Web服务器连接到1个sql服务器数据库。 SQL服务器在所有内核上的利用率都低于25%。

我查看了SQL Server上的“用户连接”计数器,发现在高峰期我们有400多个“用户连接”,但下类时间约为120多个。

我很确定我们将使用MS附带的任何默认设置来处理我们的应用程序池。我该怎么做才能检查是否存在应用程序池问题?将应用程序池大小增加到1000的负面影响(我该怎么做?)。

谢谢!

最佳答案

根据我的经验,您可以从SQL Server收到3种主要的超时类型:

1)InvalidOperationException-客户端无法在命令字符串上指定的超时(默认15秒)之前从其自身的池中获得池化连接。客户端的池已达到最大大小,并且所有池连接都已使用并且在超时之前一直处于使用状态。
2)SQLException-连接超时。客户端的连接池正在创建与数据库的新连接,但是在命令字符串中指定的超时(默认为15秒)之前,数据库不会响应。
3)SQLException-命令超时。已获得连接,但是SQL语句执行命令所花费的时间超过了命令的CommandTimeout属性上指定的超时(默认为30秒)
您的服务器在添加负载之前正常运行的情况听起来像情况#1。我发现超时非常快-通常为2秒。
我发现解决方案是增加SQL Server中的最大线程数。默认值为零-让SQL Server决定。我已经看到过这样的情况:一个粗壮的服务器坐着很少使用资源,却通过分配太少的线程来限制自己。
您可以使用此transact-sql增加最大线程设置:

sp_configure 'max worker threads', 8192
go
Reconfigure 

然后,重新启动您的SQL服务。

顺便说一句,您可以使用以下命令查看SQL Server当前分配了多少个线程:
select sum(current_workers_count) from sys.dm_os_schedulers

此线程设置在许多连接下SQL Server的执行方式上有很大的不同。一旦线程用完,SQL Server就会变得非常无响应。

关于asp.net - 从池中获取连接之前经过的超时时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1642252/

相关文章:

c# - gridview 中的复选框控件

python - 连接 CSV 或表格

sql - 简单的正则表达式来过滤掉前缀和后缀字符

Python pandas - 将多列添加到数据框中,其中行和列相互依赖

performance - D中的线程上的光纤

javascript - Google 跟踪代码管理器 - 页脚中的脚本怎么样?

javascript - 将事件绑定(bind)到 AJAX 的子元素

asp.net - 如何使中继器字段可编辑?

c# - 在新的 HttpWebRequest 上共享当前 session

sql - 死锁:插入与从多个表中选择。快照隔离?