我有一个服务器实例,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
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
主机服务器。更新:我增加了RX
和TX
值,但没有成功。