我们正在同时运行一个使用经典 asp 和 ASP.NET MVC 4 (C#) 的网站。在高流量期间,数据库查询在 asp 页面中的运行速度非常慢。同时,在同一个网站中,C# 页面始终正常连接到同一个数据库。两台服务器上的 CPU、内存和网络使用率都正常(强大的硬件/连接)。
该网站多年来一直以相同的设置和流量负载运行,没有任何问题,这种现象大约在一周前开始出现。有人知道哪里出了问题吗?
数据库服务器:SQL Server 2012 Web 版
Web 服务器:Windows Server 2012 IIS 8.0
Connection string:
conn.connectionString = "Provider=SQLNCLI11;Persist Security Info=True;User ID=abc;Password=abc;Initial Catalog=sampledb;Data Source=192.168.10.11"
iis 服务器日志中的示例加载时间(毫秒):
2015-09-05 18:00:07 23642 /page.asp
2015-09-05 18:00:07 13547 /page.asp
2015-09-05 18:00:07 93 /ASP.NET
2015-09-05 18:00:07 11172 /page.asp
2015-09-05 18:00:07 78 /ASP.NET
2015-09-05 18:00:07 578 /ASP.NET
2015-09-05 18:00:07 10828 /page.asp
2015-09-05 18:00:07 32252 /page.asp
2015-09-05 18:00:07 13641 /page.asp
有时,asp 页面使用数字更合适:
2015-09-05 18:07:30 218 /page.asp
2015-09-05 18:07:30 3281 /page.asp
2015-09-05 18:07:30 46 /page.asp
2015-09-05 18:07:30 2375 /page.asp
2015-09-05 18:07:30 78 /page.asp
2015-09-05 18:07:30 46 /ASP.NET
2015-09-05 18:07:30 203 /ASP.NET
2015-09-05 18:07:30 2906 /page.asp
2015-09-05 18:07:30 1781 /page.asp
Asp 查询通常很慢,但有时我们会收到错误:
Microsoft SQL Server Native Client 11.0 error '80040e31'
Query timeout expired
测试 .asp 页面运行六个相同的 SQL 查询,页面总加载时间(以秒为单位)。一个查询耗时 13 秒,其他查询几乎是即时的。下次运行另一个查询时,运行速度很慢,有时它们都很快。
Query 1: 0
Query 2: 0,3554688
Query 3: 0,375
Query 4: 13,32813
Query 5: 13,32813
Query 6: 13,32813
答案1
答案2
“CPU、内存和网络使用情况正常”——对于数据库来说,它们绝对不相关。
嗯,不是完全如此,但你基本上是说“我的车跑得不够快,而且刹车灯在工作”。
重点是:数据库的存亡取决于 IO 容量。这部分由内存处理(存储在内存中的数据不能从磁盘访问)。锁定时间至关重要 - 这意味着索引之类的东西。
我很确定如果你检查磁盘 IO 的标记(唯一相关的是 ms/per 请求),你会发现它们已经超出了上限,并且磁盘子系统正在疯狂运行。
如果不是,则说明您的事务处理不当,并且锁定了一个查询,从而阻止了其他查询。使用 SSMS 和 SQL Server 的性能数据仓库功能开始分析。
找到您的慢速查询并修复它们。