scp -l 参数仅支持以Kbit/s为单位的绝对速率限制,不支持百分比或权重分配;需结合tc等系统级流量管理才能实现带宽资源保障。

直接用 scp -l 参数就能限制带宽,但它控制的是绝对速率(Kbit/s),不是“权重”。Linux 的 scp 本身不支持按百分比或权重分配带宽,只支持固定上限值。要实现带宽资源保障,关键在于把限速值设得合理,并配合系统级流量管理。
scp -l 限速的基本用法和单位换算
scp 的 -l 选项单位是 Kbit/s(千比特每秒),不是 KB/s(千字节每秒)。这点容易混淆:
- -l 8000 → 限制为 8000 Kbit/s = 1000 KB/s(即约 1 MB/s)
- -l 4000 → 实际传输速度约 500 KB/s
- 若你共享链路总带宽是 100 Mbps(即 100,000 Kbit/s),想留给业务留 80%,那 scp 最多可用 20% → 建议设 -l 20000(20 Mbps)
仅靠 -l 不足以保障业务资源的原因
scp -l 是应用层限速,依赖 SSH 连接自身节奏,无法感知网络拥塞、不参与内核 QoS 调度,也无法区分优先级流。在高并发或突发流量下,它可能:
- 实际速率波动较大(如显示 127 KB/s,但瞬时冲到 200+)
- 与其他进程(如 nginx、数据库同步)争抢 TCP 发送缓冲区,仍可能打满出口
- 对已建立的其他 SSH 会话无约束力
真正保障业务带宽的组合方案
若需强保障,建议分两层控制:
- 上层:scp -l 设保守上限(例如总带宽的 15–20%),作为第一道防线
-
底层:用 tc + cgroups 或 firewall 标记做系统级整形,例如:
- 给 scp 所用的 SSH 连接打 DSCP 标签(如 CS1),再用 tc htb 按标记限速
- 或限制特定用户(如 backup 用户)的总出口带宽,不管它跑 scp 还是 rsync
- 生产环境更推荐改用 rsync + --bwlimit(单位是 KB/s,更直观),再配合 tc 精确控流
一个实用的限速操作示例
假设你有一条 1 Gbps 共享线路,希望备份任务最多占 100 Mbps,且不影响核心服务:
- 先估算:100 Mbps = 100,000 Kbit/s → 使用 scp -l 100000
- 加 -C 启用压缩,减少实际字节数(对文本/日志类文件效果明显)
- 命令示例:
scp -l 100000 -C /data/backup.tar.gz admin@10.1.2.3:/backups/ - 同时在服务器端用 tc 对该 IP 或端口做出口限速,双重保险











