大数据集群内核参数调优

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)