Rsync

在兩台遠端機器之間複製大文件 - 高效

  • October 15, 2020

我有一個 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 都在 LAN 中。

我還有什麼其他選擇?我考慮過’rsync’。但是 rsync 手冊頁說:

一般的
Rsync 將文件複製到遠端主機或從遠端主機複製文件,或者在目前主機本地複製文件(它不支持在兩個主機之間複製文件)
遠端主機)。

編輯 1:我已經在使用 ssh cipher = arcfour128。改進不大,但這並不能解決我的問題。

編輯2:機器上執行著其他二進製文件(我的主要應用程序),高負載平均導致它們性能不佳。

這個問題可以用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

實際複製文件

ssh -i private_key ssh_user@source_ip \
      "rsync [OPTIONS] source-path \
             rsync://ssh_user@destination-IP:1873:destination-path"

引用自:https://serverfault.com/questions/384467