宋寶華:swappiness=0究竟意味着什么?


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倍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM