You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多rsync并行提速脚本异常,求有效优化方案

并行rsync提速方案及问题解决

为什么你的nohup后台方案失效?

进程状态显示为T(停止状态),通常是因为rsync后台运行时,终端的标准输入/输出未正确处理,导致进程被终端信号(如SIGTSTP)挂起。虽然可以通过重定向IO临时解决,但更可靠的是用专门的并行任务管理方式。

可行的并行rsync方案

1. 用Python并发库管控并行任务

利用concurrent.futures.ThreadPoolExecutor(IO密集型任务优先用线程池)控制5个并行rsync进程,避免shell后台的不可控问题:

import subprocess
from concurrent.futures import ThreadPoolExecutor

def sync_directory(dir_name):
    rsync_cmd = 'rsync --partial --append --progress -av root@my.hopto.org:"/media/{}" ./test/'.format(dir_name)
    print(f"启动同步任务: {rsync_cmd}")
    result = subprocess.run(rsync_cmd, shell=True)
    if result.returncode == 0:
        print(f"目录 {dir_name} 同步完成")
    else:
        print(f"目录 {dir_name} 同步失败,返回码: {result.returncode}")

# 获取远程服务器/media/下的目录列表
ls_cmd = "ssh root@my.hopto.org ls /media/"
output = subprocess.run(ls_cmd, shell=True, capture_output=True, text=True).stdout
dir_list = output.splitlines()

# 启动线程池,最多并行5个任务
with ThreadPoolExecutor(max_workers=5) as executor:
    # 只处理前6个目录(索引0-5)
    for idx, dir_name in enumerate(dir_list):
        if idx > 5:
            break
        executor.submit(sync_directory, dir_name)

这个方案由Python原生管控并行任务,能直观监控每个任务的完成状态,无需依赖shell后台机制。

2. 用GNU Parallel批量启动并行rsync

如果不想写Python脚本,直接用GNU Parallel工具可快速实现并发控制:

# 获取远程前6个目录,并行启动5个rsync任务
ssh root@my.hopto.org ls /media/ | head -6 | parallel -j 5 rsync --partial --append --progress -av root@my.hopto.org:"/media/{}" ./test/
  • -j 5:指定最大并发数为5
  • head -6:过滤出前6个目录(和你原脚本逻辑一致)
  • Parallel会自动分配任务,确保同时运行的进程不超过5个

3. 优化rsync单进程速度(配合并行效果更好)

即使启用并行,优化rsync本身的参数也能进一步提升单进程传输效率:

  • 调整块大小:大文件传输时,用--block-size=10M(默认约700KB)减少网络交互次数
  • 启用压缩:传输文本/未压缩文件时,添加-z参数(或在ssh层面用--rsh='ssh -C',避免重复压缩)
  • 稳定ssh连接:用--rsh='ssh -o TCPKeepAlive=yes -o ServerAliveInterval=30'防止连接超时断开
  • 跳过增量检查(首次传输):如果是第一次同步无历史文件,添加--whole-file直接传输整个文件,节省校验时间
  • 精简同步参数:不需要权限/时间同步时,去掉-a的部分特性,改用-r(递归)+按需参数

修复原nohup方案(应急用,不推荐)

如果坚持用shell后台方式,需要重定向rsync的标准输入/输出到/dev/null,避免终端IO导致进程挂起:

cmd = 'nohup rsync --partial --append --progress -av root@my.hopto.org:"/media/{}" ./test/ > /dev/null 2>&1 &'.format(a)

但这种方式无法监控任务状态,出现问题难以排查,优先推荐前两种方案。


内容的提问来源于stack exchange,提问作者whitebear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:20:32