rsync扫描开销可通过--files-from绕过全量遍历,配合--from0、--size-only、--delete-after及目录分片并发控制,并优化文件系统挂载参数来显著降低。

减少rsync扫描开销:跳过全量文件遍历
千万级小文件下,rsync默认的递归扫描本身就会耗尽内存和I/O资源。关键不是“怎么同步快”,而是“怎么避免反复读取目录树”。建议用--files-from配合增量文件列表,绕过readdir()系统调用风暴:
- 用
find /src -type f -mmin -60 -printf "%P\0" > /tmp/rsync_list.txt生成最近1小时变更文件(支持null分隔,兼容空格路径) - rsync命令改写为:
rsync -av --files-from=/tmp/rsync_list.txt --from0 /src/ user@dst:/dst/ - 务必加
--from0,否则含空格或换行的路径会出错
禁用校验与权限同步:小文件场景下的合理妥协
对纯内容同步(如日志、缓存、临时上传),mtime+size足够判断变更,无需checksum。默认-a隐含-c(checksum)会逐文件MD5,CPU飙升且无必要:
- 去掉
-a,显式组合:rsync -r --size-only --times --delete-after -
--size-only跳过mtime比对(某些NFS或容器挂载可能mtime不准),仅靠大小判定 -
--delete-after比--delete-before更安全,避免误删后源又失败
控制并发与连接粒度:避免单进程阻塞
单rsync进程无法利用多核,且TCP连接在高延迟链路易超时。**不要试图一个rsync吞下全部文件**,应按目录或哈希分片:
- 按首字母分组同步:
for d in {a..z}; do rsync -r --size-only /src/$d*/ user@dst:/dst/ & done; wait - 或用
parallel限制并发数:find /src -mindepth 1 -maxdepth 1 -type d | parallel -j4 rsync -r --size-only {} user@dst:/dst/ - 每路rsync加
--timeout=300防卡死,加--contimeout=30快速失败重试
文件系统层配合:提升底层响应效率
rsync再优化也受限于ext4/xfs的目录索引能力。**千万小文件必须调整存储结构**:
- 禁止将所有文件放在同一目录——改用两级哈希目录,如
/src/ab/cd/ef/file_123456789(前两位+中间两位+后两位) - ext4挂载加
noatime,nodiratime,barrier=0(确认磁盘有断电保护) - 目标端若为机械盘,rsync加
--bwlimit=5000(单位KB/s)避免I/O打满导致系统假死











