我可以查看“同步”操作的进度吗?

mat*_*tdm 144 linux filesystems io async

我已将一个大文件复制到安装在带有异步 Linux 系统上的 USB 磁盘中。这相对较快地返回到命令提示符,但是当我键入时sync,当然,它必须全部转到磁盘,这需要很长时间。

我知道它会很慢,但是有什么地方可以让我看到计数器降到零吗?看着buffers在top没有帮助。

Gre*_*ith 240

随着所有数据的流出,查看/proc/meminfo将显示Dirty数量随着时间的推移而缩小;其中一些也可能会溢出Writeback。这将是对所有设备的总结,但在系统上的一个设备比其他设备慢得多的情况下,您通常最终会发现该队列中的所有内容都与它相关。您可能会在Dirty开始时发现这个数字很​​大,而在sync它接近 0 的同时完成了。试试这个以获得交互式显示:

watch -d grep -e Dirty: -e Writeback: /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

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

  • 在我的系统上,写回保持在几兆直到接近尾声,当 Dirty 为空时,此时它也开始下降。 (5认同)
  • 同样,我将一个 6 gig 文件复制到 Fedora 36 上使用 exfat 格式化的 USB 上,“脏”大约为 200 kb,而写回则要多得多,直到最后变成 0。 (2认同)

Mat*_*Mat 26

您可以在/sys/block/<device>/stat同步时查看相应设备的文件。在9日的列会显示设备,它应该向下时,同步完成到零上飞行的请求数。
不知道有什么方法可以将其转换为多个字节,但它应该可以让您大致了解有多少“东西”尚待处理。

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

  • 对于我的 U 盘,在复制操作和之后的“同步”期间,它往往会徘徊在 150 左右。它确实变为 0,但仅在最后。这使得另一个答案对于不耐烦地观察进展更有用。 (6认同)
  • 仅供参考,结合另一个答案的想法:`watch -t -n1 'awk "{ print \$9 }" /sys/block/sdd/stat'` (3认同)

小智 16

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

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

sync & watch -n 1 grep -e Dirty: /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

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

1]  + 27260 done        sync
Run Code Online (Sandbox Code Playgroud)

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

  • 太糟糕了 sync/umount 没有从内核获取更新,如果被告知可以直接打印这种东西。 (4认同)

agg*_*877 7

根据其他答案,我制作了这个过于臃肿的单行文字,用于跟踪摘要进度以及特定于设备的进度:

# Create the command
watchSync() {
  watch -n1 'grep -E "(Dirty|Write)" /proc/meminfo; echo; ls /sys/block/ | while read device; do awk "{ print \"$device: \"  \$9 }" "/sys/block/$device/stat"; done'
}

# Run the command
watchSync
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

Dirty:            848956 kB
Writeback:        125948 kB
WritebackTmp:          0 kB

dm-0: 0
dm-1: 0
loop0: 0
loop1: 0
loop2: 0
loop3: 0
loop4: 0
loop5: 0
loop6: 0
loop7: 0
nvme0n1: 0
sda: 0
sdb: 0
sdc: 124
Run Code Online (Sandbox Code Playgroud)

上面告诉我 1) 我有几个 100,000 kBytes 需要写入,2) 正在写入的设备是sdc. 在这种情况下,当sdc和Writeback达到零时,同步完成(这将同时发生)。