Kernel-Samepage-Merging探索及监控

KSM介绍

  • Kernel Samepage Merging 是Linux kernel 2.6.32 引入的新特性。原理是定期扫描内存页,将相同的内存页合并,并将其标示为 cow(当需要修改时,copy新的内存页,再做修改)。最终达到节省内存的目的。
  • KSM最初是为KVM虚拟化技术开发的,对普通应用程序同样适用。可参考官方文档介绍
  • KSM daemon ksmd 周期性的对内存页进行扫描,但是只会对用户主动标记的内存页进行扫描。因此普通应用程序需要主动执行 madvise system call,来标记希望扫描的内存页。

    1
    int madvise(addr, length, MADV_MERGEABLE)
  • 使用完后,同样需要去掉标记:

    1
    int madvise(addr, length, MADV_UNMERGEABLE)

配置

确认内核是否支持KSM

通过查看内核配置文件确认,CONFIG_KSM=y为启用了该功能。

1
2
root@cld-cnode1-44:/home/chenyuhao# grep KSM /boot/config-`uname -r`
CONFIG_KSM=y

开启ksm

通过sysfs intraface,可快速启用ksm

1
echo 1 > /sys/kernel/mm/ksm/run


监控ksm的益处

  • 当可以预估到系统中 会存在大量的相同内存数据时,KSM会取得良好的效果。
  • vm.max_map_count本身是内核级的一个限制,所以监控当前值是有必要的。
  • 呈持续上升趋势的mapped数,可能是进程分配内存不合理的迹象,会导致不必要的虚拟内存碎片,从而浪费内存资源。
  • 呈持续上升趋势的mapped数,也有可能是虚拟内存泄露的表现,尽管它们不一定会导致RSS增长,也可能不会触发OOM。 但是,它们会污染VMA树并可能超出max_map_count限制。

如何采集

  • 发现在用户空间下,有一个pmap工具可以统计出某个进程的mapped数。其实就是统计/prof/self/map文件里的行数。点击了解pmap命令,点击了解proc文件系统
  • 内核总mapped数限制在用户空间可通过sysctl vm.max_map_count来查看。

监控指标说明

图像名称 指标释义
run 2代表停止运行态的KSM并取消合并所有合并页,1代表启动ksm,0代表关机KSM,默认为0。
full_scans 已经执行的全区域扫描次数
pages_shared 稳定数节点数,即共享的物理页数。
pasge_sharing 被共享的物理页数,通过此可计算节省的物理内存pasges_sharing* page_size
pages_unshared 不稳定树的节点数,即未共享的物理页数。
pages_to_scan 控制一次扫描处理的页数,默认为100。
sleep_millisecs ksmd两次扫描之间的时间间隔,单位毫秒,默认20ms。
merge_across_nodes 控制是否允许不同的NUMA节点间进行页合并,默认允许,写入0表示不允许。
max_map_count 内核层限制的可map最大次数
current_map_count 当前系统中所有进程map的总次数

参考

-------------本文结束感谢您的阅读-------------