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 ...
随机推荐
- 搭建自己的GitHub Pages
本文记录博主使用Win 10操作系统和Jekyll 3.1.2搭建GitHub Pages的过程.希望能帮助到相同有需要的朋友. 基本需求 GitHub账号及一个命名为{GitHub昵称}.githu ...
- /proc/meminfo分析
参考: 1. linux/Documentation/filesystems/proc.txt 2. Linux 中 /proc/meminfo 的含义 3. redhat deployment gu ...
- Amazon EC2云端服务器的使用方法
Amazon的EC2服务器可以理解为虚拟机,不过它是不需要安装系统的,它是根据镜像自动创建的.在申请EC2的时候,可以选择操作系统的类型,如Redhat Enterprise 6或ubuntu 12等 ...
- 构造 - HDU 5402 Travelling Salesman Problem
Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...
- 002杰信-陌生的maven-web项目整改成我们熟悉的Web架构;classpath的含义;ssm框架的整合;junit测试
这篇博客的资源来源于创智播客,先在此申明.这篇博客的出发点是jk项目,传智的做法是Maven的web模板生成的,但是这样子的结构目录与我们熟知的Web项目的结构目录相差很大,所以要按照我们熟知的项目结 ...
- Unity3d优化总结1
优化内容 包括: 1.代码方面: 2.函数使用方面: 3.ngui注意方面: 4.数学运算方面: 5.内存方面: 6.垃圾回收方面 等等... 1. 尽量避免每帧处理,可以每隔几帧处理一次 比如: ...
- PHP中strlen和mb_strlen函数的区别
strlen strlen — 获取字符串长度 int strlen ( string $string ) 返回给定的字符串 string 的长度. mb_strlen int mb_strlen ( ...
- Linux下Vi/Vim的使用方法
本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!i/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特 ...
- xdebug常用配置
;指定xdebug文件 zend_extension = "F:\tools\develop_tools\php\php_xdebug-2.2.2-5.4-vc9.dll" ;xd ...
- hdu 4240在(最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4240 思路:题意真的有点难理解:在城市A->B之间通过所有路径一小时之内能通过最大的车辆(Max ...