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