謹慎調整內核參數:vm.min_free_kbytes
阿新 • • 發佈:2017-12-22
可用 done 業務 方式 min nag alloc pre dir 在el5下有一個參數:
. 但是在7u下沒有此參數.
內核參數:內存相關
內存管理從三個層次管理內存,分別是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的區別:
- min下的內存是保留給內核使用的;當到達min,會觸發內存的direct reclaim
- low水位比min高一些,當內存可用量小於low的時候,會觸發 kswapd回收內存,當kswapd慢慢的將內存 回收到high水位,就開始繼續睡眠
內存回收方式
內存回收方式有兩種,主要對應low ,min
- direct reclaim : 觸發min水位線時執行
- kswapd reclaim : 觸發low水位線時執行
在el5下有一個參數: vm.extra_free_kbytes
這個參數含義是: low = min_free_kbytes*5/4 + extra_free_kbytes
[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引發故障,得出一些經驗和建議:
- 對於線上128G的內存的機器,可以考慮將min設置為512M左右。因為,太大了,可能會導致內存的浪費;當然如果只有40G的物理機,更不要考慮把min設置超過1G了,這樣會導致頻繁的觸發內存回收;具體優化也要根據業務來看。
- 關鍵是在於調整內存的內核參數的時候! 調大的風險遠大於調小的風險! 如果有人想將
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