Linux性能優化實戰學習筆記:第十九講

1、Swap 原理

前面提到,Swap 說白了就是把一塊磁盤空間或者一個本地文件(如下講解以磁盤爲例),當成內存來使用。它包括換出和換入兩個過程node

一、所謂換出

就是把進程暫時不用的內存數據存儲到磁盤中,並釋放這些數據佔用的內存。緩存

二、換入

則是在進程再次訪問這些內存的時候,把它們從磁盤讀到內存中來bash

因此你看,Swap 實際上是把系統的可用內存變大了。這樣,即便服務器的內存不足,也能夠運行大內存的應用程序服務器

三、應用場景

便是內存不足時,有些程序也並不像被OOM殺死,二十但願能緩一段時間,等待人工介入,或者等系統自動釋放其餘程序的內存,再分配給它(能夠給運維人員處理故障一個緩衝的時間)架構

常見的筆記本電腦休眠和快速開機的功能,也基於Swap ,休眠時,把系統內存存入磁盤,這樣等到再次開機時,只要從磁盤中加載內存就能夠,這樣就省去了不少應用程序的初始化過程,加快了開機速度app

2、那麼 Linux 到底在何時須要回收內存呢?

一、直接內存回收

有新的大塊內存分配請求,可是剩餘內存不足,這個時候系統就須要回收一部份內存(好比前面提到的緩存),進而儘量地知足新內存請求,這個過程被稱爲直接內存回收運維

二、kswapd0(按期回收內存)

一、剩餘內存頁<最小閾值

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 

3、爲何剩餘內存不少的狀況下,也會發生 Swap 呢?

這正是處理器的 NUMA (Non-Uniform Memory Access)架構致使的。

在 NUMA 架構下,多個處理器被劃分到不一樣 Node 上,且每一個 Node 都擁有本身的本地內存空間。

而通一個Node內部的內存空間實際上能夠進一步分爲不一樣的內存域。好比直接內存訪問區域、普通內存區,僞內存去等以下圖所示

一、經過numactl查詢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

一、NUMA和swap什麼關係?

一、三個內存閾值(頁最小閾值、頁低閾值和頁高閾值)查詢

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,分別是活躍和非活躍的文件頁數

從這個輸出結果能夠發現,剩餘內存遠大於高閾值,因此此時的不會回收內存

二、Node尋找空閒內存仍是本地內存中回收內存?

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

相關文章
相關標籤/搜索