在Linux中,如何将释放的内存页面清零以减小VM的大小 快照?
即使已释放该内存,也会将非归零内存存储在快照中 并且不再使用。例如,内存页面从文件系统缓存中释放 与
sync && echo 3 > /proc/sys/vm/drop_caches
不必要地存储在快照中,因为它们尚未归零。
更新一个真正可怕的解决方案似乎是在一个循环中使用malloc + memset内存,直到OOM杀手进入。这将我测试的一个VM快照的大小从大约800MB减少到大约400MB。有更好的解决方案吗?
答案 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)
要减小虚拟机的大小:
登录虚拟机;打开终端并输入
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