一篇比较好的 IIS6.0 的介绍
IIS 6.0 应用了新的进程模型。内核模式的HTTP侦听程序(Http.sys)接收并发送HTTP请求(甚至可以使用它的响应缓存来满足请求)。工作进程注册URL子空间,Http.sys将请求发送到相应的进程(如果使用应用程序池,则发送到进程集合)。
图 4 展示了IIS 5.0和IIS 6.0进程模型之间的差异。IIS 5.0使用WinSock在端口80接受连接。请求由 inetinfo 进程负责接收,然后或者在进程内执行请求,或者将它交给dllhost 进程在进程外进行处理(为了达到隔离的目的)。响应则由 inetinfo 进程发送回去。
IIS 6.0 进程依赖于内核模式的Web驱动程序Http.sys。在新的模型中,Http.sys负责管理连接和处理请求。请求可能通过Http.sys缓存得到满足,也可能被交给一个工作进程以便得到进一步处理(见图5)。可以配置多个工作进程,从而以较低开销实现了隔离。
Http.sys包括了一个响应缓存。当请求与响应缓存中的某个条目相匹配的时候,Http.sys直接从内核模式中发送缓存响应。图5展示了请求通过Http.sys得到处理的情况(请求也可能向上交给某个工作进程进行处理)。
由于Web服务器既包括内核模式的组件,也包括用户模式的组件,必须对二者同时进行调整才能获得最佳性能。因此,针对特定负载的IIS 6.0调整工作需要对如下内容进行配置:
· Http.sys(内核模式驱动程序)以及相关的内核模式缓存。
· 工作进程和用户模式IIS,包括应用程序池配置。
此外,我们还将在后文中讨论会对性能造成影响的其他参数。
内核模式的调整
与性能有关的Http.sys设置可以划分为两类:缓存管理以及连接和请求管理。所有的注册表设置都保存在以下条目中:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Http\Parameters
如果HTTP服务正在运行,必须首先停止服务,然后重新启动计算机,以便让设置生效。
缓存管理设置
Http.sys具有的优点之一便是内核模式缓存。如果响应位于内核缓存中,那么可能可以完全通过内核模式来满足某个HTTP请求,这显然可以极大降低CPU处理请求的开销。但是,IIS 6.0的内核模式缓存是一种基于物理内存的缓存,每个条目都需要占用一定的内存空间。
缓存中的条目只有在被使用的时候才能提供益处。但是,条目在任何时候都会占用物理内存,不论它是否被使用。所以,需要对缓存某个项目带来的益处(能够直接从缓存中满足请求)以及它在整个生命期中的开销(需要占用物理内存)进行评估,并且考虑可用资源(CPU、物理内存)和工作负载的情况。Http.sys 试图仅在缓存中保存有用(经常被访问)的项目,但是,如果针对特定工作负载来调整Http.sys缓存,Web服务器的性能还可以获得一定程度的提高。
以下是一些有用的Http.sys内核模式缓存设置:
· UriEnableCache. 默认值:1。设为非零值可以启用内核模式响应和分段缓存。对于大多数工作负载,缓存都应该保持启用。如果希望获得超低响应和较低的缓存利用率,那么请考虑禁用缓存。
· UriMaxCacheMegabyteCount. 默认值:0。设为非零值可以指定内核缓存可以使用的最大内存数量。默认值为0,允许系统自动调节缓存能够使用的内存数量。注意:只能设置可以使用的最大内存数量,而且系统可能不允许缓存增长到指定的大小。
· UriMaxUriBytes. 默认值:262144 字节(256 KB)。本参数设定了内核缓存中每个条目的最大长度。大于这个长度的响应或分段都不会被缓存。如果有足够的资金,可以考虑增加此参数的值。如果资金有限,而且大型的条目会挤掉较小的条目,那么可以将本参数设为更小的值。
· UriScavengerPeriod. 默认值:120秒。一个“清道夫”程序会定期扫描Http.sys缓存,在两次扫描期间没有被访问过的条目将被删除。可以将扫描周期设置为一个较高的值,以减少扫描次数。但是,如果访问频率低的老条目仍然保留在缓存中,缓存占用的内存将不断增加。如果将此期限设置得过低,扫描频率会过于频繁,而且可能导致缓存的过度清洗和扰动。
请求和连接管理设置
此外,Http.sys管理入站HTTP/HTTPS 连接,并且是在这些连接上处理请求的第一个层。它使用内部数据结构保存有关连接和请求的信息。虽然这样的数据结构可以按需创建(或释放),但如果在look-aside里表中保存部分数据结构留作备用,则可以实现更高的 CPU 效率。保存这样的储备有助于Http.sys利用更少的CPU资源来处理负载波动。注意:负载波动不一定由外部的负载波动而引起。一些旨在改善批处理或者中断调解的内部优化措施也可能导致负载波动和起伏。
储备有助于减少CPU的使用率和缩短延迟时间,同时能够增加Web服务器的处理能力,但是也会增加内存的使用率。在调整Http.sys的请求和连接管理行为的时候,需要牢记的因素便是:可用的服务器资源,性能目标以及工作负载的特性。您可以使用以下请求和连接管理设置:
· MaxConnections。 本设置用来控制Http.sys所允许的并发连接的数量。每一个连接都会耗用非分页池(一种宝贵和有限的资源)。默认值的设置相当保守,以限制连接占用的非分页池数量。对于配备了充足内存的专用Web服务器,如果预计会产生大量的并发连接,可以将此值设置得更高一些。此值设置得越大,占用的非分页池就越多,所以要务必小心,应该使用一个与系统配置相适应的正确数值。
· IdleConnectionsHighMark、IdleConnectionsLowMark和IdleListTrimmerPeriod. 这些值用来控制对非并行使用的连接结构的处理:在某个时间必须提供多少可用的连接(用于处理连接负载的波动)、释放列表的上下界限、以及连接结构剪切和补充的频率等。
· RequestBufferLookasideDepth 和 InternalRequestLookasideDepth 这些值控制与缓冲区管理有关的数据结构的处理工作,以及应该完成多少储备以应付负载波动情况。
用户模式设置
IIS 注册表设置
以下注册表设置可以在下面的条目下找到:
HKLM\System\CurrentControlSet\Services\Inetinfo\Parameters\
· MaxCachedFileSize(REG_DWORD),以字节为单位。决定了能够被缓存的文件大小(默认为256 KB)。实际值根据数据表中最大文件的数量和大小以及可用的RAM数量而定。对频繁访问的大型文件进行缓存可以降低CPU使用率,减少磁盘访问以及相关的延迟时间。
· MemCacheSize(REG_DWORD),以MB为单位。将IIS用户模式缓存限制为指定的大小(默认设置为根据可用内存的数量由IIS调整缓存的大小)。根据“热门”文件集合(频繁访问文件的集合)的大小以及RAM数量或者IIS进程地址空间(正常情况下应该在2GB以下),需要认真选择本参数的值。
· DisableMemoryCache(REG_DWORD)。如果设置为1(默认为0),则禁用用户模式的IIS缓存。在缓存命中率非常小的时候,可以完全禁用缓存,以避免与缓存代码路径有关的开销。
· MaxPoolThreads(REG_DWORD)。设置每个处理器能创建的池线程的最大数量(默认为4,范围不限。)每一个池线程都观察网络请求,然后处理它们。MaxPoolThreads 计数没有包括当前处理ISAPI应用程序的线程。如果CPU的平均使用率没有处于最佳状态,应该增加本参数的值,因为现有的所有线程都为繁忙状态,没有用于处理新请求的可用线程。
· PoolThreadLimit(REG_DWORD)。设置系统能创建的池线程的最大数量(默认值为处理器数量的4倍,范围不限)。PoolThreadLimit 必须大于或等于MaxPoolThreads。正常情况下,PoolThreadLimit = MaxPoolThreads ´ 处理器数量。仅仅设置其中的一个参数是不够的。如果同时指定了MaxPoolThreads 和PoolThreadLimit参数,则可以施加更严格的限制。
· ObjectCacheTTL(REG_DWORD),以秒为单位。控制没有被访问过的对象在IIS用户模式缓存中停留的时间长度(默认值为30秒,如设置为0xFFFFFFFF则禁用对象缓存清道夫线程)。如果系统配备了足够的内存,而且提交的内容不经常变化,那么可以增加本参数的值。如果系统内存不足而且用户模式缓存的大小在不断增长,则应该降低本参数。请参阅本节下面的 ActivityPeriod 部分。
· ActivityPeriod(REG_DWORD),以秒为单位。只有当文件在活动期限(默认为10秒钟,如果设为0则禁用本选项)内被重复命中,才允许缓存文件。本参数会降低由于缓存不经常访问的文件而引起的缓存开销,如果缓存内容变化不大,而且没有足够的可用内存,那么可以增加活动期限的值;或者,如果缓存上存在大量请求负载,可以降低活动期限的值。
· DataSetCacheSize(REG_DWORD)默认值为50。设置配置数据库数据集缓存中虚拟目录条目的最大数量。如果已经安装的虚拟目录的数量超过了默认值,可以增加本参数的值。在提交静态内容的时候,一个容量不足的数据集缓存会增加延迟时间(更低的吞吐量和更低的CPU使用率)。
IIS Metabase
以下设置可以在 W3SVC/ 下找到。
· AspMaxDiskTemplateCacheFiles。启用ASP脚本模板的磁盘缓存。ASP模板的编译是一件非常耗费处理器资源的工作。内存大小限制了可以缓存在内存中的模板的数量。从磁盘上的模板缓存中取回编译后的模板所需的开销比编译ASP内存缓存中没有的模板要小。请参见下文中的 AspScriptEngineCacheMax 一节。
· AspDiskTemplateCacheDirectory。如果可能,可以将其设置为不频繁使用的磁盘(例如,没有和操作系统、分页文件、IIS日志或者其他频繁访问的内容共享的磁盘)。默认目录是 “%windir%\system32\inetsrv\Template Disk cache\ASP Compiled Templates”。
· AspScriptEngineCacheMax。将其设置为内存容量所允许的最大的脚本引擎数(默认为125)。
· AspScriptFileCacheSize。设置为内存容量所允许的最大的ASP模板数量(默认250)。请参阅前文中的AspMaxDiskTemplateCacheFiles一节。
· AspExecuteInMTA。如果在交付某些ASP内容时希望对出现的错误或故障进行检测,请将本参数设置为1(启用)。例如,如果需要托管多个站点,而且每个站点都运行在它自己的工作进程之下,那么便可以启用本参数。错误一般可以在事件查看器中的COM+部分中看到。本设置启用了ASP中的多线程单元模型(默认值为0,表示禁用)。
· AspProcessorThreadMax。如果当前设置(默认为25)不足以满足负载的需求(可能会导致某些请求出现错误),可以增加本参数的值。
· CentralBinaryLoggingEnabled。通过将本参数设置为TRUE,可以启用集中的二进制日志记录。二进制IIS日志记录可以减少对CPU的使用,降低占用的磁盘空间以及减少磁盘I/O操作。集中的二进制日志可以被导向一个二进制文件,而无论托管站点的数量如何。分析二进制格式的日志需要一个后处理工具。
IIS 工作进程选项(IIS Admin UI、应用程序池属性)
在没有管理员干预、服务重启或者计算机重启的情况下,IIS管理界面上的IIS工作进程回收选项为发生的紧急故障或事件提供了有效的解决办法。这样的情况包括内存泄漏,泄漏会增加内存负担,或者导致工作进程进入不响应或空闲状态。在正常情况下,可能不需要启用回收选项,所以可以关闭它(或者对系统进行配置,以很低的频率执行回收工作)。在下面的章节中,黑体字名称是per-app-pool(应用程序池)变量。在使用脚本设置这些变量的时候,可以使用路径“ /LM/W3SVC/AppPools/n”,在这里n 代表应用程序池索引。
有三个选项,如下表所示:
· 回收选项。可以在“回收”选项卡中找到。
· 性能选项。 可以在“性能”选项卡中找到。
· 工作进程健康监视选项。可以在“健康”选项卡中找到。
表 8. 回收选项
参数 |
描述 |
PeriodicRestartRequests,DWORD,选项默认为禁用,默认值为35000 |
按照时间定期回收 |
PeriodicRestartRequests,DWORD,选项默认为禁用,默认值为35000 |
根据请求的(累计)数量定期回收 |
PeriodicRestartSchedule, MULTISZ,默认为禁用,默认为空字符串值 |
在指定的时间进行回收 |
· PeriodicRestartMemory, DWORD,默认值为512 MB · PeriodicRestartPrivateMemory, DWORD,默认值为192 MB
|
如果达到了以下两个条件之一,基于内存的回收(默认为禁用)将允许回收工作进程: · 虚拟内存的最大容量 · 已使用内存的最大容量 如果面临不断增长的内存容量压力,可以其中一个参数或全部参数,基于严格的内存容量标准,频繁回收工作进程,以缓解内存压力。 |
表 9. 性能选项
参数 |
描述 |
IdleTimeout,DWORD,以分钟为单位,默认值为20 |
在进程的空闲时间超过指定的时间时,关闭工作进程。这样可以节省有限的内存资源,但是如果CPU负载繁重,需要频繁启动新的工作进程,则不建议采取这种做法,因为创建进程会带来一定的开销。 |
AppPoolQueueLength,DWORD,默认值为2000 |
限制每个应用程序池(App-Pool)的内核请求队列的长度。请求会消耗分页池,在对分页池具有大量需求的情况下,应该降低本参数的值。如果超过指定的长度,会导致服务器拒绝请求,并产生编号为503的非自定义错误。 |
CpuAccounting,BOOLEAN,默认为禁用(0),启用为1 |
监视CPU的使用情况。您可以按照百分比设置CPU的最大使用率(CpuLimit,DWORD,默认值为0)和监视工作的刷新周期(CpuResetInterval,DWORD,默认值为0,以分钟计)。如果达到了CPU的使用率限制,或者不采取任何操作(但是会在事件日志中写入一个事件),或者关闭工作进程(CPUAction,DWORD,默认值为0,表示“不采取任何操作”;最大值为1,表示“关闭工作进程”)。 |
MaxProcesses,默认:使用1个工作进程处理所有请求 |
可以在操作的Web Garden(Web园)模式中控制工作进程的总数量。在Web Garden模式中,几个工作进程负责处理单个应用程序池下的请求负载。没有通过不同的应用程序池为Web站点预先分配任何工作进程。在某些情况下,一个工作进程无法满足负载的处理需要(可以通过糟糕的CPU使用率和漫长的响应时间看出这一点),增加工作进程的数量则有助于改善系统的吞吐量和CPU使用率。在托管了多个站点的情况下,可以考虑采用Web Garden模式。此外,在其中一个进程突然崩溃的情况下,采用多个工作进程还提供了更多可靠性,而且几乎不会出现所有服务均中断的情况。与预先分配应用程序池相比,Web Garden模式更容易设置和控制。 |
表10. 健康选项
参数 |
描述 |
PingingEnabled,BOOLEAN, 默认值为1 PingInterval,DWORD,默认值为30秒 |
以固定时间间隔(PingInterval)Ping 工作进程(PingingEnabled)。如果没有响应,则认为工作进程发生错误,IIS将试图终止进程并产生一个新的进程。 |
RapidFailProtection,BOOLEAN,默认 RapidFailProtectionMaxCrashes, DWORD,默认为5个故障 RapidFailProtectionInterval, DWORD,默认为5分钟 |
设置在给定的时间段内(RapidFailProtectionInterval)允许产生的最大故障数量(RapidFailProtectionMaxCrashes),对不断快速产生故障的情况加以控制(RapidFailProtection)。如果到达了指定了故障率,应用程序池将被禁用,并且在事件日志中写入相关信息。 |
StartupTimeLimit,DWORD,默认为90秒 |
控制工作进程的启动时间,超过此时间,则认为其发生了故障。 |
ShutdownTimeLimit,DWORD,默认为90秒 |
控制工作进程的关闭时间,超过了此时间,则认为其处于不响应状态。 |
安全套接字层的调整参数
安全套接字层(Secure Sockets Layer,SSL)的使用会加重CPU的负担。SSL中最为耗费资源的部分为建立会话所需的开销(包括一次完整的握手),然后是重新连接的开销和加密/解密的开销。为了获得更好的SSL性能,请执行如下操作:
· 启用SSL会话的“保持活动”(keep-alive)特性。这样可以消除建立会话所需的开销。
· 如果可能,重新使用会话(特别是对于那些没有“保持活动”的流量)。
· 注意:密钥越长,安全性就越高,但是需要的CPU时间就越多。
· 注意:并不是所有的页面组件都需要加密。但是,混合的纯文本HTTP和HTTPS可能会导致客户端浏览器弹出一个警告,告知并不是所有的页面内容都得到了保护。
ISAPI
对于ISAPI,没有任何具体的调整参数。如果编写一个私有的ISAPI扩展,请确保代码在执行和资源使用方面具有高效率。请参阅后文中的 影响IIS性能的其他问题。
托管代码调整参数
· 确信已经预先编译了所有的脚本。可以在每个目录中调用一个.NET脚本来完成这项工作。在编译完成之后,需要复位IIS。在修改了Machine.config、 Web.config或任何.aspx脚本之后需要重新编译。
· 如果不需要会话状态信息,请确信在每个页面中关闭了此项目。
· 当用户在隔离模式(每个站点一个应用程序池)下运行包含ASP.NET脚本的多个主机的时候,应该监视内存使用情况。请根据预计将要并发运行的应用程序池的数量,为IIS服务器配备足够的内存。考虑在存在多个隔离进程的地方使用多个应用程序域(app-domains)。
影响IIS性能的其他问题
· 安装没有缓存意识的过滤器。安装没有HTTP缓存意识的过滤器会导致IIS禁用全部缓存,从而造成性能急剧下降。老的ISAPI过滤器(在IIS 6.0之前编写的过滤器)可能会存在这个问题。可以使用HTTP缓存的过滤器在配置数据库中被标记为“具有缓存意识”的过滤器。
· CGI 请求。出于性能的考虑,我们不建议使用CGI应用程序处理请求。由于需要频繁创建(和删除)CGI进程,会产生大量的系统开销。更好的替代办法是使用ISAPI程序和ASP(或ASP.NET)脚本。这些方式都可以使用隔离。
NTFS 文件系统设置
HKLM\System\CurrentControlSet\Control\FileSystem\ 下的 NtfsDisableLastAccessUpdate (REG_DWORD)1。
通过禁止更新最后一次访问的文件或目录的日期和时间戳记,这个针对整个系统的开关参数会降低磁盘I/O负载和缩短延迟。默认情况下本键不存在,因此需要额外添加。如果操作包含数千个目录的大型数据集(或者大量主机),禁用更新的效果十分明显。如果只需要保留信息Web供Web管理使用,我们建议用户使用IIS日志代替它。