感謝平臺分享-http://bjbsair.com/2020-04-10/tech-info/53321.html
調試HBase服務器RPC處理
- 設置 hbase.regionserver.handler.count(在 hbase-site.xml)爲用於併發的核心 x 軸。
-
可選地,將調用隊列分成單獨的讀取和寫入隊列以用於區分服務。該參數 hbase.ipc.server.callqueue.handler.factor 指定調用隊列的數量:
-
0 意味着單個共享隊列。
-
1 意味着每個處理程序的一個隊列。
-
一個0和1之間的值,按處理程序的數量成比例地分配隊列數。例如,0.5 的值在每個處理程序之間共享一個隊列。
-
使用 hbase.ipc.server.callqueue.read.ratio(hbase.ipc.server.callqueue.read.share在0.98中)將調用隊列分成讀寫隊列:
-
0.5 意味着將有相同數量的讀寫隊列。
-
<0.5 表示爲讀多於寫。
-
>0.5 表示寫多於讀。
-
設置 hbase.ipc.server.callqueue.scan.ratio(HBase 1.0+)將讀取調用隊列分爲短讀取和長讀取隊列:
-
0.5 意味着將有相同數量的短讀取和長讀取隊列。
-
<0.5表示更多的短讀取隊列。
- >0.5表示更多的長讀取隊列。
禁用RPC的Nagle
禁用 Nagle 的算法。延遲的 ACKs 可以增加到200毫秒的 RPC 往返時間。設置以下參數:
-
在 Hadoop 的 core-site.xml 中:
-
ipc.server.tcpnodelay = true
-
ipc.client.tcpnodelay = true
-
在 HBase 的 hbase-site.xml 中:
-
hbase.ipc.client.tcpnodelay = true
- hbase.ipc.server.tcpnodelay = true
限制服務器故障影響
儘可能快地檢測區域服務器故障。設置以下參數:
- 在 hbase-site.xml 中設置 zookeeper.session.timeout 爲30秒或更短的時間內進行故障檢測(20-30秒是一個好的開始)。
-
檢測並避免不健康或失敗的 HDFS 數據節點:in hdfs-site.xml 和 hbase-site.xml 設置以下參數:
-
dfs.namenode.avoid.read.stale.datanode = true
- dfs.namenode.avoid.write.stale.datanode = true
針對低延遲優化服務器端
-
跳過本地塊的網絡。在 hbase-site.xml 中,設置以下參數:
-
dfs.client.read.shortcircuit = true
-
dfs.client.read.shortcircuit.buffer.size = 131072 (重要的是避免 OOME)
- 確保數據局部性。在 hbase-site.xml 中,設置 hbase.hstore.min.locality.to.skip.major.compact = 0.7(意味着 0.7 <= n <= 1)
-
確保 DataNode 有足夠的處理程序進行塊傳輸。在 hdfs-site.xml 中,設置以下參數:
-
dfs.datanode.max.xcievers >= 8192
- dfs.datanode.handler.count = 主軸數量
JVM調優
調整JVM GC以獲取低收集延遲
- 使用 CMS 收集器: -XX:+UseConcMarkSweepGC
- 保持 eden 空間儘可能小,以減少平均收集時間。例:-XX:CMSInitiatingOccupancyFraction = 70
- 優化低收集延遲而不是吞吐量: -Xmn512m
- 並行收集 eden: -XX:+UseParNewGC
- 避免在壓力下收集: -XX:+UseCMSInitiatingOccupancyOnly
- 限制每個請求掃描器的結果大小,所以一切都適合倖存者空間,但沒有任職期限。在 hbase-site.xml 中,設置 hbase.client.scanner.max.result.size 爲 eden 空間的1/8(使用 - Xmn512m,這裏是〜51MB)
- 設置 max.result.sizex handler.count 小於 survivor 空間
OS級調整
- 關閉透明的大頁面(THP):
- 設置 vm.swappiness = 0
- 設置 vm.min_free_kbytes 爲至少 1GB(較大內存系統爲 8GB)
- 使用 vm.zone_reclaim_mode = 0 禁用 NUMA 區域回收。