我需要知道机器需要多长时间才能将写入缓存刷新到实际磁盘。现在,当我尝试卸载磁盘时,卸载会等待同步完成。在 USB 上,这需要很长时间(最多一分钟)。即使对于机械磁盘,这也可能需要几秒钟。而且,有时即使命令返回,系统似乎仍在将缓存写入磁盘。
最安全和可预测的方法是,只需知道系统上有多少缓存数据处于待处理状态,然后等待其降至零。“sync”命令确实会刷新,但我想知道在运行“sync”命令之前实际上有多少数据处于待处理状态。
我需要让用户知道何时可以安全地弹出/拔出磁盘。
编辑:似乎可以这样做的方法是观察 /proc/meminfo 的 Dirty。谢谢。
答案1
只是为了知道系统上有多少缓存数据待处理
例如,您可以查看cat /proc/meminfo
脏页(已修改但未写回)的数量。
在 USB 上,这需要很长时间(最多一分钟)。
这是 USB 的错 - 写入闪存的速度很慢,尽管现代 USB 棒通常具有访问速度更快的中间缓冲区,因此它们可以假装具有更快的写入时间。
而且,有时即使命令返回,系统似乎仍在将缓存写入磁盘。
否。umount
完成后,该分区的所有数据都将被写入。
最安全和可预测的方法是,只需了解系统上有多少缓存数据待处理,然后等待其降至零。
这是无法预测的——时间仍然取决于设备的写入速度。因此,无论闪存需要多长时间才能写入所有这些内容,它都会花费时间。
如果您只是等待而不使用sync
或umount
,写入可能会延迟。因此等待总是会比告诉系统“请将所有修改的数据写回”花费更长的时间。
我需要让用户知道何时可以安全地弹出/拔出磁盘。
安全的做法是umount
,当它返回时,你可以拉动设备。如果你想真的安全,您还可以使用eject
;如果某些东西仍然处于安装状态,它将会失败,有时会明显改变设备的状态。
编辑
如果您的主要问题是想让用户估计一下他/她需要多长时间才能取出闪存驱动器,那么:
1)执行eject
(如果您系统上的变体也自动调用umount
,如注释中所述;否则执行umount
)。
2)等待eject
返回,然后向用户显示一条消息“您现在可以取出闪存驱动器”
3) 同时,使用第二个进程/proc/meminfo
以给定的延迟(约 1 秒)反复扫描“脏内存”大小。记住初始脏大小,使用当前脏大小作为完成的估计值(它应该趋向于零),这样您就可以显示进度条。