2013-10-31 19 views
7

在Linux中,如何清零釋放的內存頁以減少VM 快照的大小?如何清零未使用的內存以減少VM快照大小

即使內存已被釋放,但非零內存仍存儲在快照中,並且不再使用該內存 。例如,內存頁面從文件系統緩存 釋放與

sync && echo 3 > /proc/sys/vm/drop_caches 

是不必要的存儲快照,因爲他們沒有被歸零。

更新,似乎工作的一個很可怕的解決方案是對malloc + memset的內存在一個循環,直到OOM殺手踢。這將降低我約800MB測試,以約400MB的一個虛擬機快照的大小。有更好的解決方案嗎?

+0

(從編輯後刪除答案,似乎我誤解了你真正想要的) – Damon

+0

我認爲這是不可能的。 Linux有一個COW零頁面,它在新分配時返回,它在第一次寫訪問時進行復制(創建一個充滿零的頁面,但這在技術上不再是零頁面)。您可以通過分配大量內存並在每個頁面的開始處寫入''\ 0'來清除所有物理內存(理論上),但這些內容之後將成爲包含數據(發生時爲零)的頁面,不是零頁。如果你再次釋放這些內容,它們將與你所擁有的非零頁面一樣 - 只有它們包含零。 – Damon

+0

儘管您可能會嘗試這樣做(分配大量內存,並將其物理歸零),然後在整個批次中使用「MADV_MERGEABLE」。也許內核samepage合併會做的伎倆。請注意,這不完全是一種自由操作(CPU方式)。 – Damon

回答

1

爲了減少虛擬機的尺寸:

  1. 登錄到虛擬機;打開一個終端輸入

    cd /home/ 
    
    sudo dd if=/dev/zero of=foo bs=4096 
    
    sudo rm foo 
    
  2. 關閉虛擬機,輸入VMware/VmPlayer菜單進入

    vmware的 - >虛擬機設置 - > HD - >工具 - >緊湊

    和緊湊的虛擬機

如果要進一步縮小規模,請使用7-zip。例如,在Linux上,你可以輸入:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z directory 
+1

這會影響cust虛擬硬盤,而不是虛擬RAM。問題是關於快照,其中包括硬盤數據以及RAM數據。 – glglgl

3

像這樣的東西會釋放磁盤緩存,然後ALLOC &的memset的可用內存量(減去32MB,爲淨空避免撞到掉期)用dd。例如在KSM的情況下會臨時創建VM un-CoW內存,但會留下(未分配的)填滿零的內存塊,然後可以與其他VM(使用KSM)共享/刪除或輕鬆壓縮。

#!/bin/bash 

echo 3 > /proc/sys/vm/drop_caches 
memfree=$(free -m | awk '/^Mem/ {print $4-32}') 
if [ $memfree -gt 0 ]; then 
     dd if=/dev/zero of=/dev/null bs=${memfree}M count=1 
fi