http://mp.weixin.qq.com/s/BixMISiPz3sR9FDNfVSJ6w

本文解释swappiness的作用,以及swappiness=0究竟意味着什么。

内存回收

我们都知道,Linux一个进程使用的内存分为2种:

  1. file-backed pages(有文件背景的页面,比如代码段、比如read/write方法读写的文件、比如mmap读写的文件;他们有对应的硬盘文件,因此如果要交换,可以直接和硬盘对应的文件进行交换),此部分页面进page cache

  2. anonymous pages(匿名页,如stack,heap,CoW后的数据段等;他们没有对应的硬盘文件,因此如果要交换,只能交换到虚拟内存-swapfile或者Linux的swap硬盘分区),此部分页面,如果系统内存不充分,可以被swap到swapfile或者硬盘的swap分区

因此,Linux在进行内存回收(memory reclaim)的时候,实际上可以从1类和2类这两种页面里面进行回收,而swappiness就决定了回收这2类页面的优先级。

swappiness越大,越倾向于回收匿名页;swappiness越小,越倾向于回收file-backed的页面。当然,它们的回收方法都是一样的LRU算法。

swappiness=0的历史与现在

在Linux的早期版本(2012年以前的版本,kernel 3.5-rc1),哪怕swappiness被设置为0,其实匿名页仍然有被交换出去的机会:

早先的回收权重是这样计算的:

anon_prio = swappiness;

file_prio = 200 - anon_prio;

ap = (anon_prio + 1) * (reclaim_stat->recent_scanned[0] + 1);

fp = (file_prio + 1) * (reclaim_stat->recent_scanned[1] + 1);

由此可看出,哪怕swappiness为0,ap也是不会为0的,只是比较小。所以swappiness=0不意味着匿名页就不交换。

2012年的第一场雪,比以往时候来得更晚一些

这一年,一个小小的提交,引发了蝴蝶效应,并震惊寰宇:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fe35004fbf9eaf67482b074a2e032abb9c89b1dd

它彻底改变了swappiness=0的定义。这个commit,碧血横飞,浩气四塞,草木为之含悲,风云因而变色。

它的意思再明确不过,如果swappiness=0,除非系统的内存过小(nr_free + nr_filebacked < high watermark)这种恶劣情况发生,

都只是考虑交换file-backed的pages,就不会考虑交换匿名页了。

它改动的代码如下:

-ap = (anon_prio + 1) * (reclaim_stat->recent_scanned[0] + 1);

+ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1);

ap /= reclaim_stat->recent_rotated[0] + 1;

-fp = (file_prio + 1) * (reclaim_stat->recent_scanned[1] + 1);

+fp = file_prio * (reclaim_stat->recent_scanned[1] + 1);

anon_prio如果为0的话,ap也为0了。

于是乎,现在的swappiness如果等于0的话,意味着哪怕匿名页占据的内存很大,哪怕swap分区还有很多的剩余空间,除非恶劣情况发生,都不会交换匿名页,因此这可能造成更大的OOM压力。不像以前,平时会一直兼顾着回收page cache和匿名页。

现在swappiness=0的情况下,天平的格局是:

一石激起千层浪,两指弹出万般音。相关社区的网站内容都跟着进行了更新,比如红帽子:

特洛伊之战中,在决定阿基琉斯和赫克托尔的命运的生死一战中,荷马将命运的天平放在宙斯手中:“天父取出他的那杆黄金天秤,把两个悲惨的死亡判决放进秤盘,一个属阿基琉斯,一个属驯马的赫克托尔,他提起秤杆中央,赫克托尔一侧下倾,滑向哈得斯。”

跨过特洛伊木马屠城千年的悲凉,我们看到Linux里面两位战神的命运,被一个码农轻松地决定。

这个修改引起了一系列的连锁反应,而相关的文档修改,却是发生在2年之后:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8582cb96b0bfd6891766d8c30d759bf21aad3b4d

MEM CGroup里面的swappiness

在使能Memory CGroup的情况下,每个memory group可以设置自己的swappiness值,如果某个group的swappiness被设置为0,这个group的匿名页交换会被完全禁止,从而诱发该group在无file-backed页面可回收情况下(哪怕swap空间还很大)的OOM,这一点透过Documentation/cgroup-v1/memory.txt文档可以看出:

5.3 swappiness

Overrides /proc/sys/vm/swappiness for the particular group. The tunable in the root cgroup corresponds to the global swappiness setting.

Please note that unlike during the global reclaim, limit reclaim enforces that 0 swappiness really prevents from any swapping even if there is a swap storage available. This might lead to memcg OOM killer if there are no file pages to reclaim.

Windows中pagefile.sys文件的作用
Fun.W 51CTO.com 2007-02-01
pagefile.sys是个系统文件(在Windows 98下为Win386.swp),它的大小经常自己发生变动,小的时候可能只有几十兆,大的时候则有数百兆,所以不必怀疑,pagefile.sys是 Windows下的一个虚拟内存,它的作用与物理内存基本相似,但它是作为物理内存的“后备力量”而存在的,也就是说,只有在物理内存已经不够使用的时候,它才会发挥作用。我们都知道,虽然在运行速度上硬盘不如内存,但在容量上内存是无法与硬盘相提并论的。当运行一个程序需要大量数据、占用大量内存时,内存就会被“塞满”,并将那些暂时不用的数据放到硬盘中,而这些数据所占的空间就是虚拟内存。
是"虚拟内存"文件,也叫"页面文件",可以右键单击“我的电脑”→属性→高级→性能 设置→高级→虚拟内存 更改→选择虚拟内存(页面文件)存放的分区,看设置到了哪个分区,将另一个删除.虚拟内存文件,windows在操作的过程中,可能会把物理内存用光,这时虚拟内存就可以当物理内存来使用,就像是在用物理内存一样。不推荐不设置虚拟内存,这样会引响系统运行的效率。合理的设置虚拟内存的大小对运行效率很有帮助,一般虚拟内存的大小设置成物理内存大小的2.5倍。

宋宝华:swappiness=0究竟意味着什么?的更多相关文章

  1. 宋宝华: 关于Linux进程优先级数字混乱的彻底澄清

    宋宝华: 关于Linux进程优先级数字混乱的彻底澄清 原创: 宋宝华 Linux阅码场 9月20日 https://mp.weixin.qq.com/s/44Gamu17Vkl77OGV2KkRmQ ...

  2. 宋宝华:关于Ftrace的一个完整案例

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) Ftrace简介 Ftrace是Lin ...

  3. 宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前言 <设计模式>这本经典 ...

  4. 宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  5. 宋宝华:关于ARM Linux原子操作的实现

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 竞态无所不在 首先我们要理解竞态(ra ...

  6. 宋宝华:Docker 最初的2小时(Docker从入门到入门)

    本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 最初的2小时,你会爱上Docker, ...

  7. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)--宋宝华

    http://blog.csdn.net/21cnbao/article/details/45322629

  8. 宋宝华:关于Ftrace的一个完整案例【转】

    Ftrace简介 Ftrace是Linux进行代码级实践分析最有效的工具之一,比如我们进行一个系统调用,出来的时间过长,我们想知道时间花哪里去了,利用Ftrace就可以追踪到一级级的时间分布. Ftr ...

  9. 宋宝华:Docker 最初的2小时(Docker从入门到入门)【转】

    最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学 ...

随机推荐

  1. Java的native关键字

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...

  2. spring扩展点之四:Spring Aware容器感知技术,BeanNameAware和BeanFactoryAware接口,springboot中的EnvironmentAware

    aware:英 [əˈweə(r)] 美 [əˈwer] adj.意识到的;知道的;觉察到的 XXXAware在spring里表示对XXX感知,实现XXXAware接口,并通过实现对应的set-XXX ...

  3. 1.Apache+Tomcat负载均衡+集群配置

    1.本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是 ...

  4. 恢复到版本并销毁之后的git提交记录

    git reset --hard HEAD~1(或者你想要的版本号) git push --force # 千万注意:此操作无法恢复

  5. ObjectInputStream缓存数据

    DataManager /** * 本地数据的存储 * @author Administrator * */ public class DataManager { private static fin ...

  6. 17_点击事件第四种写法_布局文件添加onclick属性

    尽量不要用第四种点击事件的写法.在一万多行代码中发现了一个没被调用的代码 public void call(View v){//第四种写法参数一定是View v //public void call( ...

  7. Ubuntu 解决:当执行`sudo apt-get update`命令时 出现的 “apt-get 404 Not Found Package Repository Errors” 问题

    Ubuntu 解决:当执行sudo apt-get update或者sudo apt-get install命令是出现的 "apt-get 404 Not Found Package Rep ...

  8. 20. Linux提权:从入门到放弃

    几点前提 已经拿到低权shell 被入侵的机器上面有nc,python,perl等linux非常常见的工具 有权限上传文件和下载文件 内核漏洞提权 提到脏牛,运维流下两行眼泪,我们留下两行鼻血.内核漏 ...

  9. Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)

    题目链接 C. Hacking Cyphertime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...

  10. SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协议

    为什么你要使用自定义协议? 通信协议用于将接收到的二进制数据转化成您的应用程序可以理解的请求. SuperSocket提供了一个内置的通信协议“命令行协议”定义每个请求都必须以回车换行"\r ...