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内存共享机制分析的更多相关文章

  1. Linux 下增大tomcat内存

    我的服务器的配置: # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...

  2. Keil C动态内存管理机制分析及改进(转)

    源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...

  3. vector的内存分配机制分析

    该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...

  4. linux 下 取进程占用内存(MEM)最高的前10个进程

    # linux 下 取进程占用 cpu 最高的前10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head # linux 下 取进程占用内存 ...

  5. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  6. (转)Linux下tomcat JVM内存设置步骤

    java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space -------------- ...

  7. Linux下USB suspend/resume源码分析【转】

    转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...

  8. map的内存分配机制分析

    该程序演示了map在形成的时候对内存的操作和分配. 因为自己对平衡二叉树的创建细节理解不够,还不太明白程序所显示的日志.等我明白了,再来修改这个文档. /* 功能说明: map的内存分配机制分析. 代 ...

  9. list的内存分配机制分析

    该程序演示了list在内存分配时候的问题.里面的备注信息是我的想法. /* 功能说明: list的内存分配机制分析. 代码说明: list所管理的内存地址可以是不连续的.程序在不断的push_back ...

随机推荐

  1. 干接点&湿接点

    干接点的定义: 无源开关:具有闭合和断开的2种状态:2个接点之间没有极性,可以互换: 常见的干接点信号有: 1.各种开关如:限位开关.行程开关.脚踏开关.旋转开关.温度开关.液位开关等: 2.各种按键 ...

  2. Python高级编程之生成器(Generator)与coroutine(一):Generator

    转载请注明出处:点我 这是一系列的文章,会从基础开始一步步的介绍Python中的Generator以及coroutine(协程)(主要是介绍coroutine),并且详细的讲述了Python中coro ...

  3. easy UI动态赋值

    1,首先怎么清除这个值 $('#filegrid').datagrid('loadData', { total: 0, rows: [] }); 2,清除后,通过post提交请求,怎么将新植穿进去,这 ...

  4. java-I/O File类(5)-Reader和Writer、OutputStreamWriter 、BufferedWriter、字节流和字符流的区别

      标签: outputstreamwriterreader字符file方法 2015-05-14 23:06 469人阅读 评论(0) 收藏 举报  分类: 孙鑫-java基础(16)  I-O(4 ...

  5. 【Python】用文本打印树

    From:http://zhidao.baidu.com/link?url=O8U5TynGBMojDw2iFhlghPPf5_ZE1X8CAQMrK19pv-KxhvKCc6Z2yzsoQaukgN ...

  6. hdu 4003(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 思路:dp[i][j]表示以i为根选择j个机器人的最小花费,然后就是背包了:dp[u][i]=m ...

  7. Spring Cache 自定义注解

    1.在使用spring cache注解如cacheable.cacheevict.cacheput过程中有一些问题: 比如,我们在查到一个list后,可以将list缓存到一个键对应的区域里:当新增.修 ...

  8. TreeSet排序,存储自己定义对象,自己定义比較器演示样例

    Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...

  9. com.mysql.jdbc.MysqlDataTruncation: Data trunca...

    连接的是mysql数据库,插入数据时,控制台报: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for colu ...

  10. pure

    Pure也是一款很出色的CSS框架,之前分享的Bootstrap是由Twitter出品的,而Pure是来自雅虎的.尽管从UI界面效果上来说,Pure没有Bootstrap那样精美,但Pure是纯CSS ...