C++ malloc挂起在Linux中

C++ malloc挂起在Linux中,c++,c,linux,malloc,suse,C++,C,Linux,Malloc,Suse,我在一台有16G ram和2个四核CPU的机器上使用SUSE 10 Linux。 有8个进程正在做一些工作(CPU密集型/网络i/o)。其中4个有内存泄漏(这些是测试条件,因此这里没有泄漏问题)。 所有进程占用的总空间约为15.4 G,系统中只有200 MB可用空间。 几小时内一切都很好。但在此之后,malloc挂起(对于没有内存泄漏的进程)。 它被卡住了超过4分钟(注意CPU不是100%,但io已经显著上升)。 现在挂起的进程没有问题(它没有损坏内存)。 马洛克在干什么?(它正在尝试整理碎片或

我在一台有16G ram和2个四核CPU的机器上使用SUSE 10 Linux。 有8个进程正在做一些工作(CPU密集型/网络i/o)。其中4个有内存泄漏(这些是测试条件,因此这里没有泄漏问题)。 所有进程占用的总空间约为15.4 G,系统中只有200 MB可用空间。 几小时内一切都很好。但在此之后,malloc挂起(对于没有内存泄漏的进程)。 它被卡住了超过4分钟(注意CPU不是100%,但io已经显著上升)。 现在挂起的进程没有问题(它没有损坏内存)。 马洛克在干什么?(它正在尝试整理碎片或建立交换空间)


有什么建议吗?

这可能很烦人,但我建议在阻塞的过程中使用Valgrind。可能存在以前未检测到的错误。至少,你可能知道发生了什么。然而,这几个小时可能变成几天:/

这可能很烦人,但我建议在阻塞的过程中使用Valgrind。可能存在以前未检测到的错误。至少,你可能知道发生了什么。但是,这几个小时可能会变成几天:/

如果
malloc()
只需要很长时间,那么您可能正在遍历一个碎片化的空闲列表,其中许多条目已被替换掉。这与低CPU、高IO和有限的可用RAM是一致的

有关
malloc()
实现的更多信息(包括了解零碎的免费列表),请参阅维基百科文章:

哦,即使在测试环境中,内存泄漏也是不可接受的。正如您所看到的,它们正在干扰(据您所知)没有泄漏的程序,并耗费您的时间。

如果
malloc()
只需花费很长时间,您可能正在遍历一个碎片化的空闲列表,其中许多条目已被替换掉。这与低CPU、高IO和有限的可用RAM是一致的

有关
malloc()
实现的更多信息(包括了解零碎的免费列表),请参阅维基百科文章:


哦,即使在测试环境中,内存泄漏也是不可接受的。正如您所看到的,它们正在干扰(据您所知)没有泄漏的程序,并耗费您的时间。

在您使用机器之前,RAM的寿命很短。现在您的malloc超过了机器的16G限制,系统开始交换。
但按照PierreBdR的提示检查您的应用程序肯定是一个好主意。

在您使用机器之前,RAM的使用寿命很短。现在您的malloc超过了机器的16G限制,系统开始交换。
但是按照PierreBdR的提示检查您的应用程序肯定是个好主意。

已经尝试过了。VALGRIND使我的进程运行速度减慢至少100倍,此模拟将需要数年时间才能完成。要使用VALGRIND并查找分配错误,您可以轻松地在较小的数据集上运行应用程序,或将其划分为单独测试的较小数据块。已尝试过。VALGRIND使我的进程运行速度降低了至少100倍,此模拟将需要数年时间才能完成。要使用VALGRIND并查找分配错误,您可以轻松地在较小的数据集上运行应用程序,或者将其划分为单独测试的较小数据块。malloc可能什么都不做,很可能是内核试图为您释放内存,以便为您提供空间(特别是如果您在内核中关闭了Overmit),难道您不能将gdb连接到挂起的进程并检查堆栈跟踪吗?malloc可能没有做任何事情,很可能是内核试图为您释放内存,以便为您提供空间(特别是在内核中关闭了Overmit的情况下)难道不能将gdb附加到挂起的进程并检查堆栈跟踪吗?