在Linux的"free"命令的输出结果中,有一项是"available"(对应"/proc/meminfo"中的"MemAvailable"),它是对启动一个新应用的“可使用内存”的 估算 。在一次实验中,我偶然发现了它出现的变化。

这篇文章介绍过"watermark_scale_factor",它的默认值是10,最大允许值是1000。笔者为了增加kswapd的启动次数(更积极地回收内存),就把它调到了1000,结果发现"available"这一项产生了巨大的变化,但其他几项的数据都没有任何改变:

真的是由于设置watermark的参数引起的吗?试着把它改回去:

看来还真是,但这是为什么呢?还得从"available"内存的计算方法说起,其对应的函数实现是 si_mem_available ():

long si_mem_available(void)

{

// free - ( lowmem reserve + high watermark )

available = global_zone_page_state(NR_FREE_PAGES) - totalreserve_pages;

// zone low watermark

for_each_zone(zone)

wmark_low += low_wmark_pages(zone);

// part of page cache

pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];

available += pagecache - min(pagecache / 2, wmark_low);;

// other reclaimable

reclaimable = global_node_page_state(NR_SLAB_RECLAIMABLE) +

global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE);

available += reclaimable - min(reclaimable / 2, wmark_low);

return available;

}

一般认为,空闲的内存一定是可用的,其实并不尽然,因为有zone watermark和lowmem reserve的存在。前者作为启动内存回收的watermark依据存在,而后者主要是为了避免被高位zone在fallback时过度挤压自己的内存而reserve。

所有zones的wmark_high值之和,加上lowmem reserve,就构成了totalreserve_pages,这部分内存虽然未被分配,但不能算在"available"的范畴里。

这就是为什么在本文开头的实验中,调整zone watermark参数会引起"available"值的变化,因为它导致"high"相对于"min"的值增大,而"min"值不变,所以"high"值增大,进而使"available"的值减小。

内存已经被分配,但经过内存回收后可以释放的部分,也属于“可用内存”。Page cache和anonymous pages中都存在可被回收的部分,但page cache由于存在后备文件,回收的时候不需要像anonymous pages那样向磁盘申请swap space空间,而且只读的page cache甚至都不用writeback,直接discard即可,所以通常优先回收file-backed的page cache。

swapping操作不光更加耗时,而且必须要有swap分区才能将anonymous pages换出,这在某些系统上是没法满足的。因此,"available"的计算并没有把anonymous pages中可回收的部分考虑进去。

但page cache中也存在一些内存是 不可回收 的(unreclaimable)的,包括:

内核自己使用的页面通常不会被回收。内核本身不需要很多的内存,而且这些内存的使用频率很高,回收内核内存增加的复杂度往往超过回收带来的益处。

被临时lock的页面,比如将页面添加到page cache或从page cache移除时,页面正在write back同步时,为了互斥,都需要通过lock_page()将页面暂时锁住。被lock的内存数量可通过"/proc/meminfo"中的"Mlocked"查看,它同时也属于"Unevictable"的LRU链表的一部分。

flag被设置为PG_reserved的页面。

但要精确统计这些不可回收的page cache比较困难,因此采用估算的方法,以page cache的一半和"wmark_low"中偏小的那个值,作为保留不被回收的page cache大小。此外,slab中的一部分内存也是可以回收的。

因此,"available"的内存主要包括了:空闲内存减去所有zones的lowmem reserve和high watermark,再加上page cache和slab中可以回收的部分。

参考:

原创文章,转载请注明出处。

linux的内存available,Linux中available内存的计算相关推荐

  1. linux gdb打印内存命令,gdb中查看内存方法总结

    出自计组第三次上机附加题第二题 用gdb运行程序b,输出中相应地址究竟指向了什么? 请贴上你是如何找到的(使用了什么gdb指令等等) 在查看地址前首先需要断点定位到需要查看的位置 显示代码内容 (gd ...

  2. vs调试c语言检查内存泄露,VisualStudio中检查内存泄露方法

    项目工程中存在内存泄露,被折磨了一晚上,终于查了出来,因为之前没有相关的经验,还比较生疏,在此记录下来,方便以后查找. 对于malloc出的内存的检测方法 这篇文章中详细地记录了从检查到找到确定位置到 ...

  3. android中内存泄露,Android中的内存泄露

    编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...

  4. java 内存溢出和内存泄漏_JAVA中的内存溢出和内存泄漏有很大的区别

    JAVA中的内存溢出和内存泄漏分别是什么,有什么联系和区别,我谈谈自己的理解. 内存泄漏(memory leak ):申请了内存不释放,比如100m的内存,分配了10m的内存一直不回收,那么可以用的内 ...

  5. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理

    java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...

  6. java imageio 内存问题_java中的内存泄漏ImageIO.read()

    我正在使用ImageIO.read().这是由原始应用的主要方法调用的类是这样的:java中的内存泄漏ImageIO.read() import java.awt.*; import javax.sw ...

  7. java static内存泄漏_Java中的内存泄漏

    内存泄漏是指不再使用的对象持续占有内存空间而得不到及时释放,从而造成内存空间的浪费称为内存泄漏.比如,长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是 ...

  8. java final内存机制_Java中的内存处理机制和final、static、final static总结

    装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...

  9. python的内存机制_python中的内存机制

    首先要明白对象和引用的概念 (例子:a=1, a为引用,1为对象,对象1的引用计数器为1,b=1此时内存中只有一个对象1,a,b都为引用,对象的引用计数器此时为2,因为有两个引用) a=1,b=1id ...

  10. KSM(Kernel Samepage Merging) 剖析:Linux 内核中的内存去耦合

    简介:作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging)  允许这个系统管理程序通过 ...

最新文章

  1. “面试不败计划“:hibernate和mybatis比较
  2. shell自动安装mysql_RPM包安装mysql,采用shell脚本实现自动安装、配置与卸载
  3. 25 个精美的后台管理界面模板和布局
  4. Spring Cloud Alibaba——Nacos实现服务治理
  5. Java Web-面试题
  6. jenkins访问地址_运维机器人hubot集成jenkins
  7. SuperMap.IS.AjaxScript之常用功能实现研究及使用
  8. Javascript数组函数库
  9. CSS-背景 超链接
  10. SECS/GEM通信
  11. Ribbon界面开发(C++)
  12. Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  13. SpringBoot 集成 logBack
  14. jupyter保存py格式
  15. BookCollectionSoftware - 图书管理(知识点糅合::类,对象,抽象类,接口,封装,继承,多态,顺序表)- java - 细节狂魔
  16. 原来Vinted注册这么简单!Vinted注册保姆级教程分享
  17. 【 网工在线画拓扑,赶紧保存收藏!】
  18. 用于Brain Runners电子游戏的改进SmallNet脑电解码分类
  19. springboot成都大学校园植物网站毕业设计-附源码181557
  20. 北大计算机专业高考分数线,2017年高考北大分数线是多少

热门文章

  1. Office文档忘保存了?办公必学技能:快速找回未保存的文档
  2. uniapp 获取当前位置
  3. 结构方程模型amos中介效应与调节效应
  4. 程序员中的明星,超模or女团都是程序媛
  5. 微信电脑多开,骚操作走起
  6. 弘辽科技:淘宝评分飘绿四大原因及快速提高评分之解决技巧
  7. WebRoot目录和WebContent目录的区别
  8. C语言调用pow( )函数实现幂运算
  9. 【Unity3D】动态路障导航
  10. 自组织映射神经网络(SOM)