nuttcp默认单连接,需客户端和服务端均使用-p参数启用并行tcp流;吞吐瓶颈常源于接收窗口不足、cpu绑核不全、网卡多队列未启用或offload未关闭。

nuttcp 默认不支持多线程,必须显式启用
nuttcp 本身是单进程单连接工具,-P 参数才是开启并发流的关键,不是靠系统线程数或 taskset 绑核就能“自动多线程”。很多人跑完 nuttcp -P 4 却发现吞吐没提升,其实是服务端没同步加 -P 4,导致客户端发了 4 路,服务端只收 1 路,其余被丢包或排队阻塞。
-
nuttcp -P 4表示启动 4 个并行 TCP 连接(不是 4 个线程),每个连接独立建连、发包、计时 - 客户端和服务端的
-P值必须一致,否则性能会严重失衡;常见错误是只在 client 加-P 4,server 仍用默认单流 - 如果目标是测单连接极限带宽,别加
-P——加了反而因握手/拥塞控制开销拉低单流速率 -
-P值不宜盲目设高:超过网卡队列深度或远端接收窗口总和后,重传率会上升,nuttcp输出里的retransmits字段会明显跳涨
如何避免因 TCP 窗口和缓冲区导致的假瓶颈
nuttcp 的吞吐常卡在接收端缓冲区大小上,尤其在高延迟链路(如跨机房)中,receive window 不够会导致发送方频繁等待 ACK,看起来像网络慢,其实是内核参数限制。
- 服务端务必调大
net.ipv4.tcp_rmem,例如:echo "net.ipv4.tcp_rmem = 4096 262144 16777216" >> /etc/sysctl.conf,然后sysctl -p - 客户端可加
-w指定发送窗口大小(单位字节),比如nuttcp -w 4194304 -P 4 server_ip,但注意该值不能超过服务端tcp_rmem的最大值 - 用
ss -i在服务端查实时窗口:ss -i dst <code>server_ip,看wscale和rcv_wnd是否撑开;若rcv_wnd长期卡在 64KB,说明窗口没协商成功 - 禁用
tcp_window_scaling(net.ipv4.tcp_window_scaling=0)会直接锁死窗口上限为 65535 字节,高延时场景下必掉速
nuttcp 与 iperf3 的关键差异点(别混用结论)
nuttcp 是“裸 TCP 流量发生器”,不模拟应用层行为,也不做 UDP 模式;iperf3 默认启用了 -Z(零拷贝)和更激进的拥塞控制策略,两者结果不可直接对比。
功能完善、展示信息丰富的电子商店销售平台;针对企业与个人的网上销售系统;开放式远程商店管理;完善的订单管理、销售统计、结算系统;强力搜索引擎支持;提供网上多种在线支付方式解决方案;强大的技术应用能力和网络安全系统,完美的傻瓜开店功能,自主经营,管理后台登陆账号:admin 密码:admin 登陆地址/admin/login.asp商家测试帐号:admin 密码:admin 登陆地址/user/ad
- nuttcp 默认使用
sendfile()(Linux 下),但不支持SO_ZEROCOPY;iperf3 3.1+ 默认启用,对高吞吐有明显加成 - nuttcp 的
-t时间参数是“发送持续时间”,iperf3 的-t是“测试总时长”,后者包含连接建立和结果汇总耗时,实测中 nuttcp 更贴近纯数据面打点 - nuttcp 不报告 jitter 或丢包率(除非加
-u切 UDP 模式),而 iperf3 的 TCP 模式压根不报丢包——因为 TCP 会重传,表面丢包率为 0,实际可能掩盖了底层丢包 - 想测真实丢包影响?必须切
nuttcp -u+-b(指定 UDP 包大小),且两端都要加-P,否则 UDP 多流下无序到达会大幅抬高丢包统计
实测中容易被忽略的三个硬性条件
再正确的命令,只要漏掉其中一条,吞吐就上不去,而且错误现象非常隐蔽——看起来“跑通了”,但数字远低于物理带宽。
- CPU 绑核要双向:客户端和服务端都需用
taskset -c 0,1,2,3 nuttcp ...,否则一个核被占满后,其他流在调度队列里排队,nuttcp显示的“平均速率”其实是时序叠加假象 - 网卡多队列必须启用并绑定:
ethtool -L eth0 combined 4+echo 0 > /proc/irq/*/smp_affinity_list(按实际 IRQ 分配),否则所有中断集中到 CPU 0,成为瓶颈 - 关闭 NIC offload:特别是
tx offload和rx offload,用ethtool -K eth0 tx off rx off gso off tso off,否则nuttcp测出的“带宽”包含硬件加速的虚高部分,无法反映真实协议栈压力
真正卡住 nuttcp 多流性能的,往往不是命令写错,而是这些底层软硬件协同条件没对齐。调一次 sysctl 或 ethtool,可能比改十次 nuttcp 参数更管用。










