如何解决 netstat 报告 SndbufErrors 时 UDP 数据包被丢弃的问题

如何解决 netstat 报告 SndbufErrors 时 UDP 数据包被丢弃的问题

我有一个服务器实例,OpenStack在负载相当高时开始丢失UDP数据包。我捕获了所有传出的数据包tcpdump,但有些数据包丢失了,尽管应用程序日志表明这些数据包应该已经发送。通常数据包大小约为 60-120 字节。

跑步netstat -s可得:

[root@myServer] ~> netstat -s | grep Udp: -A 5
Udp:
    3855490640 packets received
    133199 packets to unknown port received.
    89 packet receive errors
    4116940753 packets sent
    SndbufErrors: 1396176

当服务器负载过大时,该SndbufErrors值会不断增加。我试图找出导致该值的原因,但没有成功,尽管感觉应该在某个地方介绍该值。

问:这可能是什么原因造成的?我该如何解决?

我做过的调查:

  1. 运行ifconfig -a没有显示任何错误:

      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:6361554048 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6902945025 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000
    

    我尝试增加到txqueuelen10'000通过运行ifconfig eth1 txqueuelen 10000),但没有什么变化。

  2. 运行几个sysctl命令我得到:

    net.core.rmem_max = 124928
    net.core.wmem_max = 4194304
    net.core.rmem_default = 124928
    net.core.wmem_default = 124928
    

    我尝试增加数字net.core.rmem_max,甚至net.core.wmem_max更大16'777'216,但仍然出现相同的错误。

  3. 运行sar -n UDP 1 1结果(近似值,但没有错误):

    05:47:31 PM    idgm/s    odgm/s  noport/s idgmerr/s
    05:48:46 PM  23000.00  24000.00      0.00      0.00
    
  4. ethtool在 VM 实例上运行Openstack大多会导致Operation not supported。在主机服务器ethtool上运行Openstack时选择用于与外界通信的接口,我得到:

    [root@myServer] ~> ethtool em1
        Speed: 1000Mb/s
        ... 
    
    [root@myServer] ~> ethtool -g em1
        Ring parameters for em1:
        Pre-set maximums:
        RX:             4096
        RX Mini:        0
        RX Jumbo:       0
        TX:             4096
        Current hardware settings:
        RX:             256
        RX Mini:        0
        RX Jumbo:       0
        TX:             256
    

    但我并不确信这两者之间有关联,因为我看到的错误是在虚拟机内部,而不是Openstack主机服务器。更新:我增加了RXTX值,但没有成功。

相关内容