作者
:Thomas Deml
IIS 7 的 Windows 进程激活服务 (WAS) 是向 Web 应用程序和 Web 服务提供进程模型和配置功能的关键组件。 WAS 的主要任务是管理应用程序池。 应用程序池是表示 URL 组的托管环境的配置容器。
当 HTTP 客户端请求 URL 时HTTP.SYS将请求映射到应用程序池请求队列。 应用程序池请求队列的工作进程由 WAS 生成,工作进程执行发送响应所需的代码。 WAS main任务之一是管理它生成的工作进程,即 WAS 监视其运行状况,在必要时回收它们,并确保它们消耗的资源不超过相应的 AppPool 配置中指定的资源。 WAS 也是运行时和状态数据的仲裁器和收集器,例如性能计数器、站点和应用程序池状态。
体系结构关系图
流程模型功能
支持在同一物理计算机上托管 10000 个或更多网站是当今大规模托管环境的核心要求。 在这些网站上运行的代码通常没有经过很好的测试(如果有的话)。 为了支持这些要求,WAS 需要提供功能强大的过程模型和高效的资源管理。
高效的资源管理
RAM 和 CPU 等资源在多租户方案中很少。 WAS 仅在特定网站或 Web 应用程序的请求到达时启动 IIS 工作进程。
Idle-timeout
由于资源通常稀缺,因此可以基于可配置的空闲超时关闭 Web 应用程序。
运行状况监视
为了确保其运行状况,WAS 会监视它生成的工作进程。 运行状况消息定期发送到每个正在运行的工作进程。 如果工作进程未在可配置的时间间隔内做出响应,则会回收或终止工作进程。 这样一来,通过重启工作进程自动修复工作进程中未检测到的死锁。
Rapid-Fail保护功能的一部分是启动限制。 如果工作进程未在可配置的启动限制内报告回 WAS,则会终止该进程,并递增 Rapid-Fail-Protection 计数器。 应用程序池已停止,即如果 Rapid-Fail-Protection 计数器在可配置的时间限制内达到可配置的限制,则不再尝试重启工作进程。 这可以防止在启动期间工作进程挂起或崩溃的情况。
工作进程还必须在可配置的限制中关闭。 如果此时未发生关闭,则 WAS 会终止工作进程。 这可以防止由于进程在关闭阶段挂起而过度使用资源。 其他关闭设置允许在 (启动可执行文件,例如调试器) 在分配的时间内关闭未完成时。
CPU 相关性
配置设置允许 WAS 启动关联到一个或多个 CPU 的工作进程。 这可以防止租户在共享同一物理计算机时相互干扰。
用户配置文件
WAS 可以在加载或不加载用户配置文件的情况下启动工作进程。
应用程序池标识
IIS 辅助进程可以作为自定义帐户运行,内置帐户 (LocalService、LocalSystem、NetworkService) 或应用程序池标识 (默认) 。 建议使用应用程序池标识,因为它不需要密码管理,并且应用程序池标识已遵守最低特权原则。 内置帐户也不需要密码管理。 如果使用自定义用户标识,则会自动加密密码。 可以通过跨计算机共享配置加密密钥,将配置设置复制到多台计算机。
作业对象功能
作业对象允许管理员将工作进程限制为特定的 CPU 限制。 如果超出此 CPU 限制,将执行可配置操作。 作业对象还将确保终止工作进程生成的进程。
配置隔离和安全性
在 WAS 启动应用程序池及其工作进程之前,它会为此应用程序池生成唯一的配置文件。 应用程序池还具有配置设置,用于在唯一标识下运行应用程序池。 但是,即使使用相同的标识,也可以实现隔离。 WAS 为每个应用程序池创建唯一的安全标识符 (SID) 。 然后,使用此唯一 SID 保护应用程序池配置文件。 这可确保只有管理员和应用程序池本身才能读取应用程序池配置文件。 甚至可以使用此唯一 SID 配置文件权限。
诊断和监控
事件日志记录
有关无效配置、回收、启动或关闭工作进程的事件将报告给系统事件日志。
当前正在执行的请求
WAS 公开运行时和状态控制接口,允许脚本和工具查询特定工作进程的当前正在执行的请求。 这对于查找挂起的请求或需要很长时间才能完成的请求非常有用。
所有 IIS 性能计数器都通过 WAS 进行漏斗。 WAS 收集这些性能计数器,因为 IIS 计数器是基于站点的,Web 应用程序可以位于不同的应用程序池中。
Recycling
回收允许刷新工作进程,而不会因停机而丢失单个请求。 这是通过一项称为“重叠回收”的功能完成的。
WAS 通过生成与仍在处理请求的旧工作进程并行的新工作进程来执行此操作。 启动新工作进程后,它会开始从请求队列中选取请求,而旧工作进程则由 WAS 指示停止选取请求。 旧工作进程完成所有执行请求后,它将关闭。 此功能称为“重叠回收”。 它可确保在回收过程中不会丢失任何请求。
回收参数可在 IIS 配置系统中进行配置。
计划的回收
客户可能希望定期回收其应用程序。 可以通过配置设置定期计划回收,例如每 4 小时、每天凌晨 1 点等。
基于内存消耗的回收
应用程序可能会随时间推移泄漏内存。 WAS 可以监视每个工作进程的内存消耗,以确保没有工作进程使用超过其预配置限制。 达到配置的虚拟或专用内存阈值将触发辅助进程回收。
基于请求数进行回收
还可以根据特定工作进程处理的请求数来配置回收。
自定义回收
自定义代码可以自定义运行状况统计信息,并通过对 WAS 运行时和状态 API 的 API 调用来触发回收。
某些错误仅在生产环境中发生。 终止工作进程可确保运行时间,但解决这些错误会变得困难,例如,如果需要调试失败的工作进程。 WAS 中的进程孤立功能允许回收工作进程,而不会终止失败的工作进程。 现在可以将调试器附加到它。 其他进程孤立设置允许执行进程 (例如,如果发生孤立) 调试器。
应用程序池状态管理
应用程序池可以通过公开可用的 API 停止、回收或启动,例如,如果应用程序必须脱机,或者必须根据与 applicationhost.config 文件中可配置的参数不同的参数进行回收。
其他 WAS 功能
Load-Balancer 功能
HTTP.SYS仍在网络上侦听,如果应用程序池未选取请求,将返回 500 HTTP 错误消息。 这是一个问题,因为对于级别 5 负载均衡器 (TCP/IP) 500 HTTP 错误看起来像是有效的 TCP/IP 连接。 WAS 配置设置可以让HTTP.SYS拒绝连接,而不是发送 HTTP 响应。
可以将 WAS 配置为使用以下设置启动工作进程:
WoW64 支持
WAS 可以启动 32 位或 64 位工作进程。
.NET Framework预加载
可以将 WAS 配置为预加载特定版本的.NET Framework。 这可以更轻松地排查版本冲突。
Web 花园
Web 花园是使用多个工作进程运行的应用程序池的术语。 请求使用轮循机制在这些工作进程实例之间分布。
WAS 多协议支持
WAS 不仅托管 HTTP 堆栈。 它还可以通过其侦听适配器和工作进程框架托管其他协议。 WCF 服务利用 WAS 多协议支持。 WCF 协议附带自己的侦听器 (例如 NET。TCP、NET。MSMQ 或 NET。PIPE 侦听器) 。 这些侦听器使用 WAS 提供的侦听器适配器接口连接到 WAS。
利用此基础结构的应用程序协议可以将自定义应用程序代码托管在与常规 ASP.NET 应用程序相同的 .NET 应用程序域中。 它们还可以利用托管环境 ASP.NET 提供的与协议无关的服务,例如按需编译、配置支持等。