rsync 本身是单线程的,不过可以通过一些方式手动并行处理多个 rsync 任务,从而加速大规模文件的同步过程,尤其在处理大量文件时。常见的并行方法包括将文件拆分成小块、使用 GNU Parallel 工具等。
下面我介绍几种并行 rsync 的方法。
1. 手动拆分文件并行同步
如果你的文件夹结构层次比较简单,可以手动将文件按不同的子文件夹拆分同步,分别运行多个 rsync 进程。例如,你有一个目录 /path/to/source,其中包含 100 个子文件夹,可以将它们分成 4 组,分别用 4 个 rsync 进程同步这些文件夹。
示例:
假设 source 目录下有 subfolder1 到 subfolder100,你可以这样同步:
rsync -avz /path/to/source/subfolder1/ /path/to/destination/subfolder1/ &
rsync -avz /path/to/source/subfolder2/ /path/to/destination/subfolder2/ &
rsync -avz /path/to/source/subfolder3/ /path/to/destination/subfolder3/ &
rsync -avz /path/to/source/subfolder4/ /path/to/destination/subfolder4/ &
& 表示在后台运行任务,这样多个同步进程可以同时运行。
2. 使用 GNU Parallel
GNU Parallel 是一个强大的工具,可以并行执行命令,非常适合处理大规模同步任务。你可以结合 rsync 和 GNU Parallel 来自动并行执行多个同步进程。
安装 GNU Parallel
在大多数 Linux 系统上,你可以通过包管理器安装:
sudo apt-get install parallel # Ubuntu/Debian
sudo yum install parallel # CentOS/RHEL
示例:并行同步多个子文件夹
假设你有一个源文件夹 /path/to/source,你想并行同步到 /path/to/destination,可以使用以下命令:
- 首先,获取源目录中的子目录列表:
find /path/to/source -mindepth 1 -maxdepth 1 -type d > dir_list.txt
这个命令会生成一个 dir_list.txt 文件,其中包含所有子目录的路径。
- 使用
GNU Parallel并行同步:
cat dir_list.txt | parallel -j 4 rsync -avz {} /path/to/destination/{/}
解释:
cat dir_list.txt:读取包含目录列表的文件。parallel -j 4:指定并行执行 4 个rsync进程(你可以根据系统性能调整这个数字)。rsync -avz {} /path/to/destination/{/}:{}会被替换为dir_list.txt中的每一行(即每个子目录),{/}表示目录的最后一部分,用于目标路径。
3. 分块文件同步
如果你的源目录下是大量的文件而非子目录,rsync 同步大量小文件时可能会比较慢。你可以通过将文件分块来并行执行 rsync,这可以利用多核 CPU 并加速同步过程。
示例:将文件列表分块并并行同步
- 获取文件列表:
find /path/to/source -type f > file_list.txt
- 将文件列表分成若干部分,比如 4 份:
split -l $(($(wc -l < file_list.txt) / 4 + 1)) file_list.txt file_list_part_
这会将 file_list.txt 文件按行分割成 4 部分,生成 file_list_part_aa、file_list_part_ab 等文件。
- 使用
GNU Parallel并行同步:
ls file_list_part_* | parallel -j 4 'rsync -avz --files-from={} /path/to/source /path/to/destination'
解释:
ls file_list_part_*:列出所有分块后的文件列表。parallel -j 4:指定并行运行 4 个rsync任务。rsync -avz --files-from={}:通过--files-from选项,让rsync仅同步指定的文件列表。
4. 使用 xargs 并行同步
xargs 是另一个可以并行运行命令的工具,可以用于启动多个 rsync 进程。你可以通过将文件列表传递给 xargs,并指定最大并行任务数。
示例:
find /path/to/source -type d -print0 | xargs -0 -n 1 -P 4 -I {} rsync -avz {} /path/to/destination/{/}
解释:
-print0:以 null 字符分隔文件名,适合处理包含特殊字符(如空格)的文件名。xargs -0:配合-print0使用,确保文件名正确处理。-n 1:每次传递一个参数给rsync。-P 4:最多允许 4 个rsync进程同时运行。
5. 监控同步过程
无论你选择哪种并行方法,都可以使用 htop、iotop、ifstat 等工具来监控 CPU、I/O 和网络带宽使用情况,以确保系统不会过载,并根据资源利用情况调整并行进程的数量。
总结:
- 手动并行:可以简单地通过后台运行多个
rsync任务。 - GNU Parallel 和 xargs:自动并行执行多个同步任务,非常适合大规模文件同步。
- 拆分文件列表:通过将文件或目录列表分成多个块,确保每个
rsync任务只同步一部分内容。
这种并行处理方式,特别适合大规模文件的同步,能够大大提升同步速度。