网络编程之网络丢包故障如何定位?如何解决?( 九 )

  • 按峰值在来,增大buffer缓存区大小:
  • net.ipv4.udp_mem = xxxnet.ipv4.udp_rmem_min = xxxnet.ipv4.udp_wmem_min = xxx3. 调整应用设计:
    • UDP本身就是无连接不可靠的协议,适用于报文偶尔丢失也不影响程序状态的场景,比如视频、音频、游戏、监控等 。对报文可靠性要求比较高的应用不要使用 UDP,推荐直接使用 TCP 。当然,也可以在应用层做重试、去重保证可靠性
    • 如果发现服务器丢包,首先通过监控查看系统负载是否过高,先想办法把负载降低再看丢包问题是否消失
    • 如果系统负载过高,UDP丢包是没有有效解决方案的 。如果是应用异常导致CPU、memory、IO 过高,请及时定位异常应用并修复;如果是资源不够,监控应该能及时发现并快速扩容
    • 对于系统大量接收或者发送UDP报文的,可以通过调节系统和程序的 socket buffer size 来降低丢包的概率
    • 应用程序在处理UDP报文时,要采用异步方式,在两次接收报文之间不要有太多的处理逻辑
    应用层socket丢包socket缓存区接收丢包
    查看:
    1. 抓包分析是否存在丢包情况;
    2. 查看统计:
    netstat -s|grep "packet receive errors"解决方案:
    调整socket缓冲区大小:
    socket配置(所有协议socket):# Default Socket Receive Buffernet.core.rmem_default = 31457280# Maximum Socket Receive Buffernet.core.rmem_max = 67108864具体大小调整原理:
    缓冲区大小没有任何设置值是最佳的,因为最佳大小随具体情况而不同
    缓冲区估算原理:在数据通信中,带宽时延乘积(英语:bandwidth-delay product;或称带宽延时乘积、带宽延时积等)指的是一个数据链路的能力(每秒比特)与来回通信延迟(单位秒)的乘积 。[1][2]其结果是以比特(或字节)为单位的一个数据总量,等同在任何特定时间该网络线路上的最大数据量——已发送但尚未确认的数据 。
    BDP = 带宽 * RTT
    可以通过计算当面节点带宽和统计平均时延来估算BDP,即缓冲区的大小,可以参考下面常见场景估计:
    网络编程之网络丢包故障如何定位?如何解决?

    文章插图
     
    应用设置tcp连接数大小丢包
    查看:
    请参考上面TCP连接队列分析;
    解决方案:
    设置合理的连接队列大小,当第三次握手时,当server接收到ACK 报之后, 会进入一个新的叫 accept 的队列,该队列的长度为 min(backlog, somaxconn),默认情况下,somaxconn 的值为 128,表示最多有 129 的 ESTAB 的连接等待 accept(),而 backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,listen 里面的 backlog 可以有我们的应用程序去定义的;
    应用发送太快导致丢包
    查看统计:
    netstat -s|grep "send buffer errors解决方案:
    • ICMP/UDP没有流控机制,需要应用设计合理发送方式和速度,照顾到底层buff大小和CPU负载以及网络带宽质量;
    • 设置合理的sock缓冲区大小:
    setsockopt(s,SOL_SOCKET,SO_SNDBUF,i(const char*)&nSendBuf,sizeof(int));
    • 调整系统socket缓冲区大小:
    # Default Socket Send Buffernet.core.wmem_default = 31457280# Maximum Socket Send Buffernet.core.wmem_max = 33554432附:简单总结一下内核协议栈丢包:
    网络编程之网络丢包故障如何定位?如何解决?

    文章插图
     
    相关工具介绍1.dropwatch工具
    原理: 监听 kfree_skb(把网络报文丢弃时会调用该函数)函数或者事件吗,然后打印对应调用堆栈;想要详细了解 linux 系统在执行哪个函数时丢包的话,可以使用 dropwatch 工具,它监听系统丢包信息,并打印出丢包发生的函数:
    网络编程之网络丢包故障如何定位?如何解决?

    文章插图
     
    2. tcpdump工具
    原理: tcpdump 是一个Unix下一个功能强大的网络抓包工具,它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包
    网络编程之网络丢包故障如何定位?如何解决?

    文章插图
     
    抓包命令参考:
    https://www.tcpdump.org/manpages/tcpdump.1.html
    数据包分析:
    1.用wireshark工具分析 参考:Wireshark数据包分析实战.pdf
    2.可以转化生成CSV数据,用Excel或者shell去分析特定场景报文;
    3.可以在linux上用tshark命令行工具进行分析:


    推荐阅读