0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

debug 吞吐量的办法

lhl545545 来源:良许Linux 作者:良许Linux 2022-09-02 09:36 次阅读

Debug 网络质量的时候,我们一般会关注两个因素:延迟和吞吐量(带宽)。延迟比较好验证,Ping 一下或者mtr[1]一下就能看出来。这篇文章分享一个 debug 吞吐量的办法。

看重吞吐量的场景一般是所谓的长肥管道(Long Fat Networks, LFN,rfc7323[2]). 比如下载大文件。吞吐量没有达到网络的上限,主要可能受 3 个方面的影响:

发送端出现了瓶颈

接收端出现了瓶颈

中间的网络层出现了瓶颈

发送端出现瓶颈一般的情况是 buffer 不够大,因为发送的过程是,应用调用 syscall,将要发送的数据放到 buffer 里面,然后由系统负责发送出去。如果 buffer 满了,那么应用会阻塞住(如果使用 block 的 API 的话),直到 buffer 可用了再继续 write,生产者和消费者模式。

fc83cbec-2a4e-11ed-ba43-dac502259ad0.png

发送端出现瓶颈一般都比较好排查,甚至通过应用的日志看何时阻塞住了即可。大部分情况都是第 2,3 种情况,比较难以排查。这种情况发生在,发送端的应用已经将内容写入到了系统的 buffer 中,但是系统并没有很快的发送出去。

TCP 为了优化传输效率(注意这里的传输效率,并不是单纯某一个 TCP 连接的传输效率,而是整体网络的效率),会:

保护接收端,发送的数据不会超过接收端的 buffer 大小 (Flow control)。数据发送到接受端,也是和上面介绍的过程类似,kernel 先负责收好包放到 buffer 中,然后上层应用程序处理这个 buffer 中的内容,如果接收端的 buffer 过小,那么很容易出现瓶颈,即应用程序还没来得及处理就被填满了。那么如果数据继续发过来,buffer 存不下,接收端只能丢弃。

保护网络,发送的数据不会 overwhelming 网络 (Congestion Control, 拥塞控制), 如果中间的网络出现瓶颈,会导致长肥管道的吞吐不理想;

对于接收端的保护,在两边连接建立的时候,会协商好接收端的 buffer 大小 (receiver window size, rwnd), 并且在后续的发送中,接收端也会在每一个 ack 回包中报告自己剩余和接受的 window 大小。这样,发送端在发送的时候会保证不会发送超过接收端 buffer 大小的数据。(意思是,发送端需要负责,receiver 没有 ack 的总数,不会超过 receiver 的 buffer.)

fc9ec8d4-2a4e-11ed-ba43-dac502259ad0.png

对于网络的保护,原理也是维护一个 Window,叫做 Congestion window,拥塞窗口,cwnd, 这个窗口就是当前网络的限制,发送端不会发送超过这个窗口的容量(没有 ack 的总数不会超过 cwnd)。

怎么找到这个 cwnd 的值呢?

这个就是关键了,默认的算法是 cubic, 也有其他算法可以使用,比如 Google 的BBR[3].

主要的逻辑是,慢启动(Slow start), 发送数据来测试,如果能正确收到 receiver 那边的 ack,说明当前网络能容纳这个吞吐,将 cwnd x 2,然后继续测试。直到下面一种情况发生:

发送的包没有收到 ACK

cwnd 已经等于 rwnd 了

第 2 点很好理解,说明网络吞吐并不是一个瓶颈,瓶颈是在接收端的 buffer 不够大。cwnd 不能超过 rwnd,不然会 overload 接收端。

对于第 1 点,本质上,发送端是用丢包来检测网络状况的,如果没有发生丢包,表示一切正常,如果发生丢包,说明网络处理不了这个发送速度,这时候发送端会直接将 cwnd 减半。

但实际造成第 1 点的情况并不一定是网络吞吐瓶颈,而可能是以下几种情况:

网络达到了瓶颈

网络质量问题丢包

中间网络设备延迟了包的送达,导致发送端没有在预期时间内收到 ACK

2 和 3 原因都会造成 cwnd 下降,无法充分利用网络吞吐。

以上就是基本的原理,下面介绍如何定位这种问题。

rwnd 查看方式

这个 window size 直接就在 TCP header 里面,抓下来就能看这个字段。

fcaf21c0-2a4e-11ed-ba43-dac502259ad0.png

但是真正的 window size 需要乘以 factor, factor 是在TCP 握手节点通过 TCP Options 协商的[4]。所以如果分析一条 TCP 连接的 window size,必须抓到握手阶段的包,不然就不可以知道协商的 factor 是多少。

fcd64ff2-2a4e-11ed-ba43-dac502259ad0.png

cwnd 查看方式

Congestion control 是发送端通过算法得到的一个动态变量,会试试调整,并不会体现在协议的传输数据中。所以要看这个,必须在发送端的机器上看。

Linux 中可以使用ss -i选项将 TCP 连接的参数都打印出来。

fcfa4da8-2a4e-11ed-ba43-dac502259ad0.png

这里展示的单位是TCP MSS.[5]即实际大小是 1460bytes * 10.

Wireshark 分析

Wireshark 提供了非常使用的统计功能,可以让你一眼就能看出当前的瓶颈是发生在了哪里。但是第一次打开这个图我不会看,一脸懵逼,也没查到资料要怎么看。好在我同事[6]会,他把我教会了,我在这里记录一下,把你也教会。

首先,打开的方式如下:

fd1ef158-2a4e-11ed-ba43-dac502259ad0.png

然后你会看到如下的图。

fd3ab708-2a4e-11ed-ba43-dac502259ad0.png

首先需要明确,tcptrace 的图表示的是单方向的数据发送,因为 tcp 是双工协议,两边都能发送数据。其中最上面写了你当前在看的图数据是从 10.0.0.1 发送到 192.168.0.1 的,然后按右下角的按钮可以切换看的方向。

X 轴表示的是时间,很好理解。

然后理解一下 Y 轴表示的 Sequence Number, 就是 TCP 包中的 Sequence Number,这个很关键。图中所有的数据,都是以 Sequence Number 为准的。

所以,你如果看到如上图所示,那么说明你看反了,因为数据的 Sequence Number 并没有增加过,说明几乎没有发送过数据,需要点击 Switch Direction。

fd5cec38-2a4e-11ed-ba43-dac502259ad0.png

这就对了,可以看到我们传输的 Sequence Number 在随着时间增加而增加。

这里面有 3 条线,含义如下:

fd72b4fa-2a4e-11ed-ba43-dac502259ad0.png

除此之外,另外还有两种线:

fd911242-2a4e-11ed-ba43-dac502259ad0.png

需要始终记住的是 Y 轴是 Sequence Number,红色的线表示 SACK 的线表示这一段 Sequence Number 我已经收到了,然后配合黄色线表示 ACK 过的 Sequence Number,那么发送端就会知道,在中间这段空挡,包丢了,红色线和黄色线纵向的空白,是没有被 ACK 的包。所以,需要重新传输。而蓝色的线就是表示又重新传输了一遍。

学会了看这些图,我们可以认识几种常见的 pattern:

丢包

fda60e7c-2a4e-11ed-ba43-dac502259ad0.png

很多红色 SACK,说明接收端那边重复在说:中间有一个包我没有收到,中间有一个包我没有收到。

吞吐受到接收 window size 限制

fdc81dbe-2a4e-11ed-ba43-dac502259ad0.png

从这个图可以看出,黄色的线(接收端一 ACK)一上升,蓝色就跟着上升(发送端就开始发),直到填满绿色的线(window size)。说明网络并不是瓶颈,可以调大接收端的 buffer size.

吞吐受到网络质量限制

fdd7c354-2a4e-11ed-ba43-dac502259ad0.png

从这张图中可以看出,接收端的 window size 远远不是瓶颈,还有很多空闲。

fdf4cfc6-2a4e-11ed-ba43-dac502259ad0.png

放大可以看出,中间有很多丢包和重传,并且每次只发送一点点数据,这说明很有可能是 cwnd 太小了,受到了拥塞控制算法的限制。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • 带宽
    +关注

    关注

    3

    文章

    818

    浏览量

    40126
  • 吞吐量
    +关注

    关注

    0

    文章

    45

    浏览量

    12280
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1271

    浏览量

    78291

原文标题:如何使用 Wireshark 分析 TCP 吞吐瓶颈

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何提高CYBT-243053-02吞吐量

    你好我们一直在使用“EZ-Serial Firmware: v1.4.13.13 Sep 22 2023 10:24:41”测试“CYBT-243053-02”,我们得到的吞吐量比 PUART 高
    发表于 02-27 06:56

    网卡吞吐量测试解决方案

    随着互联网的迅速发展,计算机日益成为人们生活中不可或缺的部分。伴随着网络业务的丰富,用户对计算机网卡的要求也越来也高。如何对计算机网卡吞吐量进行合理的测试,已越来越成为众多计算机网卡生产厂家日益关注
    发表于 12-23 11:07

    无线测试之吞吐量测试

    无线网络测试之无线吞吐量测试方法、步骤
    发表于 06-25 08:40

    iperf固定吞吐量测试如何设置

    我有两个CYW43907演示,并下载控制台项目。我想使用IpFF命令来测试固定的UDP吞吐量。示例:IPEF-C 192.1680.1-P 5001 -I 2 -T 30 -U-B 60M,但客户端
    发表于 11-06 14:09

    从设备FIFO OUT吞吐量

    你好,我们有一个设计与FX2(CY68013A)和FPGA。我们使用从FIFO接口,主要是对高输出吞吐量感兴趣。我目前有大约27 Mb/s,但尖叫的例子说它可以做32 Mb/s。我认为在PC方面,我
    发表于 03-18 15:01

    浅析敏捷高吞吐量卫星通讯载荷

    对带宽日益增加的需求大大提高了对数据网络敏捷系统的要求。卫星通讯也在经历着变革性的发展。由新的超宽带(UWB)数据转换器支持的创新架构,极大地提高了其经济效益和数据吞吐量
    发表于 07-23 08:47

    USB CDC吞吐量问题

    我从论坛上阅读CDC的所有内容中得知,我的申请应该只是学术性的,并且迟疑不决。我的实时要求是在250毫秒内传输115200字节(吞吐量460800字节/秒)。从PIC32到PC。客户需要他们的PC
    发表于 10-14 15:52

    如何计算延迟和吞吐量

    如何计算延迟和吞吐量?在ISE时序报告中,我们发现一个名为“最大组合路径延迟”的参数是否与最大时钟频率有关?
    发表于 03-19 08:55

    请问如何找到面积,延迟,吞吐量,功率?

    嗨,我的项目是基于芯片的VHDL设计和实现网络我使用Xilinx ISE和合成buti不知道如何找到(区域,延迟,吞吐量,功率)的设计我在附件中获得了报告中的信息(设计摘要,时间摘要)。那么内存使用是什么意思?如果他知道如何找到他们,请任何人帮助我吗?
    发表于 05-25 08:43

    提高BLE吞吐量的可行办法

    提高BLE吞吐量的可行办法如何实现更快的BLE吞吐量
    发表于 01-18 06:26

    如何利用NI LabVIEW技术提高测试系统的吞吐量

    怎么可以创建出高性能的测试系统?如何利用NI LabVIEW技术提高测试系统的吞吐量?如何利用NI LabVIEW技术实现并行化处理和并行化测试?
    发表于 04-15 07:00

    SX1301的吞吐量是否等于8个SX1276/8?

    SX1301的吞吐量是否等于8个SX1276/8?如何有效地提高网络吞吐量
    发表于 04-19 09:50

    如何提高VLD的吞吐量和执行效率?

    本文讨论一种新型的VLD解码结构,它通过并行侦测多路码字,将Buffer中的多个可变长码一次读出,这将极大地提高VLD的吞吐量和执行效率。然后采用FPGA对这种并行VLD算法的结构进行验证,最终得出相应结论。
    发表于 04-28 06:08

    如何通过触发模型提高吞吐量

    如何通过触发模型提高吞吐量
    发表于 05-11 07:00

    debug 吞吐量办法

    Debug 网络质量的时候,我们一般会关注两个因素:延迟和吞吐量(带宽)。延迟比较好验证,Ping 一下或者 mtr[1] 一下就能看出来。这篇文章分享一个 debug 吞吐量
    的头像 发表于 08-23 09:17 688次阅读