使用同时/并发文件传输来加速rsync?

139
我们需要尽可能快地从一个服务器向另一个服务器传输 15TB 的数据。我们目前正在使用 rsync,但我们只能获得大约每秒钟 150Mb/s 的速度,而我们的网络支持的速度是 900+Mb/s(使用iperf测试)。我已经对磁盘、网络等进行了测试,发现rsync一次只能传输一个文件,这就导致了减速。
我找到了一个脚本,在目录树中的每个文件夹中运行不同的rsync(允许您将其限制为x个),但我无法使其工作,它仍然只会一次运行一个rsync。
我在这里找到了这个脚本(下面是复制的)。
我们的目录树结构如下:
/main
   - /files
      - /1
         - 343
            - 123.wav
            - 76.wav
         - 772
            - 122.wav
         - 55
            - 555.wav
            - 324.wav
            - 1209.wav
         - 43
            - 999.wav
            - 111.wav
            - 222.wav
      - /2
         - 346
            - 9993.wav
         - 4242
            - 827.wav
      - /3
         - 2545
            - 76.wav
            - 199.wav
            - 183.wav
         - 23
            - 33.wav
            - 876.wav
         - 4256
            - 998.wav
            - 1665.wav
            - 332.wav
            - 112.wav
            - 5584.wav

我的希望是针对/main/files目录中的每个子目录创建一个rsync,最多同时运行5个。在这种情况下,将运行3个rsync,分别用于/main/files/1、/main/files/2和/main/files/3。

我试过像这样去做,但只会一次运行/main/files/2目录下的一个rsync:

#!/bin/bash

# Define source, target, maxdepth and cd to source
source="/main/files"
target="/main/filesTest"
depth=1
cd "${source}"

# Set the maximum number of concurrent rsync threads
maxthreads=5
# How long to wait before checking the number of rsync threads again
sleeptime=5

# Find all folders in the source directory within the maxdepth level
find . -maxdepth ${depth} -type d | while read dir
do
    # Make sure to ignore the parent folder
    if [ `echo "${dir}" | awk -F'/' '{print NF}'` -gt ${depth} ]
    then
        # Strip leading dot slash
        subfolder=$(echo "${dir}" | sed 's@^\./@@g')
        if [ ! -d "${target}/${subfolder}" ]
        then
            # Create destination folder and set ownership and permissions to match source
            mkdir -p "${target}/${subfolder}"
            chown --reference="${source}/${subfolder}" "${target}/${subfolder}"
            chmod --reference="${source}/${subfolder}" "${target}/${subfolder}"
        fi
        # Make sure the number of rsync threads running is below the threshold
        while [ `ps -ef | grep -c [r]sync` -gt ${maxthreads} ]
        do
            echo "Sleeping ${sleeptime} seconds"
            sleep ${sleeptime}
        done
        # Run rsync in background for the current subfolder and move one to the next one
        nohup rsync -a "${source}/${subfolder}/" "${target}/${subfolder}/" </dev/null >/dev/null 2>&1 &
    fi
done

# Find all files above the maxdepth level and rsync them as well
find . -maxdepth ${depth} -type f -print0 | rsync -a --files-from=- --from0 ./ "${target}/"
12个回答

180

更新的答案(2020年1月)

xargs现在是推荐的工具,用于实现并行执行。它几乎已经预装在所有地方。要运行多个rsync任务,命令将是:

ls /srv/mail | xargs -n1 -P4 -I% rsync -Pa % myserver.com:/srv/mail/

这将列出/srv/mail中的所有文件夹,将它们传输到xargs,然后逐个读取并同时运行4个rsync进程。在每个命令调用中,%字符替换输入参数。
使用parallel的原始答案:
ls /srv/mail | parallel -v -j8 rsync -raz --progress {} myserver.com:/srv/mail/{}

19
请注意,如果您通过各种方式自定义了ls命令的输出,例如使用LISTFLAGS变量或DIR_COLORS文件,那么您可能需要使用ls --indicator-style=none选项来防止ls在路径名后面添加符号(例如可执行文件的*) 。 - chadrik
4
如果我使用了 cd /sourcedir ; parallel -j8 -i rsync -aqH {} /destdir/{} -- * 我发现效果更好。 - Criggie
那是一个占位符,用于在从“ls”命令中获取的文件名之前进行管道传输。 “man parallel”应该有更多细节。我相信“find”命令也是如此。 - Manu
2
这不是一个高效的解决方案,如此所示:https://unix.stackexchange.com/questions/189878/parallelise-rsync-using-gnu-parallel 该解决方案将为列表中的每个文件创建一个rsync调用。 - Prometheus
3
这个答案非常有帮助!我建议在rsync之前加上--sshdelay 0.2,以确保不会过载远程服务器上的sshd。 - pzelasko
显示剩余11条评论

61

你尝试过使用rclone.org吗?

使用rclone,你可以做类似这样的事情

rclone copy "${source}/${subfolder}/" "${target}/${subfolder}/" --progress --multi-thread-streams=N

--multi-thread-streams=N 表示您希望启动的线程数。


1
致命错误:未知标志:--multi-thread-streams - Stepan Yakovenko
3
@StepanYakovenko 我测试了这个标志,在版本1.55.1中工作正常:rclone copy killmouseaccel killmouseaccel2 --multi-thread-streams=4 --progress 2021/06/01 13:50:30 注意:找不到配置文件-使用默认值 传输:0 / 0字节,-,0字节/秒,剩余时间- 传输:1 / 1,100% 经过时间:0.0秒 - dantebarba
15
最佳选择。只需使用32个流运行,速度几乎比使用Finder或rsync复制快50倍。 - Haine
1
@soulmachine 第一个是基于下载块生成线程,而转移是指rclone可以执行的最大同时下载数量。使用多线程流,您可以将一个文件下载并分成同时下载的块。但是,如果您只下载一个文件,则“--transfers”选项不会有任何区别。 - dantebarba
2
今天我学习了rclone - 非常感谢,我认为这将满足我的需求。我需要复制大量小文件,如2MB,但由于我可爱的互联网连接使用多个上传套接字而不是一个套接字更好地工作,因此需要并行分块。谢谢! - Piotr Kula
显示剩余3条评论

41

rsync 是一种在网络上传输文件的工具,能以最快的速度传输文件。例如,可以尝试使用它来复制一个目标上完全不存在的大文件。那个速度是 rsync 能够传输数据的最大速度。可以与 scp(例如)的速度进行比较。当目标文件存在时,rsync 在原始传输方面甚至更慢,因为双方必须就文件的哪些部分发生更改进行双向通信,但通过识别不需要传输的数据,能够弥补这一点。

并行运行 rsync 的一种更简单的方式是使用parallel。下面的命令将同时运行最多5个rsync,每个复制一个目录。请注意,瓶颈可能不是网络,而是CPU和磁盘的速度,并且并行运行会使所有任务变得更慢,而不是更快。

run_rsync() {
    # e.g. copies /main/files/blah to /main/filesTest/blah
    rsync -av "$1" "/main/filesTest/${1#/main/files/}"
}
export -f run_rsync
parallel -j5 run_rsync ::: /main/files/*

5
使用命令 apt-get install moreutils 安装 parallel - codersofthedark
11
虽然复制单个文件时会尽可能地快,但很多时候似乎会有某种限制,使得同时传输的文件不会影响彼此的带宽,这意味着并行传输比单个传输更有效率和更快。 - EkriirkE
如何在Linux中安装Parallel? - PKHunter
1
鉴于答案链接到GNU parallel网站,应该注意moreutils软件包安装了一个具有相同名称的不同二进制文件。两者都将接受此答案中给出的参数,但如果您正在阅读GNU文档,则应使用apt-get install parallel安装GNU版本。 - sjy
@Gaia 取决于硬件。请自行进行基准测试。 - Ярослав Рахматуллин
显示剩余5条评论

33

您可以使用支持同时运行多个进程的xargs。对于您的情况,它将是:

ls -1 /main/files | xargs -I {} -P 5 -n 1 rsync -avh /main/files/{} /main/filesTest/

13

网络上列出了许多替代工具和方法, 用于执行此操作。例如:

  • NCSA Blog网站中提供了使用xargsfind在大多数*nix系统上并行化rsync的描述,而不必安装任何新软件。

  • parsync提供了一个功能丰富的Perl包装器,用于并行运行rsync。


18
请不要仅仅将某些工具或库作为答案发布。至少在答案中演示它是如何解决问题的。 - Baum mit Augen
2
@i_m_mahii Stack Exchange 应该自动保存链接页面的副本。 - Franck Dernoncourt
parsync很棒。 - James Hirschorn
21
与其他人说的相反,提出仅是工具的解决方案确实对我们中的一些人有帮助。显然,“遵从或离开!”这群人并不只是想帮助别人。因此,感谢您代表那些今天从您的帖子中刚刚发现这两个软件包的人以及意识到在没有这些软件包的情况下也可以使用xarg和find来完成任务的人发布了您的帖子,并让选民去做他们的事情,忽略那些似乎时不时地在这里“执行”的苦涩的“离开我的网站”的家伙。 - TheSatinKnight
3
由于我们中很多人已经知道我们正在寻找什么,同时由于OP提供了详细的问题,因此在这里提出一个高级用例是适当的。我不想要一些通用的例子(无论如何,我也不应该将其复制粘贴到我的应用程序中),以说明如何使用这些工具;我会阅读文档并自己弄明白。信任但需验证。 - nicorellius
我也不同意那个学究式的答案。知道哪些工具适用于这项任务可以解决80%的问题。 - Gabriel Magana

12

加速rsync的3-4个技巧。

1. 从/到本地网络复制:不要使用ssh

如果你在本地将一个服务器复制到另一个服务器,传输过程中没有必要加密数据!

默认情况下,rsync使用ssh通过网络传输数据。为了避免这种情况,你需要在目标主机上创建一个rsync服务器。你可以通过类似以下方式运行守护进程:

rsync --daemon --no-detach --config filename.conf

最简配置文件的样子可能是这样的:(参见man rsyncd.conf

filename.conf

port = 12345
[data]
       path = /some/path
       use chroot = false

那么

rsync -ax rsync://remotehost:12345/data/. /path/to/target/.
rsync -ax /path/to/source/. rsync://remotehost:12345/data/.

1.1. 限制连接的最小化rsyncd.conf配置文件。

关于jeremyjjbrown的评论关于安全性的问题,这里是一个使用专用网络接口的最小化配置示例:

主要公共服务器:

eth0:  1.2.3.4/0          Public address Main
eth1:  192.168.123.45/30  Backup network

一个30位的网络只能容纳两个主机。
┏━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━┯━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━┓
┃ Network base│192.168.123.44 │         #0│11000000 10101000 01111011 001011│00┃
┃ Mask        │255.255.255.252│/30        │11111111 11111111 11111111 111111│00┃
┃ Broadcast   │192.168.123.47 │         #3│11000000 10101000 01111011 001011│11┃
┃ Host/net    │2              │Class C    │                                 │  ┃
┠─────────────┼───────────────┼───────────┼─────────────────────────────────┼──┨
┃▸First host  │192.168.123.45 │         #1│11000000 10101000 01111011 001011│01┃
┃ Last host   │192.168.123.46 │         #2│11000000 10101000 01111011 001011│10┃
┗━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━┷━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━┛
备份服务器:
eth0:  1.2.3.5/0          Public address Backup
eth1:  192.168.123.46/30  Backup network

cat >/etc/rsyncd.conf <<eof
address 192.168.123.46
[main]
    path    = /srv/backup/backup0
    comment = Backups
    read only       = false
    uid     = 0
    gid     = 0
eof

所以rsync只会监听连接到192.168.123.46(也就是第二个网络接口)的连接。
然后rsync从主服务器运行。
rsync -zaSD --zc zstd --delete --numeric-ids /mnt/. rsync://192.168.123.46/main/.

当然,在防火墙中添加一些规则可能并非完全无用。
iptables -I INPUT -i eth0 -p tcp --dport 873 -j DROP

2. 使用 zstandard zstd 进行高速压缩

Zstandard 可以比 常见的 gzip8倍。因此,使用这种更新的压缩算法将显著提高您的传输速度!

rsync -axz --zc=zstd rsync://remotehost:12345/data/. /path/to/target/.
rsync -axz --zc=zstd /path/to/source/. rsync://remotehost:12345/data/.

也许还可以使用一些--exclude指令(请参见本答案底部!)。

3. 使用多路复用的rsync来减少因浏览时间而导致的不活动

两个重要说明:

由于这种优化涉及磁盘访问和文件系统结构,与CPU数量无关!因此,即使您的主机使用单核CPU,这也可以提高传输效率。如果您计划使用任何并行化工具,请告诉它不要考虑物理CPU的数量。

由于目标是确保在其他任务浏览文件系统时尽可能利用带宽的最大数据量,同时进行的进程数取决于存在的小文件数量。

3.1 使用wait -n -p PID脚本:

最近的bash版本为wait内置命令添加了一个-p PID功能。对于这类作业来说,这是必备的:

#!/bin/bash

maxProc=3
source=''
destination='rsync://remotehost:12345/data/'

declare -ai start elap results order
wait4oneTask() {
    local _i
    wait -np epid
    results[epid]=$?
    elap[epid]=" ${EPOCHREALTIME/.} - ${start[epid]} "
    unset "running[$epid]"
    while [ -v elap[${order[0]}] ];do
        _i=${order[0]}
        printf " - %(%a %d %T)T.%06.0f %-36s %4d %12d\n" "${start[_i]:0:-6}" \
               "${start[_i]: -6}" "${paths[_i]}" "${results[_i]}" "${elap[_i]}"
        order=(${order[@]:1})
    done
}
printf "   %-22s %-36s %4s %12s\n" Started Path Rslt 'microseconds'
for path; do
    rsync -axz --zc zstd "$source$path/." "$destination$path/." &
    lpid=$!
    paths[lpid]="$path" 
    start[lpid]=${EPOCHREALTIME/.}
    running[lpid]=''
    order+=($lpid)
    ((${#running[@]}>=maxProc)) && wait4oneTask
done
while ((${#running[@]})); do
    wait4oneTask
done

输出可能如下所示:
myRsyncP.sh files/*/*
   Started                Path                                 Rslt microseconds
 - Fri 03 09:20:44.673637 files/1/343                             0      1186903
 - Fri 03 09:20:44.673914 files/1/43                              0      2276767
 - Fri 03 09:20:44.674147 files/1/55                              0      2172830
 - Fri 03 09:20:45.861041 files/1/772                             0      1279463
 - Fri 03 09:20:46.847241 files/2/346                             0      2363101
 - Fri 03 09:20:46.951192 files/2/4242                            0      2180573
 - Fri 03 09:20:47.140953 files/3/23                              0      1789049
 - Fri 03 09:20:48.930306 files/3/2545                            0      3259273
 - Fri 03 09:20:49.132076 files/3/4256                            0      2263019

快速检查:
printf "%'d\n" $(( 49132076 + 2263019 - 44673637)) \
    $((1186903+2276767+2172830+1279463+2363101+2180573+1789049+3259273+2263019))
6721458
18770978

处理18.77秒的时间经过了6.72秒,最多有三个子进程。

注意:您可以使用musec2str来改善输出,通过将第一个长printf行替换为:

        musec2str -v elapsed "${elap[i]}"
        printf " - %(%a %d %T)T.%06.0f %-36s %4d %12s\n" "${start[i]:0:-6}" \
               "${start[i]: -6}" "${paths[i]}" "${results[i]}" "$elapsed"

myRsyncP.sh files/*/*
   Started                Path                                 Rslt      Elapsed
 - Fri 03 09:27:33.463009 files/1/343                             0   18.249400"
 - Fri 03 09:27:33.463264 files/1/43                              0   18.153972"
 - Fri 03 09:27:33.463502 files/1/55                             93   10.104106"
 - Fri 03 09:27:43.567882 files/1/772                           122   14.748798"
 - Fri 03 09:27:51.617515 files/2/346                             0   19.286811"
 - Fri 03 09:27:51.715848 files/2/4242                            0    3.292849"
 - Fri 03 09:27:55.008983 files/3/23                              0    5.325229"
 - Fri 03 09:27:58.317356 files/3/2545                            0   10.141078"
 - Fri 03 09:28:00.334848 files/3/4256                            0   15.306145"

你可以通过对这个脚本进行一些编辑来添加总体统计数据。
#!/bin/bash

maxProc=3  source=''  destination='rsync://remotehost:12345/data/'

. musec2str.bash # See https://dev59.com/imct5IYBdhLWcg3wSrl3#72316403

declare -ai start elap results order
declare -i sumElap totElap

wait4oneTask() {
    wait -np epid
    results[epid]=$?
    local -i _i crtelap=" ${EPOCHREALTIME/.} - ${start[epid]} "
    elap[epid]=crtelap sumElap+=crtelap
    unset "running[$epid]"
    while [ -v elap[${order[0]}] ];do  # Print status lines in command order.
        _i=${order[0]}
    musec2str -v helap ${elap[_i]}
        printf " - %(%a %d %T)T.%06.f %-36s %4d %12s\n" "${start[_i]:0:-6}" \
               "${start[_i]: -6}" "${paths[_i]}" "${results[_i]}" "${helap}"
        order=(${order[@]:1})
    done
}
printf "   %-22s %-36s %4s %12s\n" Started Path Rslt 'microseconds'
for path;do
    rsync -axz --zc zstd "$source$path/." "$destination$path/." &
    lpid=$! paths[lpid]="$path" start[lpid]=${EPOCHREALTIME/.}
    running[lpid]='' order+=($lpid)
    ((${#running[@]}>=maxProc)) &&
        wait4oneTask
done
while ((${#running[@]})) ;do
    wait4oneTask
done

totElap=${EPOCHREALTIME/.}
for i in ${!start[@]};do  sortstart[${start[i]}]=$i;done
sortstartstr=${!sortstart[*]}
fstarted=${sortstartstr%% *}
totElap+=-fstarted
musec2str -v hTotElap $totElap
musec2str -v hSumElap $sumElap
printf " = %(%a %d %T)T.%06.0f %-41s %12s\n" "${fstarted:0:-6}" \
   "${fstarted: -6}" "Real: $hTotElap, Total:" "$hSumElap"

可以生产:

$ ./parallelRsync Data\ dirs-{1..4}/Sub\ dir{A..D}
   Started                Path                                 Rslt microseconds
 - Sat 10 16:57:46.188195 Data dirs-1/Sub dirA                    0     1.69131"
 - Sat 10 16:57:46.188337 Data dirs-1/Sub dirB                  116    2.256086"
 - Sat 10 16:57:46.188473 Data dirs-1/Sub dirC                    0      1.1722"
 - Sat 10 16:57:47.361047 Data dirs-1/Sub dirD                    0    2.222638"
 - Sat 10 16:57:47.880674 Data dirs-2/Sub dirA                    0    2.193557"
 - Sat 10 16:57:48.446484 Data dirs-2/Sub dirB                    0    1.615003"
 - Sat 10 16:57:49.584670 Data dirs-2/Sub dirC                    0    2.201602"
 - Sat 10 16:57:50.061832 Data dirs-2/Sub dirD                    0    2.176913"
 - Sat 10 16:57:50.075178 Data dirs-3/Sub dirA                    0    1.952396"
 - Sat 10 16:57:51.786967 Data dirs-3/Sub dirB                    0    1.123764"
 - Sat 10 16:57:52.028138 Data dirs-3/Sub dirC                    0    2.531878"
 - Sat 10 16:57:52.239866 Data dirs-3/Sub dirD                    0    2.297417"
 - Sat 10 16:57:52.911924 Data dirs-4/Sub dirA                   14    1.290787"
 - Sat 10 16:57:54.203172 Data dirs-4/Sub dirB                    0    2.236149"
 - Sat 10 16:57:54.537597 Data dirs-4/Sub dirC                   14    2.125793"
 - Sat 10 16:57:54.561454 Data dirs-4/Sub dirD                    0     2.49632"
 = Sat 10 16:57:46.188195 Real: 10.870221", Total:                    31.583813"

用于测试此脚本的伪造的rsync

注意:为了测试这个,我使用了一个伪造的rsync

## Fake rsync wait 1.0 - 2.99 seconds and return 0-255 ~ 1x/10
rsync() { sleep $((RANDOM%2+1)).$RANDOM;exit $(( RANDOM%10==3?RANDOM%128:0));}
export -f rsync

4. 加快rsync进程的重要步骤:避免减慢它的速度!!
你可能需要一些时间来适当配置避免同步无用数据的方式!!
在man页面中搜索exclude和/或include
  --cvs-exclude, -C        auto-ignore files in the same way CVS does
  --exclude=PATTERN        exclude files matching PATTERN
  --exclude-from=FILE      read exclude patterns from FILE
  --include=PATTERN        don't exclude files matching PATTERN
  --include-from=FILE      read include patterns from FILE
为了保存用户目录,我经常使用以下方法:
rsync -axz --delete --zc zstd --exclude .cache --exclude cache  source/. target/.

请仔细阅读 man 手册中的 FILTER RULES 部分。
man -P'less +/^FILTER\ RULES' rsync

结论:

安静地阅读 man 手册吧!man rsyncman rsyncd.conf !!


如果你正在将服务器本地复制到另一个位置,传输过程中没有必要加密数据!这是一种完全过时的态度。 - jeremyjjbrown
@jeremyjjbrown 或许,这取决于你的本地基础设施……但是有很多情况(例如使用专用物理网络),你可以避免加密以减少占用空间。 - F. Hauri - Give Up GitHub
@jeremyjjbrown 是的,但也不是!!有很多情况下 - 比如使用专用物理网络进行采样 - 避免加密会显著减少占用空间并加快传输速度!当然,你需要正确配置你的网络、*rsyncd.conf*和可能的防火墙!但你的评论并不完全正确! - F. Hauri - Give Up GitHub
@jeremyjjbrown 回复你的评论,我已经编辑了我的回答(今天)。随时修改你的投票吧!;-) - F. Hauri - Give Up GitHub
@jeremyjjbrown 添加了第四个重要的步骤来加快rsync的速度! - F. Hauri - Give Up GitHub

11
我开发了一个名为parallel_sync的Python包,https://pythonhosted.org/parallel_sync/pages/examples.html这是使用示例。下面是一个简单的样例代码:
from parallel_sync import rsync
creds = {'user': 'myusername', 'key':'~/.ssh/id_rsa', 'host':'192.168.16.31'}
rsync.upload('/tmp/local_dir', '/tmp/remote_dir', creds=creds)

默认情况下,同时处理的任务数为10; 您可以增加它:
from parallel_sync import rsync
creds = {'user': 'myusername', 'key':'~/.ssh/id_rsa', 'host':'192.168.16.31'}
rsync.upload('/tmp/local_dir', '/tmp/remote_dir', creds=creds, parallelism=20)

请注意,SSH默认情况下通常将MaxSessions设置为10,因此如果要将其增加到10以上,则需要修改您的SSH设置。


异常:以下命令执行失败:find "./30mins" -noleaf -type f -name "*" - Stepan Yakovenko
哦,哇哦。只是哇哦。 - user189035
@max:你能否允许留空键的选项?比如那些通过 VPN 连接但不使用它的人。 - user189035
1
@user189035 好的。我刚刚发布了1.16版本,应该允许您在不指定任何密钥的情况下传递凭据。如果遇到任何错误,请告诉我。 - max

6
我发现最简单的方法是在shell中使用后台作业:
for d in /main/files/*; do
    rsync -a "$d" remote:/main/files/ &
done

注意,它不限制作业的数量!如果您受到网络限制,这并不是一个问题,但如果您正在等待旋转硬盘,则会导致磁盘抖动。

您可以添加:

while [ $(jobs | wc -l | xargs) -gt 10 ]; do sleep 1; done

在原始作业控制的循环内部。


4
我找到的最简短的版本是使用parallel--cat选项,如下所示。这个版本避免了使用xargs,仅依赖于parallel的功能:
cat files.txt | \
  parallel -n 500 --lb --pipe --cat rsync --files-from={} user@remote:/dir /dir -avPi

#### Arg explainer
# -n 500           :: split input into chunks of 500 entries
#
# --cat            :: create a tmp file referenced by {} containing the 500 
#                     entry content for each process
#
# user@remote:/dir :: the root relative to which entries in files.txt are considered
#
# /dir             :: local root relative to which files are copied

files.txt的样本内容:

/dir/file-1
/dir/subdir/file-2
....

请注意,这里没有使用-j 50来设置作业数量,因为在我的环境中无法正常工作。相反,我使用了-n 500来设置每个作业的记录数,这个数字是根据总记录数计算出来的一个合理数字。

简洁至上 - Ярослав Рахматуллин

1
我发现UDR/UDT是一个很棒的工具。简而言之,它是rsync的UDT包装器,利用多个UPD连接而不是单个TCP连接。
参考资料:https://udt.sourceforge.io/https://github.com/jaystevens/UDR#udr 如果您使用任何RHEL发行版,它们已经为您预编译了... http://hgdownload.soe.ucsc.edu/admin/udr 我遇到的唯一缺点是无法指定不同的SSH端口,因此您的远程服务器必须使用22号端口。
无论如何,在安装rpm之后,它实际上就像这样简单:
udr rsync -aP user@IpOrFqdn:/source/files/* /dest/folder/

在大多数情况下,您的传输速度将显著提高,具体取决于服务器。我曾经看到过传输速度轻松增加了10倍。
附注:如果您选择先对所有内容进行gzip压缩,请确保使用--rsyncable参数,这样它只会更新已更改的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接