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