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



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

未清零的内存存储在快照中,即使该内存已释放并且不再使用。例如,从文件系统缓存中释放的内存页跟

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

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

更新 一个似乎有效的非常可怕的解决方案是循环 malloc+memset 内存,直到 OOM 杀手启动。这会将我测试的一个 VM 快照的大小从大约 800MB 减少到大约 400MB。 有没有更好的解决方案?

这样的事情将释放磁盘缓存,然后使用 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. 登录到虚拟机;打开终端并键入

    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

最新更新