我有一个
shell脚本,它不断在远程系统之间复制大文件(2 GB到5 GB).
基于密钥的身份验证与代理转发一起使用,一切正常.
例如:假设shell脚本在机器A上运行并将文件从机器B复制到机器C.
基于密钥的身份验证与代理转发一起使用,一切正常.
例如:假设shell脚本在机器A上运行并将文件从机器B复制到机器C.
"scp -Cp -i private-key ssh_user@source-IP:source-path ssh_user@destination-IP:destination-path"
现在问题是进程sshd不断占用cpu负载.
例如:目的地机器上的顶部-c(即机器-C)显示
PID USER PR NI VIRT RES SHR S %cpu %MEM TIME+ COMMAND 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手册页说:
GENERAL Rsync copies files either to or from a remote host,or locally on the current host (it does not support copying files between two remote hosts).
编辑1:我已经在使用ssh cipher = arcfour128.虽然改善不大,但这并没有解决我的问题.
解决方法
使用rsync可以解决此问题.至少这种解决方案在性能方面应具有竞争力.
首先,可以从其中一个远程系统调用rsync,以克服无法直接在两个远程系统之间进行复制的限制.
其次,通过在守护程序访问模式而不是远程Shell访问模式下运行rsync,可以避免加密/解密.
在守护程序访问模式下,rsync不会通过ssh连接隧道传输流量.相反,它在TCP之上使用自己的协议.
通常,您从inet.d或独立运行rsync守护程序.无论如何,这需要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
实际上复制文件
ssh -i private_key ssh_user@source_ip \ "rsync [OPTIONS] source-path \ rsync://ssh_user@destination-IP:1873:destination-path"