我在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
不断增加。 我试图找出可能是什么原因造成的,但没有运气,即使感觉这个应该被覆盖在某个地方。
问:这可能是什么原因?我怎样才能解决这个问题?
我做的调查:
运行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
我试着增加txqueuelen
到10'000
(通过运行ifconfig eth1 txqueuelen 10000
),但是没有什么区别。
运行几个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
,但仍然得到相同的错误。
运行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
在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
主机服务器。 更新:我增加了RX
和TX
值,但没有成功。