Windows容器运行PerfView遇COMException(0x80070296)问题求助
解决Windows容器中运行PerfView时的0x80070296 COM异常
异常详情
[Exception Occurred: System.Runtime.InteropServices.COMException (0x80070296): Exception from HRESULT: 0x80070296 at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at Microsoft.Diagnostics.Tracing.Extensions.ETWControl.EnableStackCaching(UInt64 traceHandle) at Microsoft.Diagnostics.Tracing.Session.TraceEventSession.EnableKernelProvider(Keywords flags, Keywords stackCapture) at PerfView.CommandProcessor.Start(CommandLineArgs parsedArgs) at PerfView.CommandProcessor.Collect(CommandLineArgs parsedArgs) at PerfView.CommandProcessor.ExecuteCommand(CommandLineArgs parsedArgs)]
操作步骤
- 下载PerfView v3.0.6并复制到Windows容器内
- 通过
crictl exec <container id> powershell进入容器终端 - 执行收集命令:
.\PerfView "/DataFile:PerfViewData.etl" /BufferSizeMB:256 /StackCompression /CircularMB:500 /logFile=log.txt /maxCollectSec=30 /NoGui collect
环境信息
- 基础镜像:
mcr.microsoft.com/windows/nanoserver:1809 - 隔离模式:
runhcs-wcow-hypervisor(Hyper-V隔离)
解决方案
1. 切换至Server Core基础镜像
Nano Server为轻量化设计,裁剪了PerfView内核追踪依赖的ETW相关系统组件和服务,无法支持完整的PerfView功能。改用mcr.microsoft.com/windows/servercore:1809作为容器基础镜像,该镜像包含完整的系统服务和组件,能够兼容ETW追踪需求。
2. 以特权模式启动容器
PerfView需要访问内核级ETW接口,普通容器权限不足以完成操作。启动容器时添加特权模式参数(crictl对应--privileged=true),确保容器拥有足够权限访问系统追踪资源。
3. 调整PerfView命令参数
容器内资源受限,过大的缓冲区配置可能导致初始化失败,同时部分特性在容器环境中兼容性不佳:
- 降低
/BufferSizeMB值至64(或更小),减少内存占用 - 暂时移除
/StackCompression参数,避免兼容性问题
修改后的命令:
.\PerfView "/DataFile:PerfViewData.etl" /BufferSizeMB:64 /CircularMB:500 /logFile=log.txt /maxCollectSec=30 /NoGui collect
4. 验证Hyper-V隔离配置
确认容器确实运行在Hyper-V隔离模式下,通过对应工具检查容器的隔离配置字段是否为hyperv,避免配置未实际生效导致的权限或资源限制问题。
内容的提问来源于stack exchange,提问作者SilverNarcissus
相关产品推荐
相关产品推荐

