如何解决UDP数据包被丢弃给netstat报告SndbufErrors

我在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_maxnet.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. Openstack VM实例上运行ethtool通常会导致Operation not supported 。 在Openstack主机服务器上运行ethtool ,select用于与外界通信的接口,得到:

     [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值,但没有成功。