大資料叢集核心引數調優

hdpdriver發表於2024-09-09

tcp mem 相關

net.ipv4.tcp_rmem = 4096 131072 6291456 讀取緩衝區,單位位元組
net.ipv4.tcp_wmem = 4096 16384 4194304 傳送緩衝區,單位位元組
net.ipv4.tcp_mem = 760707 1014278 1521414 記憶體大小,單位是 linux 記憶體頁的數目 ,佔用記憶體大小還得乘以每個頁的大小,一般是 4 kb. 可以在節點上執行命令 getconf PAGESIZE 來獲得. 正在使用的頁數可以直接檢視 cat /proc/net/sockstat

vm.min_free_kbytes = 512000 這個引數建議機器記憶體的1% ~ 3%

系統呼叫相關

零複製關閉
mapreduce.shuffle.transferTo.allowed=false
os.cache關閉
mapreduce.shuffle.manage.os.cache=false
關閉tuned
systemctl stop tuned

虛擬記憶體相關

vm.overcommit_memory nn=1 dn=0

0 – Heuristic overcommit handling. 這是預設值,它允許overcommit,但過於明目張膽的overcommit會被拒絕,比如malloc一次性申請的記憶體大小就超過了系統總記憶體。Heuristic的意思是“試探式的”,核心利用某種演算法(對該演算法的詳細解釋請看文末)猜測你的記憶體申請是否合理,它認為不合理就會拒絕overcommit。
1 – Always overcommit. 允許overcommit,對記憶體申請來者不拒。
2 – Don’t overcommit. 禁止overcommit。

vm.min_free_kbytes nn 預設 =90112 dn=1048576 預留給 linux 虛擬記憶體 的最小值, dn 節點同時也是 nm 計算節點,所以預留更多空間給系統呼叫

vm.swappiness=1 nn 未指定預設=30或60 dn=1 控制實體記憶體和虛擬記憶體交換行為,值越低,記憶體交換髮生就越少.對於 hadoop 生態,不建議使用預設值,因為頻繁的記憶體交換會引起 jvm 長時間 GC 停頓,影響關鍵服務,比如 NN 的穩定性.建議設定成 1

tcp 其他

net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_tw_reuse = 1

tcp_tw_recycle 和 tcp_tw_reuse 都是同樣的作用,用於快速回收處於 time_wait 的 tcp 連線.time_wait狀態是主動發起fin一方才會轉入的狀態,例如: datanode 主動關閉了 dfs client 的連線.

如果 tcp_timestamps 開啟的話,會快取每個連線的最新時間戳,對於 time_wait 的埠,如果後續請求時間戳小於快取的時間戳,即視為無效,相應的包被丟棄。所以如果是在NAT(Network Address Translation)網路下,就可能出現資料包丟棄的現象,會導致大量的TCP連線建立錯誤。

net.ipv4.tcp_tw_reuse要比net.ipv4.tcp_tw_recycle安全,從協議的角度看,複用是安全的。複用條件:

  • net.ipv4.tcp_timestamps選項必須開啟(客戶端也必須開啟) ;
  • 重用TIME_WAIT的條件是收到最後一個包後超過1秒;

所以不建議使用 tcp_tw_recycle,這個引數在 Linux 4.12 後被廢棄了.建議使用 tcp_tw_reuse ,並且tcp_tw_reuse 要結合 tcp_timestamps 使用

參考連線: Coping with the TCP TIME-WAIT state on busy Linux servers (bernat.ch) :

tcp_max_tw_buckets=18000
設定太小了,會導致節點間不能相互通訊. 叢集高峰期 tcp 連線數很大,應該設定成一個較大的值. 可以設定成 tcp_max_tw_buckets=18000
參考,Changing tcp_fin_timeout and tcp_max_tw_buckets - Red Hat Customer Portal:

If you set too large value to tcp_max_tw_buckets, the system may become out of port, file-descripter and memory. If you set too small value, the system may not communicate another host.

net.core.somaxconn

對應三次握手結束,還沒有 accept 佇列時的 establish 狀態。accept 佇列較多則說明服務端 accept 效率不高,或短時間內突發了大量新建連線。該值過小會導致伺服器收到 syn 不回包,是由於 somaxconn 表滿而刪除新建的 syn 連線引起。若為高併發業務,則可嘗試增大該值,但有可能增大延遲。

批次指令碼

#!/bin/bash
set -e

cp /etc/sysctl.conf /home/hadoop/sysctl.conf.bak
sed -i '/tcp_tw_recycle/d' sysctl.conf
cat <<EOF >> /etc/sysctl.conf

net.ipv4.tcp_mem = 760707 1014278 1521414
net.ipv4.tcp_wmem = 4096  16384   4194304
net.ipv4.tcp_rmem = 4096  131072  6291456
vm.min_free_kbytes = 512000

vm.swappiness=1
net.core.somaxconn=32768
net.ipv4.tcp_max_tw_buckets=18000
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_max_orphans = 16384
EOF
sysctl -p

系統引數配置一般在目錄 /proc/sys 下,例如 /proc/sys/net/ipv4/tcp_mem


雲伺服器 雲伺服器網路訪問丟包-故障處理-文件中心-騰訊雲 (tencent.com)

相關文章