我们正在使用现已弃用的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
答案 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