我使用单个 rsync
程序来备份文件系统。
通过ps
,我发现有四个rsync
线程或进程,两个处于 R 状态(运行),两个处于 S 状态(挂起?):
$ ps aux | grep rsync
root 14144 0.0 0.0 6008 1868 pts/1 S+ 03:16 0:00 sudo rsync -azvv /windows-d/ ./2015.03.07_03:16:05/
root 14145 47.2 0.5 62424 46108 pts/1 R+ 03:16 226:44 rsync -azvv /windows-d/ ./2015.03.07_03:16:05/
root 14146 0.6 0.2 80052 20584 pts/1 S+ 03:16 2:59 rsync -azvv /windows-d/ ./2015.03.07_03:16:05/
root 14147 11.4 0.2 49324 20264 pts/1 S+ 03:16 55:02 rsync -azvv /windows-d/ ./2015.03.07_03:16:05/
ting 16986 0.0 0.0 4392 820 pts/4 S+ 11:16 0:00 grep --color=auto rsync
通过pstree
,我发现有三个rsync
进程或线程:
$ pstree | grep rsync
| |-bash---sudo---rsync---rsync---rsync
为什么我有多个rsync
线程或进程,而我只运行一个程序?
从标准输出输出来看,它似乎不是并行传输多个文件(这似乎需要额外的努力?通过同时/并发文件传输加速 rsync)?
但我检查目的地,发现有一些目录(例如dir1
)仅包含一些但不是所有文件已传输,而rsync
stdout 的输出表示它正在另一个单独的目录中传输文件(例如dir2
,其中包含相同的父目录dir1
)。在我看来,稍后它将输出到标准输出,表示它将传输目录中的剩余文件(例如dir1
),其中一些文件但不是所有文件已经传输。
答案1
rsync 程序需要做很多事情,其中包括:
- 查找与远程服务器不同步的文件
- 决定需要传输哪些部分
- 传输增量,以便可以更新“另一侧”
通常,但并非总是,传输部分是带宽的限制因素。
Rsync 不并行传输补丁数据。但它确实会生成其他数据和交换,从而积累有关其他三角洲可能需要转移的知识。它在传输期间使用线程来执行此操作,以便当特定增量的传输完成时,下一个增量(希望)准备好传输。
更简单的方法是等待增量传输完成,然后开始比较下一个文件是否有必要的传输。由于可能需要一段时间才能找到下一个不同的文件,因此在此期间不会利用传输带宽。