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的总次数 |
参考