如何使用scp同时复制多个文件
How to copy multiple files simultaneously using scp
我想同时复制多个文件以加快我目前使用的流程
scp -r root@xxx.xxx.xx.xx:/var/www/example/example.example.com .
但它一次只复制一个文件。我有一个 100 Mbps 的光纤,所以我有足够的带宽可以同时复制很多东西,请帮忙。
100mbit 以太网实际上很慢。理论上你可以期待 8 MiB/s。实际上,您通常最多只能得到 4-6 MiB/s。
也就是说,如果您 运行 多个并行会话,您不会看到速度提高。您可以自己尝试,只需 运行 两个并行的 SCP 会话复制两个大文件。我的猜测是您不会看到明显的加速。原因是:
- 两台计算机之间网络路径上最慢的组件决定最大。速度。
- 其他人可能会同时访问 example.com,从而减少它可以为您提供的带宽
- 100mbit 以太网要求两个连续的网络数据包之间有相当大的间隙。千兆以太网在这方面要好得多。
解决方案:
- 在通过网络发送之前压缩数据
- 使用像
rsync
这样的工具(它在后台使用 SSH)复制自上次您 运行 命令以来更改的文件。
- 创建大量小文件需要花费大量时间。尝试在远程端创建所有文件的存档并将其作为单个存档发送。
最后的建议可以这样做:
ssh root@xxx "cd /var/www/example ; tar cf - example.example.com" > example.com.tar
或压缩:
ssh root@xxx "cd /var/www/example ; tar czf - example.example.com" > example.com.tar.gz
注意:bzip2
压缩效果更好但更慢。这就是为什么我使用 gzip
(z
) 来完成这样的任务。
如果您指定多个文件,scp 将按顺序下载它们:
scp -r root@xxx.xxx.xx.xx:/var/www/example/file1 root@xxx.xxx.xx.xx:/var/www/example/file2 .
或者,如果您希望并行下载文件,则使用 scp 的多次调用,将每个调用都放在后台。
#! /usr/bin/env bash
scp root@xxx.xxx.xx.xx:/var/www/example/file1 . &
scp root@xxx.xxx.xx.xx:/var/www/example/file2 . &
SSH 能够执行所谓的 "multiplexing" - 通过一台(到一台服务器)建立更多连接。这可能是一种买得起你想要的东西的方式。查找关键字,例如 "ControlMaster"
第二种方法是使用更多连接,然后在后台发送每个作业:
for file in file1 file2 file3 ; do
scp $file server:/tmp/ &
done
但是,这就是您问题的答案 - "How to copy multiple files simultaneously"。为了加快速度,您可以使用较弱的加密(rc4 等)并且不要忘记,瓶颈可能是您的硬盘 - 因为 SCP 不会隐式限制传输速度。
最后一件事是使用 rsync - 在某些情况下,它可能比 scp 快很多...
我不确定这是否对你有帮助,但我通常在源头压缩(不需要压缩。只是存档就足够了)文件,下载它,解压它们。这将显着加快该过程。
在存档之前,下载 1GB 需要 > 8 小时
归档后完成同样的操作需要不到 8 分钟
您可以使用并行 scp(又名 pscp):http://manpages.ubuntu.com/manpages/natty/man1/parallel-scp.1.html
使用此工具,您可以将一个(或多个)文件同时复制到多个主机。
此致,
您可以使用带有等待命令的后台任务。
等待命令确保所有后台任务在处理下一行之前完成。即 echo 将在所有三个节点的 scp 完成后执行。
#!/bin/bash
scp -i anuruddha.pem myfile1.tar centos@192.168.30.79:/tmp &
scp -i anuruddha.pem myfile2.tar centos@192.168.30.80:/tmp &
scp -i anuruddha.pem myfile.tar centos@192.168.30.81:/tmp &
wait
echo "SCP completed"
我想同时复制多个文件以加快我目前使用的流程
scp -r root@xxx.xxx.xx.xx:/var/www/example/example.example.com .
但它一次只复制一个文件。我有一个 100 Mbps 的光纤,所以我有足够的带宽可以同时复制很多东西,请帮忙。
100mbit 以太网实际上很慢。理论上你可以期待 8 MiB/s。实际上,您通常最多只能得到 4-6 MiB/s。
也就是说,如果您 运行 多个并行会话,您不会看到速度提高。您可以自己尝试,只需 运行 两个并行的 SCP 会话复制两个大文件。我的猜测是您不会看到明显的加速。原因是:
- 两台计算机之间网络路径上最慢的组件决定最大。速度。
- 其他人可能会同时访问 example.com,从而减少它可以为您提供的带宽
- 100mbit 以太网要求两个连续的网络数据包之间有相当大的间隙。千兆以太网在这方面要好得多。
解决方案:
- 在通过网络发送之前压缩数据
- 使用像
rsync
这样的工具(它在后台使用 SSH)复制自上次您 运行 命令以来更改的文件。 - 创建大量小文件需要花费大量时间。尝试在远程端创建所有文件的存档并将其作为单个存档发送。
最后的建议可以这样做:
ssh root@xxx "cd /var/www/example ; tar cf - example.example.com" > example.com.tar
或压缩:
ssh root@xxx "cd /var/www/example ; tar czf - example.example.com" > example.com.tar.gz
注意:bzip2
压缩效果更好但更慢。这就是为什么我使用 gzip
(z
) 来完成这样的任务。
如果您指定多个文件,scp 将按顺序下载它们:
scp -r root@xxx.xxx.xx.xx:/var/www/example/file1 root@xxx.xxx.xx.xx:/var/www/example/file2 .
或者,如果您希望并行下载文件,则使用 scp 的多次调用,将每个调用都放在后台。
#! /usr/bin/env bash
scp root@xxx.xxx.xx.xx:/var/www/example/file1 . &
scp root@xxx.xxx.xx.xx:/var/www/example/file2 . &
SSH 能够执行所谓的 "multiplexing" - 通过一台(到一台服务器)建立更多连接。这可能是一种买得起你想要的东西的方式。查找关键字,例如 "ControlMaster"
第二种方法是使用更多连接,然后在后台发送每个作业:
for file in file1 file2 file3 ; do
scp $file server:/tmp/ &
done
但是,这就是您问题的答案 - "How to copy multiple files simultaneously"。为了加快速度,您可以使用较弱的加密(rc4 等)并且不要忘记,瓶颈可能是您的硬盘 - 因为 SCP 不会隐式限制传输速度。
最后一件事是使用 rsync - 在某些情况下,它可能比 scp 快很多...
我不确定这是否对你有帮助,但我通常在源头压缩(不需要压缩。只是存档就足够了)文件,下载它,解压它们。这将显着加快该过程。 在存档之前,下载 1GB 需要 > 8 小时 归档后完成同样的操作需要不到 8 分钟
您可以使用并行 scp(又名 pscp):http://manpages.ubuntu.com/manpages/natty/man1/parallel-scp.1.html
使用此工具,您可以将一个(或多个)文件同时复制到多个主机。
此致,
您可以使用带有等待命令的后台任务。 等待命令确保所有后台任务在处理下一行之前完成。即 echo 将在所有三个节点的 scp 完成后执行。
#!/bin/bash
scp -i anuruddha.pem myfile1.tar centos@192.168.30.79:/tmp &
scp -i anuruddha.pem myfile2.tar centos@192.168.30.80:/tmp &
scp -i anuruddha.pem myfile.tar centos@192.168.30.81:/tmp &
wait
echo "SCP completed"