【Azure Developer】IIS w3wp.exe 的 -m 参数:一个未被记录的管道模式标识

简介: 本文揭秘了IIS中未公开的`w3wp.exe -m`启动参数:`-m 0`表示Integrated管道模式(推荐),`-m 1`为Classic模式。该发现源于Application Insights自动检测失效的排查,解释了其为何不支持Classic模式——因HttpModule无法全面拦截请求。

最近在排查一个 Application Insights 自动检测失效的问题时,偶然发现了 w3wp.exe 启动参数中的 -m 标志。这个参数直接决定了应用程序池的管道模式,但奇怪的是,我在微软官方文档中找不到任何关于它的说明。

这篇文章记录一下我的测试过程和发现。

问题背景

起因是一个运行在 Azure App Service上的 ASP.NET 应用,Application Insights 的自动检测始终无法正常工作。检查了 SDK 配置、连接字符串、防火墙规则,都没问题。后来在翻阅一些内部资料时,看到一条信息:

"App Insights auto instrumentation agent does NOT attach to classic app pools."

这让我意识到问题可能出在应用程序池的管道模式上。但当我想进一步了解 w3wp.exe 是如何识别管道模式时,发现官方文档里根本没有相关内容。从公网上进行搜索关于 w3wp.exe pipeline mode 参数介绍,能找到的内容基本都是:进程监控、内存分析、应用池身份配置这些常规主题。但具体到启动参数,尤其是 -m 参数,没有任何文档。既然查不到,那就自己验证。

 

测试环境与方法

在本地 IIS 上创建两个应用程序池进行对比测试:

  • myblog — 管道模式设置为 Classic
  • myblog-integrated — 管道模式设置为 Integrated

分别访问两个站点触发 w3wp.exe 启动后,直接抓取Memory Dump

直接使用Visual Studio打开下载后的DUMP文件,即可直接查看到Process Name中的启动命令.

 

测试结果

Classic 模式 (myblog):

c:\windows\system32\inetsrv\w3wp.exe -ap "myblog" -v "v4.0" -l "webengine4.dll" -a \.\pipe\iisipmad280a1a-f928-4787-82d8-84bf4ec349ce -h "C:\inetpub\temp\apppools\myblog\myblog.config" -w "" -m 1 -t 20 -ta 0

Integrated 模式 (myblog-integrated):

c:\windows\system32\inetsrv\w3wp.exe -ap "myblog-integrated" -v "v4.0" -l "webengine4.dll" -a \.\pipe\iisipmb621060a-77e5-47ad-a1f8-abc137abe173 -h "C:\inetpub\temp\apppools\myblog-integrated\myblog-integrated.config" -w "" -m 0 -t 20 -ta 0 

结论很明确:

-m 管道模式
0 Integrated Pipeline
1 Classic Pipeline

值得注意的是,这个取值有点反直觉——通常 "1" 会被认为是"启用"或"更优"的选项,但这里 0 才是推荐的 Integrated 模式。

w3wp.exe 启动参数整理

顺便把观察到的其他参数也记录一下(基于实测,非官方文档):

参数 含义
-ap Application Pool 名称
-v CLR 版本
-l 加载的引擎 DLL
-a WAS 通信管道地址
-h 应用池配置文件路径
-m 管道模式 (0=Integrated, 1=Classic)
-t 超时相关配置
-ta 超时动作相关配置

 

为什么这个参数很重要

回到最初的问题:为什么 Application Insights 自动检测在 Classic 模式下不工作?

这涉及到两种管道模式的架构差异:

  • Integrated Pipeline 将 IIS 和 ASP.NET 的请求处理管道统一。HttpModule 可以介入所有请求的处理流程,无论是 .aspx、.html 还是静态资源。
  • Classic Pipeline 沿用 IIS 6 的架构,IIS 和 ASP.NET 的管道是分离的。ASP.NET 的请求通过 ISAPI 扩展 (aspnet_isapi.dll) 处理,HttpModule 只能看到特定扩展名的请求。

Application Insights 的自动检测依赖于在请求管道中注入 HTTP 模块来采集遥测数据。Classic 模式下,这个模块无法拦截所有请求,导致数据采集不完整。因此 Application Insights 团队选择不支持 Classic 模式。

 

参考文档

排查 Azure 应用程序 Insights 代理问题:https://learn.microsoft.com/zh-cn/troubleshoot/azure/azure-monitor/app-insights/agent/status-monitor-v2-troubleshoot#iis-classic-pipeline-mode

 

 


当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32711 80
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17766 21
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36695 21
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24771 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36676 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29847 52
下一篇
开通oss服务