跨机房大文件同步需动态适配--bwlimit:先用iperf3实测p95带宽×0.65设限速值(如60000kb/s),禁用-z,配置ssh心跳与chronyd校时,用轮询+状态标记替代inotify,--checksum校验替代--update/--delete。

跨机房大文件同步时,rsync --bwlimit不是简单加个数值就能稳住带宽的——它需要结合链路实测、网络波动和业务容忍度做动态适配。硬设固定值容易在高峰时段卡顿,或在低峰期浪费资源。核心思路是:先测准可用带宽,再留余量限速,同时用参数组合保连接不断、传得完整。
按实际出口带宽的60%–70%设限速值
机房专线标称带宽≠实测稳定吞吐。比如一条千兆专线,实测持续传输往往只有80MB/s(即640Mbps),此时--bwlimit应设为60000(单位KB/s),而非按1000MB/s盲目设1000000。建议在非业务时段用iperf3跑30分钟压测,取P95稳定值再乘以0.65作为基准。
- 命令示例:
rsync -av --partial --progress --bwlimit=60000 /data/bigfile.bin user@dst:/backup/ - 若同步对象是大量小文件,可适当下调至50%–60%,因元数据交互开销更大
- 避免设为整数倍如10000/20000——某些老旧防火墙对整数限速阈值敏感,易触发误限流
禁用压缩,优先保障传输稳定性
跨机房场景下,CPU比带宽便宜,启用-z会增加两端计算负担,反而拉长整体耗时,还可能因压缩率波动导致瞬时发包不均,加剧丢包。实测显示,对已压缩格式(如.zip、.mp4、.sql.gz)再压缩,传输速度下降15%–30%,且CPU使用率飙升。
- 直接去掉-z参数,保留--partial --progress确保断点续传
- 若源端文件未压缩且网络极差(RTT>100ms),可尝试--compress-level=1(最低压缩比),但需提前验证效果
配合SSH心跳与chronyd校时防中断
跨机房链路常有NAT超时、中间设备清理空闲连接等问题。单纯限速不能解决连接闪断,必须叠加保活机制:
- 在~/.ssh/config中为远端主机配置:
Host dst-server<br> HostName x.x.x.x<br> ServerAliveInterval 30<br> ServerAliveCountMax 3
- 全网统一用chronyd做时间同步,误差控制在±10ms内;时间偏差>1s会导致rsync部分校验失败或--update逻辑异常
- 同步命令中显式指定SSH选项:
rsync -av -e "ssh -o ServerAliveInterval=30" --bwlimit=60000 ...
用轮询+状态标记替代inotify实时监听
跨机房环境不建议用inotify + rsync自动触发同步——网络延迟会导致事件堆积、重复触发或漏触发。更稳妥的做法是:定时轮询+文件状态标记。
- 每15分钟执行一次rsync,但只同步带特定后缀(如.tmp→.done)或落盘超过5分钟的文件
- 同步成功后,用touch生成时间戳文件(如
touch /data/.synced_$(date +%s)),便于故障时快速定位断点 - 禁用--delete和--update,改用--checksum强制校验,避免因时钟不同步或软链接变更引发误删










