确定Azure Web角色中的非托管内存泄漏(Windows Azure Accelerator)

时间:2014-02-04 17:01:08

标签: azure memory-leaks windbg azure-web-roles

我们正在使用现已弃用的Windows Azure Accelerator将多个应用程序部署到Windows Azure Web角色。我们注意到 WAIISHost.exe 进程中存在大量内存泄漏 - 它目前消耗2.5GB内存(在大型Azure实例上)。一周前,它的容量为1.5GB,因此可以说它每周泄漏一次。

我们查看了内存转储,看起来泄漏是不受管理的 - 使用WinDBG中的SOS显示不超过50MB的托管堆。

我们使用了heap_stat.py WinDBG扩展,它显示大多数已分配的对象来自nativerd dll(我相信它是一个内部基础架构库)。这是什么!py heap_stat.py -stat透露:

  

统计:

                                     Type name         Count  Size
                     nativerd!SCHEMA_ATTRIBUTE       8127384  Unknown
                      nativerd!ATTRIBUTE_VALUE       8127037  Unknown
                       nativerd!SCHEMA_ELEMENT       2032263  Unknown
                       nativerd!CONFIG_ELEMENT       1112616  Unknown
                      nativerd!NAMED_ENTRY_KEY         99967  Unknown
                      nativerd!DICTIONARY_LIST         54152  Unknown
                      nativerd!DUPLICATE_TABLE         11654  Unknown

在任何这些对象上运行!heap -p -a没有透露更多其他信息:

  

0:000> !heap -p -a 000000002c1591e0

address 000000002c1591e0 found in
_HEAP @ 8d0000
          HEAP_ENTRY Size Prev Flags            UserPtr UserSize - state
    000000002c1591e0 0014 0000  [00]   000000002c1591f0    00130 - (busy)
      nativerd!SCHEMA_ELEMENT::`vftable'

此时,我们想知道调查memleak的后续步骤是什么。是否有任何其他有用的信息可以从内存转储中提取,或者我们是否应该采用其他方法,例如检查代码并尝试使用分析器在本地运行?

更新:我们的虚拟机正在运行Windows Server 2008 R2 SP1。我们使用的是Azure SDK 1.7。最后,nativerd.dll的版本是7.5.7601.17855

1 个答案:

答案 0 :(得分:3)

我已经采用了已弃用的Windows Azure Accelerator for Web Roles并为其提供了非常需要的爱。它已升级为修复您在此处指出的问题以及升级到Windows Server 2012(目前它是针对1.8 SDK的,但如果您知道自己在做什么,它应该可以正常使用2.X )。

您可以在此处查看:https://github.com/MRCollective/AzureWebFarm

此提交中显示了您遇到的问题的直接修复:https://github.com/MRCollective/AzureWebFarm/commit/467516c77fa23b23fa94f98deb38679cfd08663a,或者,如果您升级到Windows Server 2012,则问题不再存在。

我们最近制作的另一个选项是:https://github.com/MRCollective/AzureWebFarm.OctopusDeploy