簡體   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