8
我正在研究一個應用程序,該應用程序將其本身的分叉次數提高到8次。每個分支在分叉時都有原始進程的內存空間的完整副本。叉子很快,因爲Linux在進程之間共享頁面,並且只在修改時創建新頁面。實際上,內存消耗的增長似乎約爲我的應用程序的3倍。有哪些工具或技術的建議可用於識別會減少增長的變化?如何使用copy-on-write最小化C++程序的內存消耗?
一個想法是查看修改頁面的頁面碎片。還有對分叉進程中分配的東西進行強力檢查。無論哪種情況,您可以推薦哪些技術或工具來執行分析?
請記住,該計劃需要幾個小時才能完成,即使並行且具有高達1TB內存佔用如此儀表選擇是有限的。
你需要叉嗎?你可能只是爲並行創建不同的線程,並且所有的會共享相同的內存(包含所有的影響) –
一個非常一般的建議,但是你可以嘗試使用池分配器(或類似的)來分離你要寫的內存在多個進程中,從分叉發生後保持不變的內存開始。由於COW一次只能完成一個內存頁面,任何與您修改的內存混在一起的只讀內存都會導致不必要的重複。由於避免從假定的只讀分配器修改內存並不是至關重要的,所以即使事先不確定哪個內存是哪個內存,啓發式方法仍可能有所幫助。 –