为何iperf带宽高于dd+netcat?1Gb以太网测速差异疑问
为啥iperf和dd+nc测出来的带宽差一半?
嘿,这个问题我之前帮朋友排查过类似的情况,咱们拆解一下核心原因,再给你几个验证方向:
1. 两种测试的本质完全不一样
iperf是专门为网络带宽测试设计的工具,它的数据流是纯内存生成的——不需要读磁盘、不需要解码文件,就是往网络里塞尽可能多的数据包,目标是把网络链路榨到满负荷,测的是你的以太网接口能达到的理论峰值带宽。
而你用的命令:
$ dd if=/media/sd0p1/Videos/20180221_164356.mp4 bs=1M | nc 192.168.0.2 5001
这个链路的瓶颈可不止网络:
- 磁盘IO拖后腿:你是从SD卡读视频文件,普通SD卡的连续读取速度大多在20-50MB/s之间(甚至更低,如果是老卡或者低速卡),这个速度本身可能就只有iperf结果的一半;
- 处理器算力不够:你的设备是Cortex-A8双核600MHz,处理磁盘读取、管道数据转发、TCP协议栈这些操作的时候,CPU可能已经跑满了,没法给网络传输分配更多资源;
- nc没有网络优化:netcat只是个简单的数据流转发工具,不像iperf会自动调优TCP窗口大小、用多线程(可选)来最大化带宽利用率,默认状态下它的传输效率本来就不如iperf。
2. TCP协议层面的差异
iperf默认会根据链路情况自动调整TCP滑动窗口大小,尽可能让窗口填满,减少等待ACK确认的时间,把带宽利用率拉到最高。
而nc用的是系统默认的TCP参数,嵌入式系统的默认TCP窗口通常比较小,导致传输过程中频繁等待对方的确认包,带宽自然上不去。
3. 怎么验证和优化?
给你几个步骤来定位问题:
- 先测本地磁盘速度:在嵌入式设备上跑这个命令,看看SD卡的读取速度:
如果这个速度和你用nc测的带宽差不多,那就是SD卡拖了后腿;dd if=/media/sd0p1/Videos/20180221_164356.mp4 of=/dev/null bs=1M - 绕开磁盘测网络:用内存生成数据来测试,看看是不是能接近iperf的结果:
(注意:dd if=/dev/zero bs=1M count=1000 | nc 192.168.0.2 5001count=1000是生成1GB的数据,避免占满内存) - 试试iperf的文件传输模式:用iperf直接传这个视频文件,对比结果:
这个模式下iperf会做优化,应该比dd+nc快不少;iperf -c 192.168.0.2 -i 1 -t 10 -F /media/sd0p1/Videos/20180221_164356.mp4 - 优化TCP参数(可选):如果是TCP窗口的问题,可以临时调整嵌入式系统的TCP参数试试:
调整完再用nc测一次,看看有没有提升。echo 1 > /proc/sys/net/ipv4/tcp_window_scaling echo 1048576 > /proc/sys/net/core/wmem_max
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

