我的网络性能有问题。我在 VMware Cloud Server 上使用 Ubuntu 16.04,NIC 为 E1000。但我看到 ifconfig 命令的部分内容中丢弃了一些数据包:
root@ubuntu:~# ifconfig ens192
ens192 Link encap:Ethernet HWaddr 00:50:56:03:25:14
inet addr:192.16.1.100 Bcast:192.16.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:574749 errors:0 dropped:83 overruns:0 frame:0
TX packets:76478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:44109471 (44.1 MB) TX bytes:19484534 (19.4 MB)
虽然只是丢失了一些数据包,但我的服务器正在在线运行实时游戏,所以你知道它会影响连接到它的客户端。
我在 Google 上进行了一些研究和探索,之后我尝试更改缓冲区环、最大窗口大小等的配置文件。但它仍然会丢弃我的数据包。
所以,现在我想捕获丢弃的数据包,以分析它到底是什么类型的数据包。
我也尝试在 wireshark 中捕获以下视图:
sudo tcpdump -i ens192 -n -w /var/www/html/logs.pcap -C 1 -Z root
但我认为我看不到丢弃了哪些数据包!我认为丢弃的数据包在进入 tcpdump 过滤器之前会被忽略。
您能建议我用什么方法来捕获上面的“丢弃的数据包”吗(掉落:83)?
提前致谢!
答案1
问题可能出在 tcpdump 本身上:如果它响应不够快,那么旧数据包将被新数据包覆盖,这意味着它们会被丢弃。
如果您捕获每个数据包的所有字节,则很容易导致内核的数据包捕获缓冲区溢出。这种溢出的症状是您的数据包跟踪程序将报告它丢弃了数据包。
对于 tcpdump,当您停止捕获时,它会打印出捕获、过滤和丢弃的数据包的摘要。例如:
$ sudo tcpdump -i en0 -w trace.pcap
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
94 packets captured
177 packets received by filter
0 packets dropped by kernel
如果dropped
计数不为零,则需要通过将选项传递-B
给 tcpdump 来增加数据包捕获缓冲区大小。在没有捕获文件的情况下也尝试一下,看看这是否能提高捕获率。
答案2
您的问题似乎与回溯并找出可能导致先前数据包丢失的原因有关,而不是尝试捕获实时数据包以尝试找到丢失的数据包。对于后者,harrymc 的回答最终应该能够捕获您正在寻找的一个。
要回过头来查看该接口上可能发生的情况,您必须了解所看到的那些标题RX packets:574749 errors:0 dropped:83 overruns:0 frame:0
只是底层计数器的摘要。
从我的评论,我建议使用ethtool
来自的命令/包这个答案分析一些计数器,看看是否可以发现一些不合适的地方。
ethtool -S ens192
来自broadcom 驱动程序源文件,我们tp->rx_dropped++;
在文件中看到了几个不同的情况。
1
2
3 其中一个或多个(取决于您的具体 NIC 和底层驱动程序)都可能导致数据包丢失。
为了让您放心,根据上面的输出,您的服务器丢弃的数据包不到 0.015%。您的客户端不会注意到任何服务器中断甚至抖动,直到您的丢包率/错误率超过 1%。即使到那时,也很难注意到。TCP 将处理所需的任何重新传输。