我遇到了一个网络问题,一台机器说它正在以 150 Mbit/s 的速率发送数据,但另一台机器的接收速度仅为 100 Mbit/s。发送应用程序最终崩溃,抱怨内存不足(它实际上是一个自定义 DSP,因此输入错误消息毫无用处)。
因此,我怀疑接收机器没有正确处理负载,但我对调试这种情况不太有经验。
我已经进行了一些测试vmstat
,但我不知道这些数字是否令人担忧:
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 13317200 262808 2311648 0 0 0 0 1131 3403 4 1 96 0 0
0 0 0 13309140 262808 2311652 0 0 0 9 2092 9235 10 2 89 0 0
0 0 0 13295748 262808 2311652 0 0 0 0 4521 22710 14 4 82 0 0
5 0 0 13279620 262808 2311652 0 0 0 0 13835 66325 30 10 60 0 0
6 0 0 13257432 262808 2311656 0 0 0 0 20092 92365 43 14 43 0 0
3 0 0 13232756 262808 2311660 0 0 0 0 22522 117367 49 17 34 0 0
3 0 0 13207832 262808 2311664 0 0 0 10 23419 149649 54 20 26 0 0
7 0 0 13159720 262808 2311668 0 0 0 8 23816 168436 56 21 23 0 0
8 0 0 13122148 262808 2311668 0 0 0 0 26267 168578 54 20 26 0 0
8 0 0 13119544 262808 2311668 0 0 0 0 30498 164004 53 24 24 0 0
7 0 0 13117312 262808 2311668 0 0 0 0 29853 163340 55 23 23 0 0
8 0 0 13116832 262808 2311664 0 0 0 3 29942 162609 55 22 24 0 0
8 0 0 13118824 262808 2311668 0 0 0 0 30098 162232 55 21 24 0 0
8 0 0 13118212 262808 2311668 0 0 0 0 29213 159902 45 18 37 0 0
8 0 0 13116352 262808 2311668 0 0 0 3 29552 161978 55 21 24 0 0
7 0 0 13117468 262808 2311664 0 0 0 9 30218 162704 56 22 22 0 0
5 0 0 13116972 262808 2311672 0 0 0 0 30172 164399 57 19 24 0 0
8 0 0 13115608 262808 2311672 0 0 0 8 30068 163894 56 18 26 0 0
0 0 0 13181080 262808 2311676 0 0 0 0 19062 151066 46 20 34 0 0
6 0 0 13186536 262808 2311676 0 0 0 0 6812 85690 15 19 66 0 0
1 0 0 13186784 262808 2311676 0 0 0 0 6733 82150 19 22 59 0 0
0 0 0 13203400 262808 2311716 0 0 0 9 2659 33015 5 5 90 0 0
我也检查过了sockstat
,但我不知道这些数字是否令人担忧:
> cat /proc/net/sockstat
sockets: used 920
TCP: inuse 82 orphan 0 tw 0 alloc 91 mem 8228
UDP: inuse 271 mem 20
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
这是 TCP 缓冲内存(我尝试将它们设置为我在实验室中另一台机器上看到的值,它们大约增加了三倍而没有变化):
> sysctl -a | grep tcp.*mem
net.ipv4.tcp_mem = 69888 93184 139776
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
至于硬件,我有 8 个核心:
> cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Xeon(R) CPU E5472 @ 3.00GHz
stepping : 10
cpu MHz : 2403.000
cache size : 6144 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
bogomips : 5999.77
clflush size : 64
cache_alignment : 64
address sizes : 38 bits physical, 48 bits virtual
我可以使用哪些其他实用程序来调试此问题?如果有人有此类调试的良好资源,我将不胜感激!
答案1
这说明了什么?sudo sysctl -a | grep tcp.*mem
还:sudo ethtool ethWhateverYoursIs
我猜测发送应用程序不遵守 TCP 流控制,最终耗尽 TCP 发送缓冲区内存并崩溃。
答案2
我假设发送方有 1Gbit NIC,并且它发送的流量不是 TCP,否则它的速度永远不会快于接收方的接收速度。“最佳”解决方案可能是让应用程序获得一些它发送速度不太快的确认,但您也可以检查接收方是否实际运行 100Mbit 而不是 1Gbit。您还可以查看netstat -i
两个系统,看看是否有错误或丢失。
编辑:根据您的评论,我认为 TCP 无法正常工作(如果您的应用程序泄漏内存,这很正常,几乎肯定存在错误),或者您的测量工具不准确。您使用什么来测量流量?您可以运行netstat -i -c
连续更新(每秒一次)以查看系统认为它们正在发送和接收的内容。