在C#程序中更新Azure表时诊断内存泄漏的策略

时间:2015-09-15 06:17:54

标签: c# azure memory memory-leaks azure-storage

我有一个相当简单的应用程序,它接收一个包含大约500k行数据的数据文件,解析数据,组织它然后将其插入Azure表。大约有2000个这样的文件,我需要在加载所有数据的过程中顺利运行。

我使用WindowsAzure.Storage v5.0.2插入数据,使用Microsoft.tpl.dataflow v4.4.24进行并行化。在移动到下一个文件之前,每个文件都已完成处理并且所有任务已完成。我也处理了所有可能的对象,并在每个文件加载结束时将其他所有内容设置为Null。

尽管尝试尽可能小心,但RAM使用率会稳步上升,直到崩溃进程为止。当它启动时,它会跳转到1 GB的RAM并稳步爬升,直到进程崩溃超过9GB的RAM消耗。 注意 - 这是在一台相当大的计算机上定位x64。垃圾收集定期进行,但似乎不会影响内存问题。

此时我对内存泄漏的来源完全感到困惑,并且对如何诊断问题一无所知。

更新

经过大量工作并遵循以下建议后,我发现我使用的并行化允许更多的同步插入过程比我预期的更多。看起来插件已经完成,我的代码正在开始下一个插入。实际上,并行流程刚刚报告了状态但尚未完成。这导致了大量的同步插入积压,扼杀RAM并使系统崩溃。这也让我超过了我的IOPS限制,我认为触发了限制,使问题复杂化。

解决这个问题需要大量的工作和许多不同的分析方法,但下面的建议让我朝着正确的方向前进。

1 个答案:

答案 0 :(得分:0)

搜索“故障排除.net内存泄漏”会产生大量结果,但最好的结果可能是http://blogs.msdn.com/b/tess/archive/2009/05/12/debug-diag-script-for-troubleshooting-net-2-0-memory-leaks.aspx

基本上,使用DebugDiag生成内存泄漏分析报告,然后查找哪些对象占用了所有内存。您可能会看到一种类型的对象,您没有意识到您不断添加到集合中而不会在以后删除它。