原文 http://www.peterviola.com/solving-sql-server-high-cpu-with-iis-request-filtering/
Top Queries by Total CPU Time
当CPU非常高的时候有可能你的条件反射就是重启服务或者回收App Pools.SQL Server 2008 内置了非常棒的报表帮助我们追踪CPU的使用情况. 我使用Top Queries by Total CPU Time 报表. 如下图一项 右键服务名选择相应的报表.
Top Queries by Total CPU Time 报表会需要一点时间来生成. 通过报表能够获得是哪10个数据的查询消费了最多的CPU. 通过报表我们发现这个服务器上的一个数据库的4个不同query消耗的大部分CPU.
SQL Profiler and Database Tuning Advisor
现在我知道是哪个数据库引发高CPU的问题了, 启动 SQL Profiler 几分钟收集下数据.可以看到高的Reads是从 “Internet Information Services” 这个Appliation发出来的.
在将注意力集中在网站之前,我想看看通过 Database Engine Tuning Advisor 能不能提高效率 DTA 会分析通过提供的SQL脚本 分析数据的一些行为,并且提高一个优化的方案(包括使用索引,分区...). 通常通过 DTA 我们能提高 5-10 % 的性能改善. 在这个案例中我们能看到提高了97% 的改善!
Preventing SQL Injection with IIS Request Filtering
通过执行DTA提高的优化脚本能降低一些CPU了. 然而我知道我们的网站有可能正在遭受一些可疑的访问所以我使用 Log Parser 获得一些网站的访问情况.通过下面的query发现打量的访问是正在利用querystring进行SQL注入.
logparser.exe -i:iisw3c “select top 20 count(*),cs-uri-query from ex140702.log
group by cs-uri-query order by count(*) desc” -rtp:-1 >file.txt
通常我们倾向于屏蔽攻击的IP. 不幸的是一些老道的攻击会使用大量不同的IP对你进行攻击. 最佳的解决方案是通过 Request Filtering 过滤屏蔽这些恶意的请求.
通过 IIS Request Filtering 我们阻止了SQL注入攻击. 使用下面Log Parser的查询我们能看到所有请求的 http status codes .
SELECT STRCAT(TO_STRING(sc-status), STRCAT(‘.’, TO_STRING(sc-substatus))) AS Status, COUNT(*)
AS Total FROM w3svc.log to TopStatusCodes.txt GROUP BY Status ORDER BY Total DESC
当一个querystring被拒绝的时候Request Filtering 会使用 http substatus 404.18 . 通过下面的Log Parser report 能看到 50,039 个请求被屏蔽了.