Azure Web App(S3)内存泄漏排查:无法添加PerformanceCounter至Application Insights
排查Azure Web App中Application Insights性能计数器添加失败的问题
我来帮你梳理下这个问题的排查思路,毕竟在Azure Web App的沙箱环境里折腾性能计数器确实容易踩坑😉
1. 先搞清楚Web App沙箱的限制
Azure App Service的沙箱环境对系统级性能计数器有严格限制,不是所有.NET CLR Memory相关的计数器都能直接用。比如有些全局计数器或者需要系统权限的计数器,在沙箱里根本访问不到,这是最常见的原因。
2. 检查你的配置格式是否正确
你给出的配置片段不完整,正确的PerformanceCollectorModule配置得用对占位符和节点结构,比如:
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector"> <Counters> <!-- 使用??APP_POOL_PROC??占位符匹配当前应用池进程 --> <Add PerformanceCounter="\.NET CLR Memory(??APP_POOL_PROC??)\# Bytes in all Heaps" ReportAs="Bytes in All Heaps" /> <Add PerformanceCounter="\.NET CLR Memory(??APP_POOL_PROC??)\Gen 0 Collections" ReportAs="Gen 0 GC Collections" /> <Add PerformanceCounter="\.NET CLR Memory(??APP_POOL_PROC??)\Gen 1 Collections" ReportAs="Gen 1 GC Collections" /> <Add PerformanceCounter="\.NET CLR Memory(??APP_POOL_PROC??)\Gen 2 Collections" ReportAs="Gen 2 GC Collections" /> </Counters> <!-- 启用内置计数器,确保基础数据能采集 --> <UseBuiltInCounters>True</UseBuiltInCounters> </Add>
这里一定要用??APP_POOL_PROC??代替*,因为在Web App环境里,这个占位符会自动替换成当前应用池的进程名,避免权限和进程匹配问题。
3. 确认NuGet包版本是否统一
要保证你引用的Microsoft.ApplicationInsights.PerfCounterCollector包版本和其他Application Insights相关包(比如Microsoft.ApplicationInsights.Web)版本完全一致,版本不兼容很容易导致计数器模块加载失败,采集不到数据。建议直接升级到最新的稳定版。
4. 验证Application Insights基础配置是否正常
- 先确认Web App的应用设置里已经正确配置了Application Insights的Instrumentation Key,而且没有拼写错误。
- 可以登录Kudu控制台,打开
Diagnostics Tools->Metrics Explorer,看看默认的性能计数器(比如CPU、内存使用率)是否能正常显示。如果默认数据都没有,那大概率是AI本身的配置有问题,得先解决这个基础问题。
5. 替代方案:手动采集内存相关遥测
如果性能计数器实在搞不定,不如换个思路,在代码里手动采集内存和GC数据,比如:
// 采集当前总内存使用量 var totalMemory = GC.GetTotalMemory(false); var memoryMetric = new MetricTelemetry("Total Managed Memory", totalMemory); new TelemetryClient().TrackMetric(memoryMetric); // 采集GC代次回收次数 var gen0Collections = GC.CollectionCount(0); var gen0Metric = new MetricTelemetry("Gen 0 GC Collections", gen0Collections); new TelemetryClient().TrackMetric(gen0Metric);
把这些代码放到合适的地方(比如全局过滤器、定时任务里),就能把数据发送到Application Insights里,同样能帮你排查内存泄漏。
6. 排查内存泄漏的其他实用方法
除了性能计数器,还有这些办法能定位泄漏:
- 在Kudu控制台的
Debug console里,用dotnet-dump工具生成内存转储文件,然后用Visual Studio或者WinDbg分析堆内存,找到未释放的对象。 - 查看Application Insights的
Performance面板里的Memory视图,结合Failures和Dependencies面板,看看是不是有未释放的数据库连接、HttpClient实例或者文件流等资源。
内容的提问来源于stack exchange,提问作者Henrik
相关产品推荐
相关产品推荐

