You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:02