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

本文关键字:内存 泄漏 诊断 策略 程序 更新 Azure | 更新日期: 2023-09-27 18:12:49

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

我正在使用WindowsAzure。用于插入数据的Storage v5.0.2和用于并行化的Microsoft.tpl.dataflow v4.4.24。在进入下一个文件之前,每个文件都被完全处理过,所有的任务都完成了。我还处理了所有可以处理的对象,并在每次文件加载结束时将其他所有对象设置为Null。

尽管尝试尽可能小心,RAM使用稳步上升,直到它崩溃的进程。当它启动时,它会跳到使用的1gb RAM,然后稳步攀升,直到进程在消耗的9GB RAM以上崩溃。注意-这是针对相当大的计算机上的x64。垃圾收集是定期发生的,但它似乎不影响内存问题。

在这一点上,我完全不知道内存泄漏是从哪里来的,不知道如何诊断这个问题。

经过大量的工作和下面的建议,我发现我正在使用的并行化允许比我预期的更多的同时插入进程。看起来插入已经完成,我的代码正在开始下一次插入。实际上,并行进程只是报告了一个状态,但还没有完成。这将导致大量的同时插入操作积压,消耗内存并导致系统崩溃。它还导致我超过了IOPS限制,我认为这触发了节流,使问题更加复杂。

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

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

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

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