2012-11-28 45 views
8

我正在研究一個應用程序,該應用程序將其本身的分叉次數提高到8次。每個分支在分叉時都有原始進程的內存空間的完整副本。叉子很快,因爲Linux在進程之間共享頁面,並且只在修改時創建新頁面。實際上,內存消耗的增長似乎約爲我的應用程序的3倍。有哪些工具或技術的建議可用於識別會減少增長的變化?如何使用copy-on-write最小化C++程序的內存消耗?

一個想法是查看修改頁面的頁面碎片。還有對分叉進程中分配的東西進行強力檢查。無論哪種情況,您可以推薦哪些技術或工具來執行分析?

請記住,該計劃需要幾個小時才能完成,即使並行且具有高達1TB內存佔用如此儀表選擇是有限的。

+4

你需要叉嗎?你可能只是爲並行創建不同的線程,並且所有的會共享相同的內存(包含所有的影響) –

+1

一個非常一般的建議,但是你可以嘗試使用池分配器(或類似的)來分離你要寫的內存在多個進程中,從分叉發生後保持不變的內存開始。由於COW一次只能完成一個內存頁面,任何與您修改的內存混在一起的只讀內存都會導致不必要的重複。由於避免從假定的只讀分配器修改內存並不是至關重要的,所以即使事先不確定哪個內存是哪個內存,啓發式方法仍可能有所幫助。 –

回答

2

您可以使用vmstatsystemtap和或glibcmalloc-hooks來監控消耗。 您可以使用perf來查看發生故障的位置,以瞭解消耗的實際影響。

如果您的應用程序面臨的TLB壓力,當你使用大內存池(例如你正在經歷一個非常大的數據量流),你可以用巨大的/大頁面,以減輕4K頁面的開銷。

您還可以使用madvise從你的過程中告訴內核你很可能會與已分配的內存做。