大文件传输的带宽控制
大文件分发的关键约束不是能不能传完,而是不要吃掉同链路上其他业务所需的带宽。控制手段分三层:传输层限速(rsync 的 --bwlimit、scp 的 -l、curl 的 --limit-rate)、网络层限速(Linux tc 的 tbf 队列、云平台带宽包)、时间与并发控制(放到业务低峰、限制同时传输的份数)。此外还要判断压缩是否值得(已压缩内容再压缩只消耗 CPU)、是否需要分片并发,以及断点续传与落地校验。
基本信息
| 限速参数 | rsync --bwlimit(KB/s)、scp -l(Kbit/s)、curl --limit-rate、tc tbf |
|---|---|
| 单位陷阱 | bwlimit 按 KB/s,scp -l 按 Kbit/s,两者相差 8 倍 |
| 并发控制 | 限制并行的传输份数,而不是让每一路都跑满 |
| 前置检查 | 目标端剩余空间与磁盘写入速度 |
典型使用场景
- 跨机房同步镜像或安装包,链路与在线业务共用
- 夜间窗口向数百台主机分发大体积文件
- 从云端拉取数据集,出口带宽按量计费
- 目标端磁盘较慢,传输速度需要匹配写入速度
- 同步必须在窗口内完成,因此速度不能一味压低
限速与分片写法
限速与分片写法
rsync -av --bwlimit=20480 bigfile.iso host:/data/ # 约 20 MB/s 上限
scp -l 80000 bigfile.iso host:/data/ # scp 限速单位是 Kbit/s,约 10 MB/s
curl --limit-rate 10M -o big.iso https://example.com/big.iso # 单连接限速
split -b 1G big.iso part- && rsync -av --bwlimit=20480 part-* host:/data/ # 分片便于续传
tc qdisc add dev eth0 root tbf rate 100mbit burst 2mb latency 50ms # 网卡出口整体限速限速手段与单位
| 手段 | 作用点 | 单位与注意 |
|---|---|---|
| rsync --bwlimit | 传输进程 | KB/s,按秒平滑 |
| scp -l | 传输进程 | Kbit/s,容易与 KB 混淆 |
| curl --limit-rate | 单连接 | 支持 K/M/G 后缀 |
| tc tbf | 网卡出口 | 影响该网卡所有流量 |
| 云带宽包 | 云平台侧 | 与业务共享,注意计费方式 |
压缩只在内容是文本时有效。磁盘镜像、压缩包、加密数据已接近熵上限,再叠加压缩只增加 CPU 占用而几乎不减小体积,这类内容应关闭压缩选项。
传输中途目标端磁盘写满会失败并留下不完整文件。分发前先检查剩余空间,并保证接收侧采用临时文件加原子改名的方式落地,避免半截文件被后续流程当成成品使用。