[英]c++ program shows very different memory behaviour on different machines
我用C ++编写了一个计算机模拟,需要大量内存。 它在迭代中运行,并且在每个迭代中分配大量的内存,这些内存应在迭代结束时释放。 它还使用c ++ 11的<thread>
来并行运行东西。
当我在台式机上测试该程序时,它的运行情况很好:它永远不会超出我允许的内存,并且在时间和迭代过程中,不会堆积任何东西。 但是,当我将程序提交到计算集群时,使用的内存(我只能通过排队软件访问)随时间增长,并且远远超出了我的计算机上使用的内存。
首先让我大致向您展示软件的结构:
for thread in n_threads:
vector<Object> container;
for iteration in simulation:
container.clear()
container.resize(a_large_number)
... do stuff ...
假设,在我的机器上,容器占用了2GB
的内存。 我可以在htop
和valgrind --tool=massif
看到这两个2GB
从未被超出。 什么都没有堆积。 但是,在群集上,我可以看到内存在不断增长,直到它变得超过2GB
(并且作业被杀死/计算节点冻结...)为止。 请注意,我限制了两台计算机上的线程数,并且可以确保它们相等。
我所知道的是,群集上的libc
很旧。 要编译程序,我需要编译g++
的新版本并在集群的前端节点上更新libc
。 该软件在计算节点上运行正常(除了此内存问题),但是libc在该节点上要早得多。 这可能是一个问题,尤其是与线程分配内存有关吗? 我该如何调查?
是的,取决于GNU libc的年代,您可能会缺少一些重要的内存分配优化。 以下是一些可以尝试的事情(不用说,会有性能损失的风险):
您可以尝试通过mallopt()
调整malloc / free行为; 使用M_MMAP_MAX
和M_MMAP_THRESHOLD
选项来鼓励更多分配通过mmap()
,这样可以保证在free()
之后将内存返回给系统。
尝试将容器的分配器设置为__gnu_cxx::malloc_allocator
,以确保mallopt()
调整会影响容器。
尝试在调整大小后调用container.shrink_to_fit()
,以确保该向量没有保留超出严格需要的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.