如何清零未使用的内存以减少虚拟机快照大小

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

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

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

被不必要地存储在快照中,因为它们没有被归零。

更新看起来可行的一个非常糟糕的解决方案是在一个循环中malloc + memset内存,直到OOM杀手启动。这将我测试的一个VM快照的大小从大约800MB减少到大约400MB。 有更好的解决方案吗?


像这样的东西将释放磁盘缓存,然后使用dd分配&memset可用内存量(减去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

要减小虚拟机的大小:

  • 登录到虚拟机; 打开一个终端并键入

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

    vmware - >虚拟机设置 - > HD - > utilities - > compact

    并压缩虚拟机

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

    7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z directory
    
    链接地址: http://www.djcxy.com/p/75219.html

    上一篇: How to zero unused memory to reduce VM snapshot size

    下一篇: How to install Prawn for Rails 4