前面提到,Swap 說白了就是把一塊磁盤空間或者一個本地文件(如下講解以磁盤爲例),當成內存來使用。它包括換出和換入兩個過程node
就是把進程暫時不用的內存數據存儲到磁盤中,並釋放這些數據佔用的內存。緩存
則是在進程再次訪問這些內存的時候,把它們從磁盤讀到內存中來bash
因此你看,Swap 實際上是把系統的可用內存變大了。這樣,即便服務器的內存不足,也能夠運行大內存的應用程序服務器
便是內存不足時,有些程序也並不像被OOM殺死,二十但願能緩一段時間,等待人工介入,或者等系統自動釋放其餘程序的內存,再分配給它(能夠給運維人員處理故障一個緩衝的時間)架構
常見的筆記本電腦休眠和快速開機的功能,也基於Swap ,休眠時,把系統內存存入磁盤,這樣等到再次開機時,只要從磁盤中加載內存就能夠,這樣就省去了不少應用程序的初始化過程,加快了開機速度app
有新的大塊內存分配請求,可是剩餘內存不足,這個時候系統就須要回收一部份內存(好比前面提到的緩存),進而儘量地知足新內存請求,這個過程被稱爲直接內存回收運維
root@openstack:~# free -h total used free shared buff/cache available Mem: 4.9G 114M 4.0G 992K 770M 4.5G Swap: 3.9G 0B 3.9G root@openstack:~# cat /proc/sys/vm/min_free_kbytes 67584
說明進程可用內存都耗盡了,只有內核才能夠分配內存spa
內存壓力比較大,剩餘內存很少了,這是kswapd0會執行內存回收,直接剩餘內存大於高閾值爲止orm
說明有必定壓力,但還能夠知足新內存請求blog
說明剩餘內存比較多,沒有內存壓力
watch -d grep -A 15 'Normal' /proc/zoneinfo Every 2.0s: grep -A 15 Normal /proc/zoneinfo openstack: Wed Feb 6 08:45:01 2019 Node 0, zone Normal pages free 146583 min 4986 low 6232 high 7478 spanned 399872 present 399872 managed 373102 protection: (0, 0, 0, 0, 0) nr_free_pages 146583 nr_zone_inactive_anon 35 nr_zone_active_anon 11422 nr_zone_inactive_file 64699 nr_zone_active_file 120441 nr_zone_unevictable 1352 nr_zone_write_pending 0
這正是處理器的 NUMA (Non-Uniform Memory Access)架構致使的。
在 NUMA 架構下,多個處理器被劃分到不一樣 Node 上,且每一個 Node 都擁有本身的本地內存空間。
而通一個Node內部的內存空間實際上能夠進一步分爲不一樣的內存域。好比直接內存訪問區域、普通內存區,僞內存去等以下圖所示
root@openstack:~# numactl --hardware available: 1 nodes (0) node 0 cpus: 0 1 node 0 size: 4976 MB node 0 free: 4088 MB node distances: node 0 0: 10
cat /proc/zoneinfo Node 0, zone Normal pages free 146583 min 4986 low 6232 high 7478 spanned 399872 present 399872 managed 373102 protection: (0, 0, 0, 0, 0) nr_free_pages 146583 nr_zone_inactive_anon 35 nr_zone_active_anon 11422 nr_zone_inactive_file 64699 nr_zone_active_file 120441 nr_zone_unevictable 1352 nr_zone_write_pending 0
一、pages 處的 min、low、high,就是上面提到的三個內存閾值,而 free 是剩餘內存頁數,它跟後面的nr_free_pages 相同
二、nr_zone_active_anon 和 nr_zone_inactive_anon,分別是活躍和非活躍的一名頁數
三、nr_zone_active_file 和 nr_zone_inactive_anon,分別是活躍和非活躍的文件頁數
從這個輸出結果能夠發現,剩餘內存遠大於高閾值,因此此時的不會回收內存
root@openstack:~# cat /proc/sys/vm/zone_reclaim_mode 0
默認的0,也就是剛剛提到的模式,表示既能夠從其餘Node尋找空閒內存,也能夠從本地回收內存
一、一、二、4都表示只回收本地內存,
二、2表示能夠回寫髒數據回收內存
三、4表示能夠用方式回收
固然就是直接回收緩存,或者把髒頁寫回磁盤後再回收
其實就是經過 Swap 機制,把它們寫入磁盤後再釋放內存
root@openstack:~# cat /proc/sys/vm/swappiness 60
swappiness 的範圍是 0-100,數值越大,越積極使用Swap,更傾向於回收匿名頁;
也就是更傾向於回收匿名頁;數值越小,越消極使用 Swap,也就是更傾向於回收文件頁
雖然swappiness的範圍是0-100,不過要注意,這並非內存的百分比,而是Swap調整積極程度的權重
即便你把它設置成0,當剩餘內存+文件頁小於也高閾值時,仍是會發生Swap