当前位置:   article > 正文

UDP丢包问题解决经验梳理_iperf3 udp丢包

iperf3 udp丢包

客户反馈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,问题才彻底解决

附上脚本

  1. #关闭irq服务不然无法手动绑定
  2. systemctl stop irqbalance
  3. #用于增加最大可分配的 UDP 缓冲区空间总量和可缓存报文数量
  4. sysctl -w net.core.netdev_max_backlog=65533
  5. sysctl -w net.core.rmem_max=128000000
  6. sysctl -w net.ipv4.udp_mem=" 2233305 2977741 4466610 "
  7. sysctl -p
  8. #配置rps功能
  9. rps() {
  10. rfc=4096
  11. cc=$(grep -c processor /proc/cpuinfo)
  12. rsfe=$(echo $cc*$rfc | bc)
  13. sysctl -w net.core.rps_sock_flow_entries=$rsfe
  14. for dev in "$@";do
  15. for fileRfc in $(ls /sys/class/net/${dev}/queues/rx-*/rps_flow_cnt)
  16. do
  17. echo $rfc > $fileRfc
  18. echo "$fileRfc"
  19. done
  20. done
  21. }
  22. #中断亲和绑定
  23. irq() {
  24. for dev in "$@";do
  25. core=1
  26. for irq in `cat /proc/interrupts | grep -i ${dev} | awk '{print $1}' | sed 's/://g'`
  27. do
  28. echo ${core} > /proc/irq/${irq}/smp_affinity_list
  29. echo "$irq"
  30. core=$(($core+1))
  31. done
  32. done
  33. }
  34. #关闭网口流控,增大ring buffer
  35. selfdev() {
  36. for dev in "$@";do
  37. ethtool -A $dev tx off rx off
  38. ethtool -G $dev tx 4096 rx 4096
  39. done
  40. }
  41. if [ $# -eq 0 ];then
  42. echo "Usage:$0 [network_interface1] [network_interface2]..."
  43. exit 1
  44. fi
  45. selfdev $@
  46. rps $@
  47. irq $@

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/915556
推荐阅读
相关标签
  

闽ICP备14008679号