在Linux中,如何清零釋放的內存頁以減少VM 快照的大小?如何清零未使用的內存以減少VM快照大小
即使內存已被釋放,但非零內存仍存儲在快照中,並且不再使用該內存 。例如,內存頁面從文件系統緩存 釋放與
sync && echo 3 > /proc/sys/vm/drop_caches
是不必要的存儲快照,因爲他們沒有被歸零。
更新,似乎工作的一個很可怕的解決方案是對malloc + memset的內存在一個循環,直到OOM殺手踢。這將降低我約800MB測試,以約400MB的一個虛擬機快照的大小。有更好的解決方案嗎?
(從編輯後刪除答案,似乎我誤解了你真正想要的) – Damon
我認爲這是不可能的。 Linux有一個COW零頁面,它在新分配時返回,它在第一次寫訪問時進行復制(創建一個充滿零的頁面,但這在技術上不再是零頁面)。您可以通過分配大量內存並在每個頁面的開始處寫入''\ 0'來清除所有物理內存(理論上),但這些內容之後將成爲包含數據(發生時爲零)的頁面,不是零頁。如果你再次釋放這些內容,它們將與你所擁有的非零頁面一樣 - 只有它們包含零。 – Damon
儘管您可能會嘗試這樣做(分配大量內存,並將其物理歸零),然後在整個批次中使用「MADV_MERGEABLE」。也許內核samepage合併會做的伎倆。請注意,這不完全是一種自由操作(CPU方式)。 – Damon