如何将未使用的内存归零以减少VM快照大小

时间:2013-10-31 12:16:59

标签: linux linux-kernel virtual-machine

在Linux中,如何将释放的内存页面清零以减小VM的大小 快照?

即使已释放该内存,也会将非归零内存存储在快照中 并且不再使用。例如,内存页面从文件系统缓存中释放 与

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

不必要地存储在快照中,因为它们尚未归零。

更新一个真正可怕的解决方案似乎是在一个循环中使用malloc + memset内存,直到OOM杀手进入。这将我测试的一个VM快照的大小从大约800MB减少到大约400MB。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

像这样的东西将释放磁盘缓存,然后使用dd分配和释放可用内存量(减去32MB,作为避免触及交换的余量)。在例如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

答案 1 :(得分:1)

要减小虚拟机的大小:

  1. 登录虚拟机;打开终端并输入

    cd /home/
    
    sudo dd if=/dev/zero of=foo bs=4096
    
    sudo rm foo
    
  2. 关闭虚拟机,进入VmWare / VmPlayer菜单并转到

    vmware - >虚拟机设置 - > HD - >公用事业 - >紧凑

    并压缩虚拟机

  3. 如果您想进一步缩小尺寸,请使用7-zip。例如,在Linux上,您可以键入:

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