/sys/kernel/mm/transparent_hugepage/enabledecho never >/sys/kernel/m..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

hbase 服務(wù)器優(yōu)化之硬件優(yōu)化(用好操作系統(tǒng))

發(fā)布時間:2020-07-14 06:42:45 來源:網(wǎng)絡(luò) 閱讀:1216 作者:馬吉輝 欄目:大數(shù)據(jù)

下圖是HBase官方文檔上對操作系統(tǒng)環(huán)境的幾點(diǎn)配置要求:
1、關(guān)閉透明大頁
echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled
echo 'never' >/sys/kernel/mm/transparent_hugepage/defrag
//這一步是需要加入到開機(jī)自啟動中,才可以關(guān)閉的
//THP是一種動態(tài)管理策略,會在運(yùn)行期分配管理大頁,因此會有一定程度的分配延時,這對追求響應(yīng)延時的數(shù)據(jù)庫系統(tǒng)來說不可接受。TPH關(guān)閉場景下(never)HBase性能最優(yōu),比較穩(wěn)定。而THP開啟的場景(always),性能相比關(guān)閉的場景有30%左右的下降,而且曲線抖動很大??梢姡琀Base線上切記要關(guān)閉THP。
2、set vm.swappiness = 0 //這里要設(shè)置成0
//禁止交換(可選),內(nèi)存頁面交換在某些情況下會導(dǎo)致CDH 性能下降
[root@cloudera01 parcels513.el7]# echo vm.swappiness=1 >> /etc/sysctl.conf
[root@cloudera01 parcels513.el7]# sysctl -p
vm.swappiness = 1
//具體含義解釋為:
swappiness,這個值用來定義內(nèi)核使用swap的積極程度,值越高,內(nèi)核就會積極地使用swap,值越低,就會降低對swap的使用積極性。該值取值范圍在0~100,默認(rèn)是60。
對于數(shù)據(jù)庫來講,swap是盡量需要避免的,所以需要將其設(shè)置為1。此處需要注意,設(shè)置為1并不代表不執(zhí)行swap哦!
提示:
swappiness的值的大小對如何使用swap分區(qū)是有著很大的聯(lián)系的。先前,人們建議把vm.swapiness設(shè)置為0,它意味著“除非發(fā)生內(nèi)存益處,否則不要進(jìn)行內(nèi)存交換”。直到Linux內(nèi)核3.5-rcl版本發(fā)布,這個值的意義才發(fā)生了變化。這個變化被一直到其他的發(fā)行版本上,包括RedHat企業(yè)版內(nèi)核2.6.32-303。在發(fā)生變化之后,0意味著“在任何情況下都不要發(fā)生交換”。所以現(xiàn)在建議把這個值設(shè)置為1。swappiness=100的時候表示積極的使用swap分區(qū),并且把內(nèi)存上的數(shù)據(jù)及時的搬運(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)存低于這個參數(shù)時,系統(tǒng)開始回收cache內(nèi)存,以釋放內(nèi)存,直到可用內(nèi)存大于這個值。
vm.min_free_kbytes=409600;
vm.vfs_cache_pressure=200;
vm.swappiness=40。
調(diào)整MIN_FREE_KBYTES的目的是保持物理內(nèi)存有足夠的空閑空間,防止突發(fā)性的換頁。
swapiness缺省為60,減少swapiness會使系統(tǒng)盡快通過swapout不使用的進(jìn)程資源來釋放更多的物理內(nèi)存。
vfs_cache_pressure的缺省值是100,加大這個參數(shù)設(shè)置了虛擬內(nèi)存回收directory和i-node緩沖的傾向,這個值越大,回收的傾向越嚴(yán)重。調(diào)整這3個參數(shù)的目的就是讓操作系統(tǒng)在平時就盡快回收緩沖,釋放物理內(nèi)存,這樣就可以避免突發(fā)性的大規(guī)模換頁。
https://blog.csdn.net/hanyingzhong/article/details/71637391?utm_source=blogxgwz0
具體操作如下:
[root@NewCDH-0--141 ~]# cat /proc/sys/vm/min_free_kbytes //原來的
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 //這個參數(shù)系統(tǒng)默認(rèn)就是0
0
//UMA是什么?NUMA和swap有什么關(guān)系?zone_reclaim_mode的具體意義?
zone_reclaim_mode,這個參數(shù)定義了NUMA架構(gòu)下不同的內(nèi)存回收策略,可以取值0/1/3/4,其中0表示在local內(nèi)存不夠用的情況下可以去其他的內(nèi)存區(qū)域分配內(nèi)存;1表示在local內(nèi)存不夠用的情況下本地先回收再分配;3表示本地回收盡可能先回收文件緩存對象;4表示本地回收優(yōu)先使用swap回收匿名內(nèi)存。

swap是干什么的?
SWAP意思是交換,顧名思義,當(dāng)某進(jìn)程向OS請求內(nèi)存發(fā)現(xiàn)不足時,OS會把內(nèi)存中暫時不用的數(shù)據(jù)交換出去,放在SWAP分區(qū)中,這個過程稱為SWAP OUT。當(dāng)某進(jìn)程又需要這些數(shù)據(jù)且OS發(fā)現(xiàn)還有空閑物理內(nèi)存時,又會把SWAP分區(qū)中的數(shù)據(jù)交換回物理內(nèi)存中,這個過程稱為SWAP IN。
當(dāng)然,swap大小是有上限的,一旦swap使用完,操作系統(tǒng)會觸發(fā)OOM-Killer機(jī)制,把消耗內(nèi)存最多的進(jìn)程kill掉以釋放內(nèi)存。
顯然,swap機(jī)制的初衷是為了緩解物理內(nèi)存用盡而選擇直接粗暴OOM進(jìn)程的尷尬。

數(shù)據(jù)庫系統(tǒng)為什么嫌棄swap?
1、數(shù)據(jù)庫系統(tǒng)一般都對響應(yīng)延遲比較敏感,如果使用swap代替內(nèi)存,數(shù)據(jù)庫服務(wù)性能必然不可接受。
2、對于響應(yīng)延遲極其敏感的系統(tǒng)來講,延遲太大和服務(wù)不可用沒有任何區(qū)別,比服務(wù)不可用更嚴(yán)重的是,swap場景下進(jìn)程就是不死,這就意味著系統(tǒng)一直不可用……再想想如果不使用swap直接oom,是不是一種更好的選擇,這樣很多高可用系統(tǒng)直接會主從切換掉,用戶基本無感知。
3、 另外對于諸如HBase這類分布式系統(tǒng)來說,其實(shí)并不擔(dān)心某個節(jié)點(diǎn)宕掉,而恰恰擔(dān)心某個節(jié)點(diǎn)夯住。
4、一個節(jié)點(diǎn)宕掉,最多就是小部分請求短暫不可用,重試即可恢復(fù)。但是一個節(jié)點(diǎn)夯住會將所有分布式請求都夯住,服務(wù)器端線程資源被占用不放,導(dǎo)致整個集群請求阻塞,甚至集群被拖垮。

swap的工作機(jī)制
既然數(shù)據(jù)庫們對swap不待見,那是不是就要使用swapoff命令關(guān)閉磁盤緩存特性呢?非也
HBase官方文檔的幾點(diǎn)要求實(shí)際上就是落實(shí)這個方針:盡可能降低swap影響。知己知彼才能百戰(zhàn)不殆,要降低swap影響就必須弄清楚Linux內(nèi)存回收是怎么工作的,這樣才能不遺漏任何可能的疑點(diǎn)。

先來看看swap是如何觸發(fā)的?
Linux會在兩種場景下觸發(fā)內(nèi)存回收,
1、一種是在內(nèi)存分配時發(fā)現(xiàn)沒有足夠空閑內(nèi)存時會立刻觸發(fā)內(nèi)存回收;
2、一種是開啟了一個守護(hù)進(jìn)程(swapd進(jìn)程)周期性對系統(tǒng)內(nèi)存進(jìn)行檢查,在可用內(nèi)存降低到特定閾值之后主動觸發(fā)內(nèi)存回收。

Linux內(nèi)存回收對象主要分為兩種:

  1. 文件緩存,這個容易理解,為了避免文件數(shù)據(jù)每次都要從硬盤讀取,系統(tǒng)會將熱點(diǎn)數(shù)據(jù)存儲在內(nèi)存中,提高性能。
  2. 匿名內(nèi)存,這部分內(nèi)存沒有實(shí)際載體,不像文件緩存有硬盤文件這樣一個載體,比如典型的堆、棧數(shù)據(jù)等。這部分內(nèi)存在回收的時候不能直接釋放或者寫回類似文件的媒介中,這才搞出來swap這個機(jī)制,將這類內(nèi)存換出到硬盤中,需要的時候再加載出來。

找到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)闆]有關(guān)閉NUMA引起的。在運(yùn)行數(shù)據(jù)庫進(jìn)程的服務(wù)器上,強(qiáng)烈建議關(guān)閉NUMA,
解決方法:
由于服務(wù)器硬件、系統(tǒng)設(shè)置不當(dāng),沒有關(guān)閉NUMA,導(dǎo)致發(fā)生SWAP。建議方案有:
在BIOS設(shè)置層面關(guān)閉NUMA,缺點(diǎn)是需要重啟OS;
或修改GRUB配置文件,缺點(diǎn)也是要重啟OS;
升級MySQL版本到5.6.27及以后,新增了一個選項(xiàng) innodb_numa_interleave,只需要重啟mysqld實(shí)例,無需重啟OS,推薦此方案。

    以上部分在 Linux 初始化腳本 (centos6 centos7 通用)https://blog.51cto.com/12445535/2362407 中提到
    參考鏈接為:http://hbasefly.com/2017/05/24/hbase-linux/
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI