Var*_*run 7 rsync remote copy scp
我有一个 shell 脚本,它不断在远程系统之间复制大文件(2 GB 到 5 GB)。基于密钥的身份验证与代理转发一起使用,一切正常。例如:假设 shell 脚本在机器 A 上运行并将文件从机器 B 复制到机器 C。
“scp -Cp -i 私钥 ssh_user@source-IP:source-path ssh_user@destination-IP:destination-path”
现在的问题是进程 sshd 不断占用 CPU 负载。
例如:目标机器(即机器-C)上的 top -c 显示
PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 14580 ssh_user 20 0 99336 3064 772 R 85.8 0.0 0:05.39 sshd:ssh_user@notty 14581 ssh_user 20 0 55164 1984 1460 S 6.0 0.0 0:00.51 scp -p -d -t /home/binary/instances/instance-1/user-2993/
这导致高平均负载。
我相信 scp 占用了太多 CPU,因为它正在加密/解密数据。但是我不需要加密数据传输,因为机器 B 和机器 C 都在局域网中。
我还有什么其他选择?我考虑过'rsync'。但是 rsync 手册页说:
一般的 Rsync 将文件复制到远程主机或从远程主机复制文件,或在当前主机本地复制文件(它不支持在两台主机之间复制文件) 远程主机)。
编辑 1:我已经在使用 ssh cipher = arcfour128。改进不大,但这并不能解决我的问题。
编辑 2:还有其他二进制文件(我的主应用程序)在机器上运行,并且平均负载高导致它们性能不佳。
Dmi*_*rov 11
这个问题可以用rsync
. 至少这个解决方案在性能方面应该具有竞争力。
首先,rsync
可以从其中一个远程系统调用,以克服无法在两个远程系统之间直接复制的限制。
其次,可以通过rsync
在守护进程访问模式而不是远程外壳访问模式下运行来避免加密/解密。
在守护进程访问模式下rsync
,不会通过 ssh 连接隧道传输流量。相反,它在 TCP 之上使用自己的协议。
通常你从 inet.d 或独立运行 rsync 守护进程。无论如何,这需要对远程系统之一进行 root 访问。假设 root 访问权限不可用,仍然可以启动守护程序。
rsync
在目标机器上以非特权用户身份启动守护进程
ssh -i private_key ssh_user@destination-IP \
"echo -e 'pid file = /tmp/rsyncd.pid\nport = 1873' > /tmp/rsyncd.conf
ssh -i private_key ssh_user@destination-IP \
rsync --config=/tmp/rsyncd.conf --daemon
Run Code Online (Sandbox Code Playgroud)
实际上复制文件
ssh -i private_key ssh_user@source_ip \
"rsync [OPTIONS] source-path \
rsync://ssh_user@destination-IP:1873:destination-path"
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是使用 netcat:
destination$ nc -l -p 12345 > /path/destinationfile
source$ cat /path/sourcfile | nc desti.nation.ip.address 12345
Run Code Online (Sandbox Code Playgroud)
(某些 netcat 版本不需要端口的“-p”标志)
所有这些都是通过网络将未加密的数据从一台电脑发送到另一台电脑。当然,这不是最“舒服”的方式。
其他替代方法是尝试更改 ssh 密码 (ssh -c),或使用 ftp。
PS:rsync在远程机器上工作正常,但它主要与 ssh 结合使用,所以这里没有加速。
归档时间: |
|
查看次数: |
23027 次 |
最近记录: |