http://mp.weixin.qq.com/s/BixMISiPz3sR9FDNfVSJ6wlinux
本文解释swappiness的做用,以及swappiness=0究竟意味着什么。git
内存回收算法
咱们都知道,Linux一个进程使用的内存分为2种:windows
file-backed pages(有文件背景的页面,好比代码段、好比read/write方法读写的文件、好比mmap读写的文件;他们有对应的硬盘文件,所以若是要交换,能够直接和硬盘对应的文件进行交换),此部分页面进page cacheapp
anonymous pages(匿名页,如stack,heap,CoW后的数据段等;他们没有对应的硬盘文件,所以若是要交换,只能交换到虚拟内存-swapfile或者Linux的swap硬盘分区),此部分页面,若是系统内存不充分,能够被swap到swapfile或者硬盘的swap分区ide
所以,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-01pagefile.sys是个系统文件(在Windows 98下为Win386.swp),它的大小常常本身发生变更,小的时候可能只有几十兆,大的时候则有数百兆,因此没必要怀疑,pagefile.sys是 Windows下的一个虚拟内存,它的做用与物理内存基本类似,但它是做为物理内存的“后备力量”而存在的,也就是说,只有在物理内存已经不够使用的时候,它才会发挥做用。咱们都知道,虽然在运行速度上硬盘不如内存,但在容量上内存是没法与硬盘相提并论的。当运行一个程序须要大量数据、占用大量内存时,内存就会被“塞满”,并将那些暂时不用的数据放到硬盘中,而这些数据所占的空间就是虚拟内存。是"虚拟内存"文件,也叫"页面文件",能够右键单击“个人电脑”→属性→高级→性能 设置→高级→虚拟内存 更改→选择虚拟内存(页面文件)存放的分区,看设置到了哪一个分区,将另外一个删除.虚拟内存文件,windows在操做的过程当中,可能会把物理内存用光,这时虚拟内存就能够当物理内存来使用,就像是在用物理内存同样。不推荐不设置虚拟内存,这样会引响系统运行的效率。合理的设置虚拟内存的大小对运行效率颇有帮助,通常虚拟内存的大小设置成物理内存大小的2.5倍。