下圖是HBase官方文檔上對(duì)操作系統(tǒng)環(huán)境的幾點(diǎn)配置要求:
1、關(guān)閉透明大頁(yè)
echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled
echo 'never' >/sys/kernel/mm/transparent_hugepage/defrag
//這一步是需要加入到開(kāi)機(jī)自啟動(dòng)中,才可以關(guān)閉的
//THP是一種動(dòng)態(tài)管理策略,會(huì)在運(yùn)行期分配管理大頁(yè),因此會(huì)有一定程度的分配延時(shí),這對(duì)追求響應(yīng)延時(shí)的數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō)不可接受。TPH關(guān)閉場(chǎng)景下(never)HBase性能最優(yōu),比較穩(wěn)定。而THP開(kāi)啟的場(chǎng)景(always),性能相比關(guān)閉的場(chǎng)景有30%左右的下降,而且曲線抖動(dòng)很大??梢?jiàn),HBase線上切記要關(guān)閉THP。
2、set vm.swappiness = 0 //這里要設(shè)置成0
//禁止交換(可選),內(nèi)存頁(yè)面交換在某些情況下會(huì)導(dǎo)致CDH 性能下降
[root@cloudera01 parcels513.el7]# echo vm.swappiness=1 >> /etc/sysctl.conf
[root@cloudera01 parcels513.el7]# sysctl -p
vm.swappiness = 1
//具體含義解釋為:
swappiness,這個(gè)值用來(lái)定義內(nèi)核使用swap的積極程度,值越高,內(nèi)核就會(huì)積極地使用swap,值越低,就會(huì)降低對(duì)swap的使用積極性。該值取值范圍在0~100,默認(rèn)是60。
對(duì)于數(shù)據(jù)庫(kù)來(lái)講,swap是盡量需要避免的,所以需要將其設(shè)置為1。此處需要注意,設(shè)置為1并不代表不執(zhí)行swap哦!
提示:
swappiness的值的大小對(duì)如何使用swap分區(qū)是有著很大的聯(lián)系的。先前,人們建議把vm.swapiness設(shè)置為0,它意味著“除非發(fā)生內(nèi)存益處,否則不要進(jìn)行內(nèi)存交換”。直到Linux內(nèi)核3.5-rcl版本發(fā)布,這個(gè)值的意義才發(fā)生了變化。這個(gè)變化被一直到其他的發(fā)行版本上,包括RedHat企業(yè)版內(nèi)核2.6.32-303。在發(fā)生變化之后,0意味著“在任何情況下都不要發(fā)生交換”。所以現(xiàn)在建議把這個(gè)值設(shè)置為1。swappiness=100的時(shí)候表示積極的使用swap分區(qū),并且把內(nèi)存上的數(shù)據(jù)及時(shí)的搬運(yùn)到swap空間里面。
3、set vm.min_free_kbytes to least 1GB(8GB on larger memory systems)
//該文件表示強(qiáng)制Linux VM最低保留多少空閑內(nèi)存(Kbytes)。 //代表系統(tǒng)所保留空閑內(nèi)存的最低限
官方文檔中要求min_free_kbytes不能小于1G(在大內(nèi)存系統(tǒng)中設(shè)置8G),就是不要輕易觸發(fā)直接回收。
當(dāng)可用內(nèi)存低于這個(gè)參數(shù)時(shí),系統(tǒng)開(kāi)始回收cache內(nèi)存,以釋放內(nèi)存,直到可用內(nèi)存大于這個(gè)值。
vm.min_free_kbytes=409600;
vm.vfs_cache_pressure=200;
vm.swappiness=40。
調(diào)整MIN_FREE_KBYTES的目的是保持物理內(nèi)存有足夠的空閑空間,防止突發(fā)性的換頁(yè)。
swapiness缺省為60,減少swapiness會(huì)使系統(tǒng)盡快通過(guò)swapout不使用的進(jìn)程資源來(lái)釋放更多的物理內(nèi)存。
vfs_cache_pressure的缺省值是100,加大這個(gè)參數(shù)設(shè)置了虛擬內(nèi)存回收directory和i-node緩沖的傾向,這個(gè)值越大,回收的傾向越嚴(yán)重。調(diào)整這3個(gè)參數(shù)的目的就是讓操作系統(tǒng)在平時(shí)就盡快回收緩沖,釋放物理內(nèi)存,這樣就可以避免突發(fā)性的大規(guī)模換頁(yè)。
https://blog.csdn.net/hanyingzhong/article/details/71637391?utm_source=blogxgwz0
具體操作如下:
[root@NewCDH-0--141 ~]# cat /proc/sys/vm/min_free_kbytes //原來(lái)的
67584
[root@NewCDH-0--141 ~]# cat /proc/sys/vm/min_free_kbytes //設(shè)置成
1048576
[root@NewCDH-0--141 ~]# ll /proc/sys/vm/|wc -l
42
4、disable numa zone reclaim with vm.zone_reclaim_mode = 0
//官方建議把vm.zone_reclaim_mode = 0 設(shè)置成0
[root@NewCDH-0--141 vm]# cat /proc/sys/vm/zone_reclaim_mode //這個(gè)參數(shù)系統(tǒng)默認(rèn)就是0
0
//UMA是什么?NUMA和swap有什么關(guān)系?zone_reclaim_mode的具體意義?
zone_reclaim_mode,這個(gè)參數(shù)定義了NUMA架構(gòu)下不同的內(nèi)存回收策略,可以取值0/1/3/4,其中0表示在local內(nèi)存不夠用的情況下可以去其他的內(nèi)存區(qū)域分配內(nèi)存;1表示在local內(nèi)存不夠用的情況下本地先回收再分配;3表示本地回收盡可能先回收文件緩存對(duì)象;4表示本地回收優(yōu)先使用swap回收匿名內(nèi)存。
專注于為中小企業(yè)提供網(wǎng)站制作、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)昌邑免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
swap是干什么的?
SWAP意思是交換,顧名思義,當(dāng)某進(jìn)程向OS請(qǐng)求內(nèi)存發(fā)現(xiàn)不足時(shí),OS會(huì)把內(nèi)存中暫時(shí)不用的數(shù)據(jù)交換出去,放在SWAP分區(qū)中,這個(gè)過(guò)程稱為SWAP OUT。當(dāng)某進(jìn)程又需要這些數(shù)據(jù)且OS發(fā)現(xiàn)還有空閑物理內(nèi)存時(shí),又會(huì)把SWAP分區(qū)中的數(shù)據(jù)交換回物理內(nèi)存中,這個(gè)過(guò)程稱為SWAP IN。
當(dāng)然,swap大小是有上限的,一旦swap使用完,操作系統(tǒng)會(huì)觸發(fā)OOM-Killer機(jī)制,把消耗內(nèi)存最多的進(jìn)程kill掉以釋放內(nèi)存。
顯然,swap機(jī)制的初衷是為了緩解物理內(nèi)存用盡而選擇直接粗暴OOM進(jìn)程的尷尬。
數(shù)據(jù)庫(kù)系統(tǒng)為什么嫌棄swap?
1、數(shù)據(jù)庫(kù)系統(tǒng)一般都對(duì)響應(yīng)延遲比較敏感,如果使用swap代替內(nèi)存,數(shù)據(jù)庫(kù)服務(wù)性能必然不可接受。
2、對(duì)于響應(yīng)延遲極其敏感的系統(tǒng)來(lái)講,延遲太大和服務(wù)不可用沒(méi)有任何區(qū)別,比服務(wù)不可用更嚴(yán)重的是,swap場(chǎng)景下進(jìn)程就是不死,這就意味著系統(tǒng)一直不可用……再想想如果不使用swap直接oom,是不是一種更好的選擇,這樣很多高可用系統(tǒng)直接會(huì)主從切換掉,用戶基本無(wú)感知。
3、 另外對(duì)于諸如HBase這類分布式系統(tǒng)來(lái)說(shuō),其實(shí)并不擔(dān)心某個(gè)節(jié)點(diǎn)宕掉,而恰恰擔(dān)心某個(gè)節(jié)點(diǎn)夯住。
4、一個(gè)節(jié)點(diǎn)宕掉,最多就是小部分請(qǐng)求短暫不可用,重試即可恢復(fù)。但是一個(gè)節(jié)點(diǎn)夯住會(huì)將所有分布式請(qǐng)求都夯住,服務(wù)器端線程資源被占用不放,導(dǎo)致整個(gè)集群請(qǐng)求阻塞,甚至集群被拖垮。
swap的工作機(jī)制
既然數(shù)據(jù)庫(kù)們對(duì)swap不待見(jiàn),那是不是就要使用swapoff命令關(guān)閉磁盤緩存特性呢?非也
HBase官方文檔的幾點(diǎn)要求實(shí)際上就是落實(shí)這個(gè)方針:盡可能降低swap影響。知己知彼才能百戰(zhàn)不殆,要降低swap影響就必須弄清楚Linux內(nèi)存回收是怎么工作的,這樣才能不遺漏任何可能的疑點(diǎn)。
先來(lái)看看swap是如何觸發(fā)的?
Linux會(huì)在兩種場(chǎng)景下觸發(fā)內(nèi)存回收,
1、一種是在內(nèi)存分配時(shí)發(fā)現(xiàn)沒(méi)有足夠空閑內(nèi)存時(shí)會(huì)立刻觸發(fā)內(nèi)存回收;
2、一種是開(kāi)啟了一個(gè)守護(hù)進(jìn)程(swapd進(jìn)程)周期性對(duì)系統(tǒng)內(nèi)存進(jìn)行檢查,在可用內(nèi)存降低到特定閾值之后主動(dòng)觸發(fā)內(nèi)存回收。
Linux內(nèi)存回收對(duì)象主要分為兩種:
找到MySQL服務(wù)器發(fā)生SWAP罪魁禍?zhǔn)? https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=2653929537&idx=1&sn=3fad622f505175d9ca8399cfb14b925f&chksm=bd3b5a2b8a4cd33d0bd75078614106ee4065b732684fb949d7477f45af56ae8be0a472fc75b1#rd
https://weibo.com/1680980510/EmvG57wVL?type=comment
物理內(nèi)存還有不少空閑,但把swap都耗盡了。
絕大多數(shù)情況是因?yàn)闆](méi)有關(guān)閉NUMA引起的。在運(yùn)行數(shù)據(jù)庫(kù)進(jìn)程的服務(wù)器上,強(qiáng)烈建議關(guān)閉NUMA,
解決方法:
由于服務(wù)器硬件、系統(tǒng)設(shè)置不當(dāng),沒(méi)有關(guān)閉NUMA,導(dǎo)致發(fā)生SWAP。建議方案有:
在BIOS設(shè)置層面關(guān)閉NUMA,缺點(diǎn)是需要重啟OS;
或修改GRUB配置文件,缺點(diǎn)也是要重啟OS;
升級(jí)MySQL版本到5.6.27及以后,新增了一個(gè)選項(xiàng) innodb_numa_interleave,只需要重啟mysqld實(shí)例,無(wú)需重啟OS,推薦此方案。
以上部分在 Linux 初始化腳本 (centos6 centos7 通用)https://blog.51cto.com/12445535/2362407 中提到
參考鏈接為:http://hbasefly.com/2017/05/24/hbase-linux/