我可以观看`sync`操作的进度吗?


103

我已经使用异步将一个大文件复制到安装在Linux系统上的USB磁盘上。这会相对快速地返回到命令提示符,但是,当我键入时sync,所有这些都必须进入磁盘,这需要很长时间。

我知道它会变慢,但是在某个地方我可以看到计数器降为零吗?看着bufferstop没有帮助。


有关更多信息,请参见:lwn.net/Articles/572911
lanoxx '18年

Answers:


162

查看/proc/meminfo将显示Dirty随着所有数据假脱机,数量随着时间的推移而减少;其中一些可能也会溢出Writeback。这将是针对所有设备的摘要,但是如果系统上的一台设备比其余设备慢得多,则通常会导致该队列中的所有内容与之相关。Dirty当开始和sync结束时,您可能会发现较大的数字,它接近0的同时。尝试以下操作以获得交互式显示:

watch -d grep -e Dirty: -e Writeback: /proc/meminfo

对于常规磁盘,我通常可以忽略Writeback,但是我不确定USB传输路径中是否更多地涉及到它。如果只是在没有明显趋势的情况下上下反弹,您可能只需看一下Dirty数字即可。


4
在我的系统上,当Dirty为空时,回写将保持在几兆,直到接近尾声,这时它也开始下降。
mattdm 2012年

24

您可以在/sys/block/<device>/stat同步时查看相应设备的文件。9 列将指示装置,当同步完成它应该降到零上飞行的请求数。
不知道将其转换为多个字节的方法,但是它应该使您大致了解仍有多少“填充”待处理。

有关更多信息,请参见内核文档中的stat.txt文件。(inflight我的系统上该目录中还有一个文件,看起来它可能包含读写运行中的请求,但我找不到该文件。)


3
仅供参考,结合另一个答案的想法:watch -t -n1 'awk "{ print \$9 }" /sys/block/sdd/stat'
mattdm 2012年

4
对于我的USB记忆棒,在整个复制操作过程中及sync之后,它通常会徘徊在150左右。它确实为0,但仅在最后。这使得其他答案对于不耐烦地观察进度更加有用。
mattdm 2012年

1
(尽管从理论上讲,我只希望查看适当的设备,而不是查看系统范围的信息。)
mattdm 2012年

有没有一种方法可以获取已写入(已同步,刷新后不在运行中)或缓存要写入驱动器的字节数?如果我有每个驱动器的写缓存大小,则可以将其du用于计算在驱动器上同步的实际数据。
unfa

10

通过使用Greg的答案,您可以简单地sync在后台运行,同时在内存中显示Dirty块的状态。

为此,只需运行以下命令:

sync & watch -n 1 grep -e Dirty: /proc/meminfo

在前端sync执行时将在后台调用watch。当sync命令完成时(大约在Dirty块的大小达到0时),您将获得如下所示的输出:

1]  + 27260 done        sync

这意味着命令已完成,您可以watch使用Ctrl+ 终止命令C


顺便说一句:我知道这是一个老问题,但这是第一个在有人寻找它时在Google上弹出的问题,我想添加我找到的解决方案。
jflemieux

1
太糟糕的sync / umount不能从内核获取更新,如果被告知,可以直接打印这种东西。
mcr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.