我有一个程序,它接受来自套接字的数据,执行一些质量控制,并对其进行分类的其他条件,然后将其写出到命名管道。我在上面运行了valgrind,并修复了原来存在的所有内存泄漏。然后我在一个系统上创建了一个“演示”环境,在这个环境中我运行了32个程序实例,每个实例都有唯一的数据,每个实例都输出到自己的管道中。我们对它进行了测试,一切看起来都很正常。然后,我尝试通过将数据发送速率提高到一个荒谬的速率来对其进行压力测试,结果first...but看起来很好,我的程序不断消耗越来越多的内存,直到我没有剩余的资源。
我转向valgrind并运行完全相同的设置,除了在valgrind中使用leak check=full运行的每个程序。发生了一些奇怪的事情。首先,内存确实泄漏了,但只是在每个程序消耗了我内存的.9 %的情况下(以前最大的内存占用了我全部6%的内存)。随着valgrind的运行,程序的CPU成本急剧上升,我现在是100%的cpu,平均负载很大,所以可能是由于缺乏可用的CPU导致所有程序运行得足够慢,以至于泄漏花了太长的时间才显现出来。当我试图阻止这些程序时,valgrind显示没有直接的内存泄漏,它显示了一些潜在的内存泄漏,但我检查了它们,我不认为它们中的任何一个代表真正的内存泄漏;除此之外,当程序消耗超过100MB时,可能的内存泄漏仅显示为几千字节。valgrind报告的可达(无泄漏)内存也在KB范围内,因此valgrind似乎认为我的程序消耗的内存只是Top所说的内存的一小部分。
我已经运行了其他一些测试,得到了奇怪的结果。一个单独的程序,即使以我最初内存泄漏检测到的三倍的速度运行,似乎消耗的内存永远不会超过.9%,两个程序分别泄漏1.9 %和1.3%的内存,但不会超过1.3%,依此类推,就好像泄漏的内存量和泄漏的速率,在某种程度上取决于我的程序同时运行的实例的数量;这是没有意义的,每个实例应该是100%独立于其他实例的。
我还发现,如果我在valgrind中运行32个实例,而只有一个实例在valgrind中运行,那么valgrinded实例就是valgrinded实例(如果我说它是,那就是一个词!)内存泄漏,但速度比valgrind外部运行的要慢。valgrind实例仍然会说我没有直接泄漏,并且报告的内存消耗比Top show要少得多。
我很难理解是什么导致了这个结果,以及为什么valgrind拒绝意识到内存泄漏。我认为它可能是一个外部库,但我实际上并不使用任何外部库;只使用基本的C++函数/对象。我还认为可能是写入输出管道的数据快速导致缓冲区无限增长,但1)这样的缓冲区可以增长应该有一个上限,2)一旦内存泄漏,如果我将数据输入速率降为零,内存将继续消耗,而不是缓慢下降到合理的数量。
谁能给我一个提示,关于我应该从这里往哪里看?我完全搞不懂为什么记忆是这样的。
谢谢。
发布于 2012-08-31 07:00:33
这听起来像是我最近遇到的一个问题。
如果您的程序接受数据并在内部没有任何限制地缓冲它,那么它读取和缓冲的速度可能比它输出数据的速度快。在这种情况下,内存使用量将继续无限制地增加。
运行的程序实例越多,每个实例的运行速度就越慢,缓冲区增加的速度也就越快。
这可能是也可能不是你的问题,但在没有更多信息的情况下,这是我能做的最好的事情。
发布于 2012-08-31 00:27:32
您应该首先查看是否有软泄漏。当一些静态或单例逐渐增加一些缓冲区或容器,并将垃圾收集到其中时,就会发生这种情况。从技术上讲,它不是泄漏,但它的影响同样糟糕。
发布于 2012-08-31 05:11:03
我可以建议您尝试使用MemoryScape吗?这个工具在内存泄漏检测方面做得很好。它不是免费的,但考虑到所花费的时间和精力,它值得一试。
https://stackoverflow.com/questions/12200714
复制相似问题