1. 程式人生 > >謹慎調整內核參數:vm.min_free_kbytes

謹慎調整內核參數:vm.min_free_kbytes

可用 done 業務 方式 min nag alloc pre dir

內核參數:內存相關

內存管理從三個層次管理內存,分別是node, zone ,page;

64位的x86物理機內存從高地址到低地址分為: Normal DMA32 DMA.隨著地址降低。

[root@localhost01 /home/ahao.mah]
#cat /proc/zoneinfo  |grep "Node"
Node 0, zone      DMA
Node 0, zone    DMA32
Node 0, zone   Normal
Node 1, zone   Normal

每個zone都有自己的min low high,如下,但是單位是page

[root@localhost01 /home/ahao.mah]
#cat /proc/zoneinfo  |grep "Node 0, zone" -A10
Node 0, zone      DMA
  pages free     3975
        min      20
        low      25
        high     30
        scanned  0
        spanned  4095
        present  3996
        managed  3975
    nr_free_pages 3975
    nr_alloc_batch 5
--
Node 0, zone    DMA32
  pages free     382873
        min      2335
        low      2918
        high     3502
        scanned  0
        spanned  1044480
        present  513024
        managed  450639
    nr_free_pages 382873
    nr_alloc_batch 584
--
Node 0, zone   Normal
  pages free     11105097
        min      61463
        low      76828
        high     92194
        scanned  0
        spanned  12058624
        present  12058624
        managed  11859912
    nr_free_pages 11105097
    nr_alloc_batch 12344
low = 5/4 * min
high = 3/2 * min

[root@localhost01 /home/ahao.mah]
#T=min;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=499 MB

[root@localhost01 /home/ahao.mah]
#T=low;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=624 MB

[root@localhost01 /home/ahao.mah]
#T=high;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=802 MB

min 和 low的區別:

  1. min下的內存是保留給內核使用的;當到達min,會觸發內存的direct reclaim
  2. low水位比min高一些,當內存可用量小於low的時候,會觸發 kswapd回收內存,當kswapd慢慢的將內存 回收到high水位,就開始繼續睡眠

內存回收方式

內存回收方式有兩種,主要對應low ,min

  1. direct reclaim : 觸發min水位線時執行
  2. kswapd reclaim : 觸發low水位線時執行

在el5下有一個參數: vm.extra_free_kbytes

這個參數含義是: low = min_free_kbytes*5/4 + extra_free_kbytes

. 但是在7u下沒有此參數.

[root@localhost02 /root]
#sysctl  -a | grep free
vm.min_free_kbytes = 512000
vm.extra_free_kbytes = 512000
[root@localhost02 /root]
#sysctl  -a | grep free
vm.min_free_kbytes = 512000
vm.extra_free_kbytes = 512000
fs.quota.free_dquots = 0

[root@localhost02 /root]
#T=min;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=499 MB

[root@localhost02 /root]
#T=low;sum=0;for i in `cat /proc/zoneinfo  |grep $T | awk ‘{print $NF}‘`;do sum=`echo "$sum+$i" |bc`;done;sum=`echo "$sum*4/1024" |bc`;echo "sum=${sum} MB"
sum=1124 MB

[root@localhost02 /root]
#echo "499*5/4 + (512000/1024)"| bc
1123

註意

最近有業務線在調大min值得時候導致物理機hang引發故障,得出一些經驗和建議:

  1. 對於線上128G的內存的機器,可以考慮將min設置為512M左右。因為,太大了,可能會導致內存的浪費;當然如果只有40G的物理機,更不要考慮把min設置超過1G了,這樣會導致頻繁的觸發內存回收;具體優化也要根據業務來看。
  2. 關鍵是在於調整內存的內核參數的時候! 調大的風險遠大於調小的風險! 如果有人想將vm.min_free_kbytes 調大,千萬要註意當前的水位,如果一旦調大vm.min_free_kbytes 立刻觸發direct reclaim,可能會導致機器hang住,ping的通,ssh不上,影響業務!hang住的原因是當vm.min_free_kbytes 是512M的時候,此時 free只有1G,此時正常運行,此時如果調大vm.min_free_kbytes 到5G,將會direct reclaim失敗。

謹慎調整內核參數:vm.min_free_kbytes