8

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

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

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

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

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

4

2 回答 2

3

像这样的东西会释放磁盘缓存,然后使用 dd 分配和 memset 可用内存量(减去 32MB,作为避免命中交换的空间)。例如,在 KSM 的情况下,将暂时使 VM 成为非 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
于 2014-03-19T13:03:12.313 回答
1

要减小虚拟机的大小:

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

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

    vmware -> 虚拟机设置 -> HD -> 实用程序 -> compact

    并压缩虚拟机

如果要进一步减小大小,请使用 7-zip。例如,在 Linux 上,您可以键入:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z directory
于 2013-11-05T15:43:45.140 回答