IIS性能诊断与优化


一、启用内容过期
对于静态文件启用内容过期可以提高访问性能。首先网站的目录要划分合理,图片、CSS、JavaScript均放在单独目录下,然后在IIS中选择目 录,点属性-HTTP头,启用内容过期,可以选择30天后过去,这样,用户浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的 页,由于图片、CSS、JS通常变化较少,因此基本上都从本地缓存读取,从而加快显示速度。

LoadRunner中测试不出这个优化的效果。倒是Run-Time Settings中的一些浏览器方面的设置会影响测试结果:
Check for newer versions of stored pages every visit to the page
Download non-HTML resources
Simulate a new user on each iteration
Clear cache on each iteration

0.049 vs. 0.253

Controller中300个并发时出现这个错误:
Error: Communication error: Linked List client failed to initialize server pointer.

二、启用GZip压缩
HTTP压缩是在Web服务器和浏览器间传输压缩文本内容的方法。HTTP压缩采用通用的压缩算法如Gzip等压缩HTML、JavaScript或 CSS文件。压缩的最大好处就是降低了网络传输的数据量,从而提高客户端浏览器的访问速度。
使用方法是,右击“网站”->“属性”,选择“服务”。在“HTTP压缩”框中选中“压缩静态文件”,“临时目录”建议单独设置另一个盘的目录下。
之后,IIS管理器中,右击“Web服务扩展”->“增加一个新的Web服务扩展”,在“扩展名”中输入“HTTPCompression”,添 加“要求的文件”为C:\WINDOWS\system32\inetsrv\gzip.dll,其中Windows系统目录根据您的安装可能有所不同, 选中“设置扩展状态为允许”。
最后,使用文本编辑器打开C:\Windows\System32\inetsrv\MetaBase.xml,在HcFileExtensions中 增加需要压缩的静态文件后缀名,默认为HTML和TXT文件,建议再添加上js、css等,不要添加图片或ZIP等已经被压缩的文件。

实验:
停止IIS:
iisreset -stop

设置IIS
修改MetaBase.xml文件:
<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/deflate"
  HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
  HcCreateFlags="0"
  HcDoDynamicCompression="TRUE"
  HcDoOnDemandCompression="TRUE"
  HcDoStaticCompression="TRUE"
  HcDynamicCompressionLevel="10"
  HcFileExtensions="htm
   html
   js
   css
   gif
   png
   jpg
   txt"
  HcOnDemandCompLevel="10"
  HcPriority="1"
  HcScriptFileExtensions="asp
   dll
   exe
   aspx
   ashx"
 >
</IIsCompressionScheme>
<IIsCompressionScheme Location ="/LM/W3SVC/Filters/Compression/gzip"
  HcCompressionDll="%windir%\system32\inetsrv\gzip.dll"
  HcCreateFlags="1"
  HcDoDynamicCompression="TRUE"
  HcDoOnDemandCompression="TRUE"
  HcDoStaticCompression="TRUE"
  HcDynamicCompressionLevel="10"
  HcFileExtensions="htm
   html
   js
   css
   gif
   txt
   js
   css
   png
   gif
   jpg"
  HcOnDemandCompLevel="10"
  HcPriority="1"
  HcScriptFileExtensions="asp
   dll
   exe
   aspx
   ashx"
 >
</IIsCompressionScheme>
<IIsCompressionSchemes Location ="/LM/W3SVC/Filters/Compression/Parameters"
  HcCacheControlHeader="max-age=86400"
  HcCompressionBufferSize="8192"
  HcCompressionDirectory="E:\IISTemp"
  HcDoDiskSpaceLimiting="FALSE"
  HcDoDynamicCompression="TRUE"
  HcDoOnDemandCompression="TRUE"
  HcDoStaticCompression="TRUE"
  HcExpiresHeader="Wed, 01 Jan 1997 12:00:00 GMT"
  HcFilesDeletedPerDiskFree="256"
  HcIoBufferSize="8192"
  HcMaxDiskSpaceUsage="99614720"
  HcMaxQueueLength="1000"
  HcMinFileSizeForComp="0"
  HcNoCompressionForHttp10="TRUE"
  HcNoCompressionForProxies="TRUE"
  HcNoCompressionForRange="FALSE"
  HcSendCacheHeaders="FALSE"
 >
</IIsCompressionSchemes>

启动IIS
iisreset -start

LoadRunner的Run-time Settings中要设置选上以下选项:
Download non-HTML resources
Simulate a new user on each iteration(Clear cache on each iteration)

对比Gzip压缩优化前后,LR测试得到的结果
设置前:
成功事务数:22642
平均吞吐量:11861865.760
平均点击率:4987.111
平均事务响应时间:0.264
设置后:
成功事务数:10095
平均吞吐量:2817851.889
平均点击率:2198.889
平均事务响应时间:0.592
可以看到,设置了HTTP压缩,性能反而降低了1半左右。
对比资源使用情况可看到,采用了压缩,CPU使用率会略为高一点,估计会因此导致IIS服务器响应变慢:
不采用压缩:
Processor Time :97.906
Processor Queue Length:11.75
采用压缩:
Processor Time :98.372
Processor Queue Length:14.75

*注:测试机和压力机在同一个机器

对大一点的图片(104K)请求进行测试,可以看到,仍然是不压缩的性能好点:
采用压缩:
成功事务数:43024
平均吞吐量:60460790.460
平均点击率:570.211
平均事务响应时间:0.129
不采用压缩:
成功事务数:63030
平均吞吐量:92320831.250
平均点击率:859.903
平均事务响应时间:0.088

对于更大的图片(1517K)请求进行测试,可以看到,仍然是不压缩的性能好点:
采用压缩:
成功事务数:4842
平均吞吐量:87505641.380
平均点击率:61.800
平均事务响应时间:1.198
不采用压缩:
成功事务数:7052
平均吞吐量:141753682.700
平均点击率:92.595
平均事务响应时间:0.807

对于更大的图片(1517K)请求进行测试,可以看到,仍然是不压缩的性能好点:
采用压缩:
成功事务数:817
平均吞吐量:95983534.770
平均点击率:7.910
平均事务响应时间:9.565
不采用压缩:
成功事务数:1093
平均吞吐量:142537464.000
平均点击率:11.613
平均事务响应时间:6.534

估计是这些图片的压缩比率不够大,换一些文档试试,压缩前是10146K,压缩后是3366K
采用压缩:
成功事务数:1331
平均吞吐量:60524439.910
平均点击率:13.910
平均事务响应时间:5.057
不采用压缩:
成功事务数:1311
平均吞吐量:151881857.100
平均点击率:14.618
平均事务响应时间:5.185

从YSlow、HTTPWatch等工具来看,采用压缩后下载速度提高比较多。
由此可见,对于压缩比不高的网站内容,采用HTTP压缩未必能带来太大的优化效果,如果CPU是瓶颈的话,反而会降低性能。

*HTTP压缩工作原理
1.Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩;
在用户浏览器发送请求的HTTP头中,  带有"Accept-Encoding: gzip, deflate"参数则表明支持gzip和deflate两种压缩算法.
2.如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
静态文件和动态文件后缀启动要所都需要在MetaBase.xml中设置.
静态文件需要设置: HcFileExtensions Metabase Property (单击跳转到MSDN说明)
动态文件需要设置: HcScriptFileExtensions Metabase Property (单击跳转到MSDN说明)
3.如果请求文件是HTML、CSS等静态文件并且文件后缀启用了压缩,则Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
4.如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
5.如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
6.如果请求文件是ASPX等动态文件并且文件后缀启用了压缩,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。

参考:
http://www.cnblogs.com/zhangziqiu/archive/2009/05/17/gzip.html


三、配置应用程序池队列长度限制
应用程序池队列长度限制可防止大量请求排队等候,造成服务器超载。当启用应用程序池队列长度限制时,IIS 在将新请求加入队列前,先监视指定的应用程序池队列中的请求数量。如果将新的请求添加到该队列时,超出了队列的大小限制,服务器会拒绝该请求,并向客户端发送一个 503 错误响应(不能自定义该响应)。然而,即使您将队列长度限制改为小于当前队列长度的值,队列中已有的请求仍会留在队列中。
更改应用程序池队列长度限制:
在 IIS 管理器中,展开本地计算机,展开“应用程序池”文件夹,右键单击应用程序,然后单击“属性”。
单击“性能”选项卡。
在“请求队列限制”部分中,选中“核心请求队列限制为”复选框,然后在“请求次数”框中单击向上和向下箭头,设置队列中请求的最大数目。
单击“应用”,然后单击“确定”。
 注意 如果未选中“核心请求队列限制为”复选框,IIS 将不会执行队列限制。由于不限制队列中的请求数量,IIS 可能会将请求一直添加到队列中,直到服务器的内存耗尽为止。

如果队列长度设置比较低,LoadRunner模拟大量并发请求时将收到503错误:
Action.c(4): Error -26609: HTTP Status-Code=503 (Service Unavailable) for "http://localhost/StoreCSVS/"


四、设置网站连接数
可以将 Internet 信息服务 (IIS) 配置成允许数目不受限制的并发连接,或限制该网站接收的连接个数。如果连接趋向于波动,则将数量设置成不受限制可以避免常量管理。但是,如果连接数超过了系统资源,则系统性能可能受到影响。将站点限定在特定的连接数可以保持性能的稳定。设置是站点特定的,并且可以随着网络流量和使用情况的改变而进行调整。

LoadRunner中虚拟用户数大于IIS所设置的连接数时,将收到503错误:
Action.c(4): Error -26609: HTTP Status-Code=503 (Service Unavailable) for "http://localhost/StoreCSVS/"

查看window系统日志可看到:
应用程序池 'DefaultAppPool' 超过了其作业限制设置。


五、启用 CPU 监视
CPU 监视是一个工具,它监视并自动关闭消耗大量 CPU 时间的工作进程。CPU 监视是为单个应用程序池而启用的。管理员可以对应用程序池设置两种 CPU 监视操作。
1、错误事件日志记录:当特定应用程序池或应用程序池组的 CPU 使用率达到设定的限制时,IIS 在 Windows 事件日志中记录一个错误。错误中包含特定工作进程和超出 CPU 限制的应用程序池的名称。使用 IIS 管理器启用 CPU 监视时,这会显示为“无操作”。
2、停止有问题的应用程序:IIS 将错误写入到 Windows 事件日志中之后,它会向每个工作进程发出应用程序池的 ShutdownTimeLimit 设置的多少秒后关闭命令,开始关闭应用程序池中的所有工作进程。如果到时间后进程仍未关闭,只要 IIS 未配置为替换工作进程或工作进程没有调试配置,那么 IIS 会终止工作进程。应用程序池关闭,而且在 CPUResetInterval 时间窗口到期之前会一直关闭。一旦 CPUResetInterval 时间窗口到期,应用程序池便会重新启动。使用 IIS 管理器启用 CPU 监视时,这会显示为“关闭”。
启用 CPU 监视:
在 IIS 管理器中,展开本地计算机,展开“应用程序池”文件夹,右键单击要启用 CPU 记帐的应用程序池,然后单击“属性”。
单击“性能”选项卡,然后选中“启用 CPU 监视”复选框。
在“最大 CPU 使用率”复选框中,单击向上和向下箭头来设置应用程序池应使用的 CPU 的最大百分比。如果应用程序池的 CPU 使用率超出指定的最大限制,IIS 会在 Windows 事件日志中生成一条错误信息。
在“刷新 CPU 使用率值(分钟)”框中,单击向上和向下箭头,设置刷新率。
在“CPU 使用率超过最大使用率时执行的操作”列表框中,为指定的应用程序池单击选择所需的操作。单击“无操作”可使 IIS 在指定的应用程序池达到最大 CPU 使用率限制时,在 Windows 事件日志中生成一条错误信息。单击“关闭”以关闭整个应用程序池。单击“关闭”可通过结束主工作进程来终止有问题的应用程序。
单击“应用”,然后单击“确定”。


六、配置 Web 园
可以使用 IIS 6.0 工作进程隔离模式,将应用程序池配置为由多个工作进程支持。使用多个工作进程的应用程序池称为“Web 园”。Web 园与“Web 场”不同之处在于,Web 园针对某个应用程序池使用多个工作进程,而 Web 场针对某个网站使用多个服务器。
为应用程序池创建 Web 园可在以下几个方面增强性能:
可靠的请求处理:当应用程序池中的某个工作进程停止处理时(例如,当脚本引擎停止响应时),其他工作进程可以接受并处理该应用程序池的请求。
减少了资源争用:当 Web 园达到稳定状态时,按照循环方案每个新 TCP/IP 连接将分配给 Web 园中的一个工作进程。这可以产生平衡工作负荷和减少绑定到的工作进程的资源争用的效果。
配置 Web 园:
在 IIS 管理器中,展开本地计算机,展开“应用程序池”,右键单击该应用程序池,然后单击“属性”。
单击“性能”选项卡,然后在“Web 园”下的“最大工作进程数”框中,键入要向应用程序池指定的工作进程数。
单击“确定”。
*大于1时,有可能造成在多个进程之间的数据缓存不同步问题。


参考:
基于YSlow优化策略的IIS6调优
http://www.nnwb.com.cn/yahoo-optimization/2009430323.htm
Performance Testing Microsoft .NET Web Applications学习笔记
http://www.docin.com/p-98321621.html

原文地址:https://www.cnblogs.com/preftest/p/1880295.html