我正在将大约 1 TB 的数据从安装在 EC2 上的 EBS 移动到安装在同一实例上的另一个 EFS。在过去 2 周左右的时间里,我已经能够使用 rsync 复制大约 840 GB 的数据。现在,当我运行 rsync 来复制剩余数据时,它在 htop 输出中不断显示为 D 状态。这是使用 Mail Piler 的电子邮件存档服务器。使用的rsync命令如下:
nohup rsync -vaAP --progress /var/piler/store/* /var/efs/store | tee /root/txlog_20June.txt &
有人可以阐明这一点并帮助我吗?有没有其他方法可以做到这一点,或者我可以调整 rsync 来完成这个任务吗?
答案1
很难确切地说出问题所在,但您可以尝试以下一些想法:
由于D
状态是不间断睡眠,这很可能是由 I/O 操作引起的,我猜这rsync
是在等待由于某种原因无法访问的文件上的 I/O。 EFS 和 EBS 都是远程文件系统。我在 NFS 共享方面也遇到了类似的问题。要调查问题,您可以开始对rsync
命令执行系统调用跟踪。您需要strace
这个(也许您需要先安装它)。然后尝试以下命令:
strace -eopen -ostrace.log rsync ...
-eopen
只会跟踪open()
系统调用-ofile
将把输出记录到一个名为的文件中file
现在等待进程停止在 state D
。当进程被阻止时,您可以检查文件strace.log
。内容可能看起来像
$ tail -f strace.log
[...]
open("...", O_RDONLY|O_CLOEXEC) = 3
open("...", O_RDONLY)
open("/path/to/suspect_file", O_RDONLY)
日志中的最后一个条目(在上面的示例中)是处于不间断睡眠状态/path/to/suspect_file
的文件。rsync
您现在可以将该文件排除在 rsync 之外,或者检查它导致阻止的原因(或尝试手动复制它)。
顺便说一句:复制大量文件的程序大部分时间都处于不间断睡眠状态。这意味着程序大部分时间都在等待底层文件系统(与 CPU 周期相比非常慢)。