linux下的KSM内存共享机制分析
2017-04-26
KSM是内核中的一种内存共享机制,在2.6.36版本的内核中开始引入,简单来说就是其会 合并某些相同的页面以减少页面冗余。在内核中有一个KSM守护进程 ksmd,它定期扫描用户向它注册的内存区,寻找相同的页面,从而用一个添加写保护的页面来代替, 当有进程尝试写入的时候,会自动分配一个新页面,这点就是典型的COW机制。
KSM最初应用到KVM上,主要作为内存共享,从而腾出更多的可用物理内存,但是事实上,它可以应用于任何应用。KSM仅仅合并匿名页面,不会对文件映射的页面做处理,经过KSM合并的页面最初是被锁定的内存中的,但是现在已经可以像其他页面一样被换出到交换区,但是一经换出,共享的特性就被打破,再次换入的时候,ksmd必须重新对其处理。前面提到,KSM仅仅会扫描那些请求合并的区域,说请求不太合适,就是向KSM模块注册了如果条件允许可以被合并的区域,通过madvise系统调用可以做到这点int madvise(addr, length, MADV_MERGEABLE),同时,应用也可以通过调用int madvise(addr, length, MADV_UNMERGEABLE)取消这个建议从而恢复页面的私有特性,但是该调用可能会突然请求很多内存,超过当前可用的内存额度,造成unmerge失败,很大程度上会造成唤醒Out-Of-Memory killer,杀死当前进程。
如果KSM没被配置进当前运行的内核,前面提到的madvise调用会失败,如果内核配置了 CONFIG_KSM=y,调用一般会成功,即使KSM守护进程没有运行,不过在进程运行的时候,调用设置的区间范围会被注册进去。
像其他的madvise调用,它们是应用于用户空间的mmap区域,如果区间包含unmap区域,那么他们就会返回ENOMEM。
应用在使用KSM的时候要慎重考虑,因为KSM扫描相同的页面会消耗较多的CPU资源,所以一些安装会禁用KSM。KSM守护进程通过sysfs文件系统控制,在/sys/kernel/mm/ksm/下包含有几个文件,所有用户可读但是只有root用户可写
pages_to_scan 在ksmd睡眠之前,需要扫描多少页面 ,通过echo 100 > /sys/kernel/mm/ksm/pages_to_scan可以修改
sleep_millisecs ksmd的睡眠时间,以毫秒为单位。
merge_across_nodes 控制不同NUMA节点内存的合并,如果被设置成0,则只合并当前NUMA节点的内存。
run 控制ksmd的运行。0停止ksmd,但是保持合并的页面。1 运行ksmd。2 停止ksmd并unmerge所有合并的页面。
KSM合并效果实时显示在下面文件:
pages_shared - how many shared pages are being used
pages_sharing - how many more sites are sharing them i.e. how much saved
pages_unshared - how many pages unique but repeatedly checked for merging
pages_volatile - how many pages changing too fast to be placed in a tree
full_scans - how many times all mergeable areas have been scanned
上面字段意义如下A high ratio of pages_sharing to pages_shared indicates good sharing, but a high ratio of pages_unshared to pages_sharing indicates wasted effort.pages_volatile embraces several different kinds of activity, but a high proportion there would also indicate poor use of madvise MADV_MERGEABLE.
原文内容见内核文档ksm.txt
linux下的KSM内存共享机制分析的更多相关文章
- Linux 下增大tomcat内存
我的服务器的配置: # OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...
- Keil C动态内存管理机制分析及改进(转)
源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...
- vector的内存分配机制分析
该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...
- linux 下 取进程占用内存(MEM)最高的前10个进程
# linux 下 取进程占用 cpu 最高的前10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head # linux 下 取进程占用内存 ...
- linux下利用elk+redis 搭建日志分析平台教程
linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...
- (转)Linux下tomcat JVM内存设置步骤
java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space -------------- ...
- Linux下USB suspend/resume源码分析【转】
转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...
- map的内存分配机制分析
该程序演示了map在形成的时候对内存的操作和分配. 因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志.等我明白了,再来修改这个文档. /* 功能说明: map的内存分配机制分析. 代 ...
- list的内存分配机制分析
该程序演示了list在内存分配时候的问题.里面的备注信息是我的想法. /* 功能说明: list的内存分配机制分析. 代码说明: list所管理的内存地址可以是不连续的.程序在不断的push_back ...
随机推荐
- 网桥bridge
1. 网桥基础 什么是网桥 网桥将多个网络在数据链路层连接起来.网桥的前身是集线器或中继器.网桥和集线器的区别:集线器上各端口都是共享同一条背板总线的,网桥的两个端口分别有一条独立的交换信道,不是共享 ...
- 亿级日PV的魅族云同步的核心协议与架构实践(转)
云同步的业务场景 这是魅族云同步的演进,第一张是M8.M9,然后到后面的是MX系统,M9再往后发展,我们的界面可以看到基本上是没有什么变化的,但本质发生了很大的变化,我们经过了一些协议优化,发展到今天 ...
- Linux用ssh登陆出现“Too many authentication failures for root”
vim /etc/ssh/sshd_config 最后参数 UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPR ...
- [android] AndroidManifest.xml【 manifest -> permission-tree 和 manifest -> permission-group】
permission-tree 权限树 <permission-tree android:icon="drawable resource" android:label=&qu ...
- thinkphp 原生sql使用分页类
public function index(){ import("@.ORG.Page"); //导入分页类 $Dao = M(); $count = count($Dao-> ...
- 纪念,BZOJ AC 100题!
虽然说有将近50+是usaco,然后还有很多水题T_T 看来我还是刷水题.... 看来我还是那么弱. T_T 但是好歹也要留个纪念..
- 利用新浪云平台(SAE) 搭建 HUSTOJ 简易教程
前言: OnlineJudge(OJ)是一种代码在线判定平台,这里有许多的编程题目供你选择,你可以选择题目提交代码,OJ会自动返回你的代码的判定结果.是一种很方便的编程.算法练习平台.详情可见:百度百 ...
- VS编译错误:fatal error C1859:unexpected precompiled header error, simply rerunning the compiler might fix this problem
fatal error C1859:unexpected precompiled header error, simply rerunning the compiler might fix this ...
- elasticsearch性能因素总结
一:硬件方面 在预算充足的情况下.特别是一些高并发业务的搜索.硬件层面占用整个elasticsearch性能空间很大比例. 1)内存: 单实例的情况下,尽量分配32G,排序和统计都是以及内存计算的 ...
- Leetcode: Merge/Insert Interval
题目 Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[ ...