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. 十大Intellij IDEA快捷键<转>

    Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论.每个人都有自己的最爱,想排出个理想的榜单还真是困难.以前也整理过Intellij的快捷键,这次就按 ...

  2. linux 域和xenomai 实时域之间的交互

    /* * XDDP-based RT/NRT threads communication demo. * * Real-time Xenomai threads and regular Linux t ...

  3. 多个 label checkbox 组合 显示在同一个水平线上[前提Bootstrap框架]

    <th align="left" valign="middle"> <label class="checkbox inline fo ...

  4. css中!important的用法总结

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 更新加子查询加相同的表解决办法 mysql

    UPDATE ofuser SET auid = '0' WHERE uid in (SELECT uid FROM (select tmp.* from ofuser tmp)a WHERE aui ...

  6. Differential Geometry之第七章曲面的若干整体性质

    1.曲面的整体描述 2.整体的Gauss-Bonnet公式 2.1.曲面的三角剖分 2.2.Gauss-Bonnet公式 = 2.3.Gauss-Bonnet定理的应用 2.3.1.切向量场的指数定理 ...

  7. storm的集群安装与配置

    storm集群安装 机器:(storm及zookeeper都是这3台机器) 192.168.80.20 192.168.80.21 192.168.80.22 须要准备的软件有: zookeeper( ...

  8. db2 导入cvs

    1)       打开DB2 命令行 2)       如果是第一次连接到远程的DB2 数据库:如果不是,请直接跳转到3) 在DB2 命令行窗口执行: catalog tcpip node DB21 ...

  9. hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)

    Area Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. MFC中给控件添加变量,DoDataExchange中

    DoDataExchange函数其实是一项数据动态绑定技术.比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的.你要添加新的变量就要用到DoDataExchan ...