繁体   English   中英

C ++程序在不同的机器上显示出非常不同的内存行为

[英]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的内存。 我可以在htopvalgrind --tool=massif看到这两个2GB从未被超出。 什么都没有堆积。 但是,在群集上,我可以看到内存在不断增长,直到它变得超过2GB (并且作业被杀死/计算节点冻结...)为止。 请注意,我限制了两台计算机上的线程数,并且可以确保它们相等。

我所知道的是,群集上的libc很旧。 要编译程序,我需要编译g++的新版本并在集群的前端节点上更新libc 该软件在计算节点上运行正常(除了此内存问题),但是libc在该节点上要早得多。 这可能是一个问题,尤其是与线程分配内存有关吗? 我该如何调查?

是的,取决于GNU libc的年代,您可能会缺少一些重要的内存分配优化。 以下是一些可以尝试的事情(不用说,会有性能损失的风险):

  1. 您可以尝试通过mallopt()调整malloc / free行为; 使用M_MMAP_MAXM_MMAP_THRESHOLD选项来鼓励更多分配通过mmap() ,这样可以保证在free()之后将内存返回给系统。

  2. 尝试将容器的分配器设置为__gnu_cxx::malloc_allocator ,以确保mallopt()调整会影响容器。

  3. 尝试在调整大小后调用container.shrink_to_fit() ,以确保该向量没有保留超出严格需要的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM