现代操作系统对内存共享的应用已经非常广泛了,例如fork的进程会与父进程共享所有的内存空间,虚拟化技术也逐渐增加了对内存共享的要求,但是并没有想象中那么容易。虚拟化的一个重要优势是能将多个工作负载整合到一个计算机系统中,Linux主要采用了两种技术来解决虚拟化的内存超量使用。
1: 内存膨胀(memory ballooning)是指主机指示合作客户释放一些已分配内存以用于其他用途。这种技术将内存压力从主机转移到客户机上。
2:KSM(Kernel same-page merging) 使用一个内核线程扫描之前确认的内存范围内是否有一样的页面,将其合并 然后释放其副本。KSM是最受欢迎的形势。KSM 简单来说就是一个memory deduplication(内存去耦合)的进程。KSM允许虚拟机合并一些内存内容相同的page,进而达到节约内存的目的.
我们通过一个例子来了解KVM shared memory 的好处
[3]利用30个windows 7 镜像做了KSM memory deduplication 实验。
Windows 7 镜像个格式为qcow2,大小为20G,4G虚拟内存 ,2个CPU
测试KVM的主机为Dell c6220,32个HT 内核和128G的主存。
启动30个Window 7 的配置为:
MEM=4048
BACKING_DIR = /mnt/ksm-test
BACKING_FILE=win7-base.qcow2
SLEEP=60
Ubuntu默认开启KSM, 默认配置为:pages_scan = 100; sleep_millisecs = 200
也就是说KSM会扫描100个内存pages,休息200 millisecsÿ