65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 和 IIS 6.0 的规划、测试和调优

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (24投票s)

2004年11月18日

19分钟阅读

viewsIcon

126705

一种主动式 IIS 6.0 服务器管理和 ASP.NET 性能调优与测试方法。我们将探讨编辑 Metabase 以扩展 GZip 的使用、线程、压缩、安全性、IIS 6.0 对象缓存以及其他许多主题。

因此,让我们充分利用性能测试/调优
然后更改 Windows 2003/IIS 6.0 的某些设置。

不幸的是,测试和调优过程的起点可能由谁首先遇到最大的问题来决定。会是服务器管理员、架构师、开发人员还是遇到性能下降的用户?如果用户发出大量抱怨,或者您预计随着新部署流量会迅速增长,您可能不希望因为不主动而措手不及。

也许你们所有人都希望与您的员工一起完成一些 ASP.NET 性能检查清单
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/ScaleNetCheck03.asp

上述链接中的主题简要列表包括

设计考虑因素

  • 考虑安全性和性能。
  • 逻辑地划分您的应用程序。
  • ...

多线程

  • 使用公式调整线程池以减少争用。
  • 考虑使用 minIoThreads 和 minWorkerThreads 处理突发负载。
  • ...

资源管理

  • 不要缓存或阻塞池化资源。
  • 池化资源。
  • ...

页数

  • 缩减页面大小。
  • 启用缓冲。
  • ...

服务器控件

  • 识别服务器控件中视图状态的使用。
  • 在适当的时候使用服务器控件。
  • 避免创建深层控件层次结构。

数据绑定

  • 避免使用 Page.DataBind。
  • 最小化对 DataBinder.Eval 的调用。

缓存

  • 在页面中将动态数据与静态数据分离。
  • 缓存正确的数据。
  • 在 Microsoft® Windows Server™ 2003 上使用内核缓存。
  • ...

状态管理

  • 尽可能在客户端存储简单状态。
  • 考虑序列化成本。

应用程序状态

  • 使用静态属性而不是 Application 对象来存储应用程序状态。
  • 使用应用程序状态共享静态、只读数据。
  • 不要在应用程序状态中存储单线程单元 (STA) COM 对象。

会话状态

  • 首选基本类型以减少序列化成本。
  • 如果您不使用会话状态,请禁用它。
  • 避免在会话状态中存储 STA COM 对象。
  • 尽可能使用 ReadOnly 属性。

视图状态

  • 如果您不需要视图状态,请禁用它。
  • 最小化在视图状态中存储的对象数量。
  • 确定视图状态的大小。

HTTP 模块

  • 避免管道代码中的长时间运行和阻塞调用。
  • 考虑异步事件。

字符串管理

  • 使用 Response.Write 进行输出格式化。
  • 使用 StringBuilder 作为临时缓冲区。
  • 在构建自定义控件时使用 HtmlTextWriter。

异常管理

  • 实现 Global.asax 错误处理程序。
  • 监视应用程序异常。
  • 激进地设置超时。
  • ...

COM 互操作

  • 使用 ASPCOMPAT 调用 STA COM 对象。
  • 避免在会话状态或应用程序状态中存储 COM 对象。
  • 避免在会话状态中存储 STA 组件。
  • ...

数据访问

  • 对大型结果集使用分页。
  • 使用 DataReader 进行快速高效的数据绑定。
  • 阻止用户请求过多数据。
  • 考虑缓存数据。
  • ...

安全注意事项

  • 限制不必要的 Web 服务器流量。
  • 关闭匿名访问的身份验证。
  • 在客户端验证用户输入。
  • 避免按请求模拟。
  • 避免缓存敏感数据。
  • 隔离安全和非安全内容。
  • 仅对需要 SSL 的页面使用安全套接字层 (SSL)。
  • 使用绝对 URL 进行导航。
  • 考虑使用 SSL 硬件来分担 SSL 处理。
  • 调整 SSL 超时以避免 SSL 会话过期。

 

部署注意事项

  • 避免不必要的进程跳跃。
  • 了解远程中间层的性能影响。
  • 短路 HTTP 管道。
  • 配置内存限制。
  • 禁用跟踪和调试。
  • 确保内容更新不会导致加载额外的程序集。
  • 避免在重负载下使用 XCOPY。
  • 考虑预编译页面。
  • 考虑 Web 园配置。
  • 考虑使用 HTTP 压缩。
  • 考虑使用边界缓存。


当然,您将需要一个“MS Web 应用程序压力测试工具”进行一些测试: http://www.microsoft.com/technet/archive/itsolutions/intranet/downloads/webstres.mspx

然后您可以开始规划和调整您的 .NET 应用程序性能: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt16.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt17.asp

然后您可以开始利用这些信息并将其与许多 ASP.NET 操作指南文档进行比较

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenethowto.asp

主题包括

  1. “如何:提高序列化性能”
  2. “如何:使用自定义计数器监视 ASP.NET 线程池”
  3. “如何:优化 SQL 索引”
  4. “如何:优化 SQL 查询”
  5. “如何:在 .NET 应用程序中分页记录”
  6. “如何:为 .NET Framework 应用程序执行容量规划”
  7. “如何:扩展 .NET 应用程序”
  8. “如何:提交和轮询长时间运行的任务”
  9. “如何:使用 QueryPerformanceCounter 和 QueryPerformanceFrequency 对托管代码进行计时”
  10. “如何:使用 ACT 测试性能和可伸缩性”
  11. “如何:使用 ACT 测试 Web 服务性能”
  12. “如何:从 ASP.NET 使用自定义性能计数器”
  13. “如何:使用 CLR Profiler”
  14. “如何:使用 EIF”
  15. “如何:使用 SQL Profiler”

另请参见 http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/webapp/iis/iis6perf.mspx

1) 那么让我们尝试一些事情并在实施后重新测试。

GZip - IIS 6.0:尽管目前这将对 Firefox 和 IE 6.0 浏览器用户有利,但它值得您关注。请注意,Gzip 的优势在于带宽和“感知”页面加载速度的提升。它还可以帮助减少服务器发送的字节数,因此对于大容量服务器来说,这可以产生更显著的结果。另请注意,可能会导致 CPU 利用率飙升。

更多详情请参阅:
http://www.microsoft.com/resources/documentation/iis/6/all/proddocs/en-us/ref_mb_hcdodynamiccompression.mspx

检查您的可伸缩性并使用 GZip 头:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt04.asp

GZip 的原始规范有时也很有用:
http://www.ietf.org/rfc/rfc1951.txt?number=1951http://www.ietf.org/rfc/rfc1952.txt?number=1952

编辑元数据库

警告:如果元数据库编辑不正确,可能会导致严重问题,甚至可能需要重新安装任何使用元数据库的产品。Microsoft 无法保证因元数据库编辑不正确而导致的问题能够得到解决。请自行承担编辑元数据库的风险。

注意:在编辑元数据库之前务必进行备份。

要使 IIS 5.0 压缩 .aspx 页面,请执行以下步骤:1. 打开命令提示符。
2. 键入 net stop iisadmin,然后按 ENTER。
3. 键入 cd C:\InetPub\adminscripts,然后按 ENTER。
4. 键入以下内容,然后按 ENTER
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/GZIP/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
5. 键入以下内容,然后按 ENTER
CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/DEFLATE/HcScriptFileExtensions "asp" "dll" "exe" "aspx"
6. 键入 net start w3svc,然后按 ENTER。 1

有关更多信息以及帮助您解决其他问题的建议,请参阅 http://support.microsoft.com/?id=322603

然后,请参阅 Brad Wilson 的 http://www.dotnetdevs.com/articles/IIS6compression.aspx,以获取进一步的说明和一个不错的跟踪工具。

启用 HTTP 压缩
如果您的服务器生成大量动态内容,请考虑 HTTP 压缩的额外处理成本是否合理。如果“处理器时间百分比”计数器已达到 80% 或更高,则不建议启用 HTTP 压缩。

测试 HTTP 压缩

要建立基准,请使用系统监视器记录处理器对象的“处理器时间百分比”计数器几天。此计数器具有一个总实例和系统中每个处理器的单独实例。(如果您的服务器有多个处理器,您应该同时观察单个处理器和总处理器,以发现工作负载的任何不平衡。)此外,您应该记录网络接口对象的“每秒发送字节数”计数器。
启用压缩并继续记录这些计数器的值一段较长时间,最好是几天,以便您有一个良好的比较基础。
比较启用和不启用压缩时的值。
注意:如果在测试期间出现阻塞或瓶颈迹象,应立即停止测试。任一计数器值显著下降表示启用压缩后的性能相对于未启用压缩时的性能有所下降。

重要提示:您必须是本地计算机上 Administrators 组的成员才能执行以下过程(或多个过程),或者您必须已被委派适当的权限。作为一项安全最佳实践,请使用不在 Administrators 组中的帐户登录到您的计算机,然后使用“运行方式”命令以管理员身份运行 IIS 管理器。在命令提示符下,键入 runas /user:administrative_accountname "mmc %systemroot%\system32\inetsrv\iis.msc"。

启用 HTTP 压缩

  1. 在 IIS 管理器中,展开本地计算机,右键单击“网站”文件夹,然后单击“属性”。
  2. 单击“服务”选项卡,然后在“HTTP 压缩”部分中,选中“压缩应用程序文件”复选框以压缩应用程序文件。
  3. 选中“压缩静态文件”复选框以仅压缩静态文件以传输到支持压缩的客户端。
  4. 在“临时目录”框中,键入本地目录的路径或单击“浏览”以查找目录。压缩文件将保存在此临时目录中。该目录必须位于 NTFS 格式分区的本地驱动器上。该目录不能是压缩目录,也不应共享。
  5. 在“最大临时目录大小”下,单击一个文件夹大小选项。如果单击“限制为(兆字节)”选项并在旁边的文本框中输入一个数字,IIS 将在达到设定的限制时根据“最近最少使用”规则自动清理临时目录。
  6. 单击“应用”,然后单击“确定”。 2

http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/en-us/Default.asp?url=/resources/documentation/WindowsServ/2003/standard/proddocs/en-us/qos_utilbandwdth.asp

2) 缓存、线程和 SSL - IIS 6.0 提供了更多功能,为什么不使用并调整它呢?(一些“亮点”。)

“Windows Server 2003 和 IIS 6.0 提供内核缓存。ASP.NET 页面可以自动受益于 IIS 6.0 内核缓存。内核缓存会产生显著的性能提升,因为对缓存响应的请求无需切换到用户模式即可提供。” 3


减少争用时的推荐线程设置

  • 您有可用的 CPU。
  • 您的应用程序执行 I/O 密集型操作,例如调用 Web 方法或访问文件系统。
  • ASP.NET 应用程序/应用程序队列中的请求性能计数器指示您有排队的请求。

配置设置

默认值
(.NET Framework 1.1)
推荐值
maxconnection
2
12 * #CPUs
maxIoThreads
20
100
maxWorkerThreads
20
100
minFreeThreads
8
88 * #CPUs
minLocalRequestFreeThreads
4
76 * #CPUs


修剪页面“K”大小以恢复带宽

处理大页面会增加 CPU 负载,增加网络带宽消耗,并增加客户端的响应时间。避免设计和开发完成多项任务的大页面,特别是对于每个请求通常只执行少数任务的情况。尽可能逻辑地划分页面。

要修剪页面大小,您可以执行以下一项或全部操作

  • 对页面中的任何静态脚本使用脚本包含,以使客户端能够为后续请求缓存这些脚本。以下脚本元素显示了如何执行此操作。
    <script language=jscript src="scripts\myscript.js">

  • 在向客户端发送响应之前,删除诸如制表符和空格之类的创建空白的字符。删除空白可以显著减小页面大小(尤其是在有数百行的页面上。是的,它可能更难阅读源代码,但对于这些大页面,请使用编辑器来保护您的眼睛)。以下示例表包含空白。
    // 带有空白
    <table>
          <tr>
                      <td>hello</td>
                      <td>world</td>
           </tr>
    </table>

  • 以下示例表不包含空白。
    // 没有空白
    <table>
    <tr><td>hello</td><td>world</td></tr>
    </table>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scalenetchapt06.asp -- 其中包含其他优化。

重新计时 IIS 对象缓存 4

考虑通过在注册表中添加 ObjectCacheTTL 条目来缩短未使用的对象在缓存中停留的时间,或延长已使用的对象在缓存中停留的时间。

注意

除非别无选择,否则请勿编辑注册表。注册表编辑器会绕过标准安全措施,允许可能损坏系统甚至需要重新安装 Windows 的设置。如果您必须编辑注册表,请务必先备份,并参阅 Windows Server 2003 资源工具包配套 CD 或网站 http://www.microsoft.com/reskit 上的注册表参考。
ObjectCacheTTL 的值通过指定生存时间 (TTL) 来控制静态文件缓存,该 TTL 设置对象在缓存内存中保留的时间长度。如果在定义的时间段内未引用内存缓存中的对象,则该对象将从缓存中淘汰。
默认值为 30 秒。如果系统内存有限或服务器内容是动态的,您可以使用较低的 TTL 来防止系统内存用于缓存大量易失性对象。将 ObjectCacheTTL 条目设置为无限会禁用对象缓存清除程序,并允许缓存对象保留在缓存中直到缓存对象发生更改。如果您的服务器有充足的系统内存且数据相对静态,禁用缓存清除程序会很有用。
使用以下过程通过在注册表中添加 ObjectCacheTLL 条目来重置未使用的对象在对象缓存中保留的时间。

重要

您必须是本地计算机上 Administrators 组的成员才能运行脚本和可执行文件,或者您必须已被委派适当的权限。作为一项安全最佳实践,请使用不在 Administrators 组中的帐户登录到您的计算机,然后使用 runas 命令以管理员身份运行您的脚本或可执行文件。在命令提示符下,键入 runas /profile /User:MyMachine\Administrator cmd 以打开具有管理员权限的命令窗口,然后键入 cscript.exe ScriptName(包括完整路径和参数,如果有的话)。

重置未使用的对象在缓存中保留的时间 4

1. 在“开始”菜单中,单击“运行”,键入 regedit.exe,然后单击“确定”。
2. 在注册表编辑器中,导航到以下子项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters
3. 右键单击“Parameters”子项,指向“新建”,然后单击“DWORD 值”。
4. 在“新值”框中,键入 ObjectCacheTTL
5. 右键单击“ObjectCacheTTL”,然后单击“修改”。
6. 在“基数”下,单击“十进制”。
7. 在“值数据”框中,键入您希望未使用的对象在缓存中保留的秒数,然后单击“确定”。
默认值为 30(秒)。您可以输入从零(禁用缓存)到 4,294,967,295(无限)(禁用对象缓存清除程序并允许缓存对象保留在缓存中直到缓存对象更改)的任何值。

更改文件系统缓存与 IIS 6.0 工作集的平衡

默认情况下,运行 Windows Server 2003 的服务器在分配内存时(通过服务器属性“最大化文件共享的数据吞吐量”)配置为优先文件系统缓存而不是进程的工作集。尽管基于 IIS 6.0 的服务器受益于大型文件系统缓存,但优先文件系统缓存通常会导致 IIS 6.0 可分页代码写入磁盘,从而导致长时间的处理延迟。为避免这些处理延迟,请设置服务器属性以最大化网络应用程序的数据吞吐量。

最大化服务器上网络应用程序的数据吞吐量 4

1. 在“控制面板”中,双击“网络连接”,右键单击“本地连接”,然后单击“属性”。
2. 选择“Microsoft 网络的文件和打印共享”,然后单击“属性”。
3. 在“优化”下,选择“最大化网络应用程序的数据吞吐量”。

限制连接数

如果您的服务器内存不足,限制服务器上的连接数可能有助于缓解短缺,因为系统用于跟踪连接的数据结构会消耗一些物理内存(每个连接约 10 KB)。有关限制连接以节省内存的更多信息,请参阅本章前面“限制连接以管理资源”部分。
限制应用程序池的队列长度

如果您在工作进程隔离模式下运行服务器,可以限制应用程序池队列长度,以防止大量请求排队并使服务器过载。当队列长度限制功能启用时(默认启用),IIS 会在排队新请求之前监视指定应用程序池队列中的请求数量。使用 IIS 管理器更改应用程序池请求队列的默认限制 1,000 个请求。

如果将新请求添加到队列超过最大队列长度,服务器将拒绝该请求并向客户端发送 503 错误(服务器太忙)。但是,即使将限制更改为小于当前队列长度的值,已经排队的请求仍会保持排队状态。

使用以下过程为应用程序池设置队列长度限制。 4

重要
您必须是本地计算机上 Administrators 组的成员才能执行以下过程或多个过程,或者您必须已被委派适当的权限。作为一项安全最佳实践,请使用不在 Administrators 组中的帐户登录到您的计算机,然后使用 runas 命令以管理员身份运行 IIS 管理器。在命令提示符下,键入
runas /User:Administrative_AccountName “mmc %systemroot%\system32\inetsrv\iis.msc”。

更改应用程序池的队列长度限制
1. 在 IIS 管理器中,展开本地计算机,展开“应用程序池”文件夹,右键单击该应用程序,然后单击“属性”。
2. 在“性能”选项卡上的“请求队列限制”下,选中“限制内核请求队列到”复选框。
3. 在“请求数”框中,键入或选择允许的最大排队请求数。默认限制为 1,000 个请求。

重要提示:如果清除“限制内核请求队列到”复选框,IIS 将不应用请求限制。没有限制,IIS 可能会排队请求,直到您的服务器内存耗尽。

4. 单击“应用”,然后单击“确定”。

有关使用元数据库属性配置应用程序池队列长度限制的信息,请参阅 IIS 6.0 帮助中“元数据库属性参考”中的 AppPoolQueueLength 属性。

调整 Windows 中的资源分配 4

系统处理由 Windows Server 2003 管理,它可以分配处理器和内存资源给任务。如果您的服务器需要临时性能提升,您可以暂时调整 Windows 中的资源分配,以将资源分配到您需要的地方
# 要获得更快的响应时间,您可以将 Windows 设置为将更多处理器时间分配给您当前正在运行的程序。
# 如果您想在工作时运行后台程序(例如打印或磁盘备份),您可以让 Windows 在后台和前台程序之间平均共享处理器资源。

有关更改 Windows 分配处理器资源方式的更多信息,请参阅 Windows Server 2003 帮助和支持中心中的“更改前台和后台程序的性能”。
限制性能日志记录

请始终记住,性能日志记录会占用系统资源。当您不积极检查性能时,禁用与性能相关的日志记录可以从您的服务器中挤出更多的性能。 4


配置 SSL 会话的 ServerCacheTime 4

如果您计划支持长时间的 SSL 会话,请考虑通过将 ServerCacheTime 条目添加到注册表来延长 SSL 缓存超时间隔。如果您预计有数千用户使用 SSL 连接到您的网站,请估计您希望 SSL 会话持续多长时间,然后将 ServerCacheTime 条目的值设置为略高于您的估计值。不要将该值设置得远高于您的估计值,因为由此产生的超时间隔可能会导致您的服务器在缓存中保留陈旧数据。

注意
注册表编辑器会绕过标准安全措施,允许可能损坏系统甚至需要重新安装 Windows 的设置。如果您必须编辑注册表,请务必先备份,并参阅 Windows Server 2003 资源工具包配套 CD 或网站 http://www.microsoft.com/reskit 上的注册表参考。
更改 SSL 会话缓存默认值的一个原因是强制客户端更频繁地进行身份验证。更频繁的缓存有时很有用,例如,如果您知道客户端正在使用智能卡,并且您希望只有当用户将智能卡插入读卡器时才能访问网页。
在更改 SSL 缓存超时间隔之前,请确保已启用 HTTP Keep-Alives(HTTP Keep-Alives 默认启用)。除了浏览器关闭连接外,SSL 会话在使用 HTTP Keep-Alives 时不会过期。

重要
您必须是本地计算机上 Administrators 组的成员才能运行脚本和可执行文件,或者您必须已被委派适当的权限。作为一项安全最佳实践,请使用不在 Administrators 组中的帐户登录到您的计算机,然后使用 runas 命令以管理员身份运行您的脚本或可执行文件。
在命令提示符下,键入

runas /profile /User:MyMachine\Administrator cmd

以管理员权限打开命令窗口,然后键入

cscript.exe ScriptName(包括完整路径和参数,如果有的话)。

配置 ServerCacheTime 注册表项 4

1. 在“开始”菜单中,单击“运行”,键入 regedit.exe,然后单击“确定”。
2. 在注册表编辑器中,导航到以下子项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL。
3. 右键单击 SCHANNEL 子项,指向“新建”,然后单击“DWORD 值”。
4. 在“新值”框中,键入以下内容:ServerCacheTime
5. 右键单击 ServerCacheTime 条目,然后单击“修改”。
6. 在“基数”下,单击“十进制”。
7. 在“值数据”框中,键入您希望为缓存时间分配的值(以毫秒为单位)(1 分钟 = 60,000 毫秒),然后单击“确定”。

常用缓存时间转换为毫秒 4

期望的缓存时间
(1 分钟 = 60,000 毫秒)
ServerCacheTime 值
(以毫秒为单位)
无安全会话缓存
0(关闭会话缓存)
2 分钟(Microsoft® Windows NT® 版本 4.0 操作系统的默认设置)
120000
5 分钟(Microsoft® Windows® 2000 操作系统的默认设置)
300000
10 小时(Windows Server 2003、带有 Service Pack 2 [SP2] 或更高版本的 Windows 2000 以及 Windows XP 的默认设置)
36000000
有关配置 SSL 会话缓存的更多信息,包括如何设置 ClientCacheTime 注册表设置,请参阅 Microsoft 知识库文章 247658“配置安全套接字层服务器和客户端缓存元素”。要查找此文章,请参阅 Web Resources 页面上的 Microsoft 知识库链接:http://www.microsoft.com/windows/reskits/webresources

 

http://download.microsoft.com/download/7/4/f/74fe970d-4a7d-4034-9f5d-02572567e7f7/19_CHAPTER_6_Optimizing_IIS_6.0_Performance.doc <<<----- 完整书籍位于:http://www.microsoft.com/downloads/details.aspx?FamilyID=80a1b6e6-829e-49b7-8c02-333d9c148e69&DisplayLang=en#filelist,它将为您的服务器管理员和关心托管代码的人员提供大量精彩的“床边读物”。;-I

到目前为止,您应该已经列出了一系列需要考虑的事项、需要实现的代码、需要更改的设置,以及更多用于做出主动决策的知识。

 

© . All rights reserved.