赞
踩
客户反馈UDP业务丢包很高,有百分之5左右,导致集群告警严重,同时通过iperf工具来验证节点之间打流确实存在严重丢包,一般丢包类问题本质就是调优问题,因此首先先让用户将网卡驱动固件版本升级到最新,但是节点之间打流丢包还是很高,使用的命令如下iperf3 -u -c 192.168.2.14 -b 10000M -l 10000 -P 3 -t 100
其中-l参数决定了udp单个包的数据大小,这个1万是用户根据业务模型来定的。其实看到这个参数就会有一定想法,是否和MTU默认为1500有关系导致数据包分包了,但是客户认为集群内其它CPU平台没有这么高丢包率,当前至少先尝试调优一下。调优过程也参考了网上的一些文章,有个大神的文章特别清楚,链接如下
https://zhuanlan.zhihu.com/p/617397417
1.实验室搭了环境后,接收方平台也就是hygon平台用相同iperf命令打流丢包确实很严重,有百分之20左右
用iperf3时遇到个如下报错的问题,研究了半天才搞清楚是需要加-B参数指定本地用于发送数据
的 IP,这种情况会出现在本地有多个IP网口的情况下
2.复现到丢包以后开始寻找原因,主要通过ifconfig命令先查看接收的网口下的RX error和dropped是否会有增长
3.确认没有增长以后,由于是直连的,因此链路中和网口这里都算是排除了,然后通过netstat -su命令查看是不是数据交给kernel处理时有丢失,下面两个划线的地方是否有增长
4.实验室查看kerenl层面是有增长的,于是通过下面命令查看这几个参数的大小,并进行相应的设置,这些参数的解读也都在文章开头的链接里了,主要都是和kernel处理相关的
sysctl -A | grep net | grep 'mem\|backlog' | grep 'udp_mem\|rmem_max\|max_backlog'
sysctl -w net.core.netdev_max_backlog=65533
sysctl -w net.core.rmem_max=128000000
sysctl -w net.ipv4.udp_mem=" 2233305 2977741 4466610”
5.实验室中单独设置kernel层面的参数,调优效果几乎没有,很显然即使网口显示没有丢包,但是丢包作为一个整体的最终结果,这样单一的思路也是不正确的,应当意识到kernel层面最终能否处理的过来,和CPU核心和网卡之间的亲和是有关系的,网卡作为其中一个环节还是有调优方向的,配置得当可以让CPU和kernel更好的处理数据,因此通过以下几个关键命令调优
ethtool -l 提高队列数用于绑定更多核心
ethtool -g 对rx 的ring buffer进行提高
ethtool -k关闭ntuple功能避免和rps功能冲突
关闭irqbalance避免和中断绑和冲突
最后进行中断绑核以及配置RPS,RPS说明如下
6.最终调优后将丢包减少至百分之6,将调优手段整理为脚本提供客户便于一键执行,客户执行后丢包也大大降低了,但是集群中的告警还是存在,最终还是将网络中的MTU设置为9000,问题才彻底解决
附上脚本
- #关闭irq服务不然无法手动绑定
- systemctl stop irqbalance
- #用于增加最大可分配的 UDP 缓冲区空间总量和可缓存报文数量
- sysctl -w net.core.netdev_max_backlog=65533
- sysctl -w net.core.rmem_max=128000000
- sysctl -w net.ipv4.udp_mem=" 2233305 2977741 4466610 "
- sysctl -p
- #配置rps功能
- rps() {
- rfc=4096
- cc=$(grep -c processor /proc/cpuinfo)
- rsfe=$(echo $cc*$rfc | bc)
- sysctl -w net.core.rps_sock_flow_entries=$rsfe
- for dev in "$@";do
- for fileRfc in $(ls /sys/class/net/${dev}/queues/rx-*/rps_flow_cnt)
- do
- echo $rfc > $fileRfc
- echo "$fileRfc"
- done
- done
- }
- #中断亲和绑定
- irq() {
- for dev in "$@";do
- core=1
- for irq in `cat /proc/interrupts | grep -i ${dev} | awk '{print $1}' | sed 's/://g'`
- do
- echo ${core} > /proc/irq/${irq}/smp_affinity_list
- echo "$irq"
- core=$(($core+1))
- done
- done
- }
- #关闭网口流控,增大ring buffer
- selfdev() {
- for dev in "$@";do
- ethtool -A $dev tx off rx off
- ethtool -G $dev tx 4096 rx 4096
- done
- }
-
- if [ $# -eq 0 ];then
- echo "Usage:$0 [network_interface1] [network_interface2]..."
- exit 1
- fi
-
- selfdev $@
- rps $@
- irq $@
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。