并行化 rsync

stu*_*guy 36 networking rsync parallel-processing

我刚刚搬家,经过一些反复试验后发现,在我家和远程服务器之间的某个地方,有一些节流正在进行......但节流不是很智能。它只限制单个连接。因此,如果我复制一个 1 GB 的文件,它将以 150 kBps 的速度愉快地进行。但是如果我初始化 10 个副本,它们中的每一个都将达到 150 kBps(即我在多个连接上获得了更高的聚合带宽)。

我经常使用 rsync 来同步一些从工作到家庭的大型数据集(幸运的是以许多文件的形式)。有没有办法告诉 rsync 使用多个连接下载?理论上应该是可能的,因为据我所知,rsync 首先进行一次传递以确定必要的更改,然后执行实际传输。如果有一种神奇的方式告诉 rsync 将单个文件切成 N 块,然后再将它们拼接在一起,那就加分了。我相信CuteFTP实际上足够聪明,可以做到这一点。

kkr*_*ron 15

我只是遇到了一个类似的问题,必须将几 TB 从一个 NAS 移动到另一个 NAS,而没有备份/恢复功能,这使我只能将 1 组提供给另一组。

所以我写了这个脚本来使用 xargs go 为它遇到的每个目录运行几个 rsyncs。这取决于能够列出源目录(小心转义 ARG 3),但我认为您可以使用非递归 rsync 设置该阶段,该 rsync 只是将文件和目录复制到适当的级别。

它还根据处理器数量确定要运行的 rsync 数量,但您可能需要对此进行调整。

#! /bin/bash
SRC_DIR=$1
DEST_DIR=$2
LIST=$3
CPU_CNT=`cat /proc/cpuinfo|grep processor |wc -l`
#  pseudo random heuristic
let JOB_CNT=CPU_CNT*4
[ -z "$LIST" ] && LIST="-tPavW --exclude .snapshot --exclude hourly.?"
echo "rsyncing From=$SRC_DIR To=$DEST_DIR DIR_LIST=$LIST"
mkdir -p /{OLD,NEW}_NAS/home
[ -z "$RSYNC_OPTS" ] && RSYNC_OPTS="-tPavW --delete-during --exclude .snapshot --exclude hourly.?"
cd $SRC_DIR
echo $LIST|xargs -n1 echo|xargs -n1 -P $JOB_CNT -I% rsync ${RSYNC_OPTS} ${SRC_DIR}/%/ ${DEST_DIR}/%/
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的——您可以对其工作方式进行很多改进,但是使用 xargs 来并行化您的应用程序的概念非常新颖。 (2认同)

Ole*_*nge 6

GNU Parallel 有一个解决方案。 

我已经通过 1 Gbps 移动了 15 TB,它可以使 1 Gbps 链路饱和。

以下将在 src-dir 到服务器 fooserver 上的 dest-dir 中的每个大文件启动一个 rsync:

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{}
Run Code Online (Sandbox Code Playgroud)

创建的目录可能会以错误的权限结束,并且不会传输较小的文件。最后一次修复那些运行 rsync 的问题:

rsync -Havessh src-dir/ fooserver:/dest-dir/
Run Code Online (Sandbox Code Playgroud)


Dav*_*rtz 1

不。不存在这样的功能。rsync如果您确实愿意,可以将同步拆分为多个调用。

我建议您找到造成这种速率限制的原因,并与维护/管理它的人进行认真的交谈。

  • 这些限制通常来自康卡斯特等某些 ISP。祝你好运与他们进行任何合理的对话。 (4认同)