在 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
要减小虚拟机的大小,请执行以下操作:
-
登录到虚拟机;打开终端并键入
cd /home/ sudo dd if=/dev/zero of=foo bs=4096 sudo rm foo
-
关闭虚拟机,进入 VmWare/VmPlayer 菜单,然后转到
VMware ->虚拟机设置 -> HD ->实用程序 ->紧凑
并压缩虚拟机
如果要进一步减小尺寸,请使用 7-zip。例如,在 Linux 上,您可以键入:
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z directory