tcp mem 相關 net.ipv4.tcp_rmem = 4096 131072 6291456 讀取緩衝區,單位位元組 net.ipv4.tcp_wmem = 4096 16384 4194304 發送緩衝區,單位位元組 net.ipv4.tcp_mem = 760707 1014278 1521 ...
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)