Skip to content

Latest commit

 

History

History
109 lines (91 loc) · 4.91 KB

QF_mem_overcommit.md

File metadata and controls

109 lines (91 loc) · 4.91 KB

内存超分配

#####透明页面共享

  • KSM
    KSM是Linux内核提供的一个功能,主要用于合并完全相同的内存页面从而提高内存使用率。
    由于KVM虚拟机是Linux的一个进程,所以可以很方便的使用到该特性。从而提供内存超配的能力。
    • 确认KSM是否开启:
KSM /boot/config-`uname –r`  
  • 内核参数目录:/sys/kernel/mm/ksm
  • 默认KSM可以监控2000个页面:
cat /sys/kernel/mm/KSM/max_kernel_pages   
2000 
  • KSM需要程序使用madvise函数申请内存。确认KVM编译包含了该能力。
#ifdef MADV_MERGEABLE
        madvise(new_block->host, size, MADV_MERGEABLE);
#endif
  • UKSM
    UKSM是国人对KSM的改进。主要有透明的全页面扫描(KSM需要使用madvise函数申请的内存才会合并)。改进的扫描采样算法(部分Hash取样)。以及对不同内存区域采用不同的扫描频率等改进方式。 UKSM以内核patch方式存在,需要重新编译内核。
    控制接口在 /sys/kernel/mm/uksm中,参数如下:
文件名 说明
run 控制uksmd启动,默认启动。0为关闭
cpu_governor 通过cat cpu_governor可以看到几种可选的模式和当前激活的模式,比如 [full] medium low quiet,这个说明当前采用的是全速扫描。这个几个扫描级别基本对应了 90%以上,50%,20% 和 < 1%的最大CPU占用控制以及对应的一些其它高级参数的微调。例:echo "medium" > cpu_governor
max_cpu_percentage 在已经使用了某个具体的cpu使用模式下,你可以进一步精确限制最大的cpu占用百分比。例:(最大为35%的最高CPU占用):echo 35 > max_cpu_percentage

高级控制接口:

文件名 说明
cpu_ratios 每个扫描级别的CPU占用率,以万分之一作为单位,或者以最高CPU占用作为参考。例(cat cpu_ratios): 50 75 MAX/4 MAX/1这个说明我当前的四个扫描级别的速度分别是0.5%,0.75%,最大扫描速度(max_cpu_percentage)的1/4和最大扫描速度,大部分时间在没有大量冗余内存的时候,uksmd对CPU的占用在 0.5%左右,top就看不出来了,我自己已经很满意了。
eval_intervals 四个扫描级别的采样周期大小,以毫秒为单位。如果是0的话,表明不对其采样,扫描完毕为止。这一般用在最高的扫描级别,即我们已经非常确信这里面有很多冗余页面。
abundant_threshold 一个区域有多少百分数的有效冗余页面,uksmd才会拔高它的扫描级别,缺省是10, 即只有当一个区域被发现超过10%的页面是冗余的时候,我们才会加速它的扫描。

用户只读参数:

文件名 说明
full_scans 采样覆盖全部内存区域的次数。
hash_strength 自适应增量采样算法的当前的强度,值越低,那么当前合并的速度将会越快。
pages_scanned 当前已经扫描了多少页面。
pages_shared 有多少个不同的物理页面处在被共享的状态。
pages_sharing 有多少个虚拟页面指向以上的共享页面,差不多可以等效看作你节省的内存。
pages_unshared 有多少个不同的物理页面未处在被共享的状态。
sleep_times uksmd已经休眠了多少次。

#####内存气泡
内存气泡的原理非常简单,通过在guest中申请内存来进行guest内的释放,供其他虚拟机使用。

  • libvirt

xml文件:

  <devices>
    ......
    <memballoon model='virtio'/>
    ......
  </devices>

设置(虚拟机分配内存-气球内存)大小,大小可以带单位,默认单位为k。

virsh setmem DOMAIN_NAME SIZE
例如:
virsh setmem win7 2G

没有查看(虚拟机分配内存-气球内存)大小的virsh命令,但是可以使用:

# virsh qemu-monitor-command --hmp win7 'info balloon'
balloon: actual=4096
  • qemu命令

ballon设备:

-device virtio-balloon-pci,id=DEVICE_ID

查看虚拟机实际内存:

(qemu) info balloon

释放内存(设置气球大小,释放需要一个过程):

(qemu) balloon SIZE
  • 其他
    关于自动气泡,从多个层次都可以实现。比如hypervisor层或者更上层的管理系统实现。

#####页面交换
qemu-kvm虚拟机作为系统的进程存在,所使用的内存可以利用系统的swap能力进行换出。
不需要特别设置。

#####页面压缩
未见支持。