[英]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.