我想删除一个包含超过 600 万个文件、4000 多个目录、总共约 26GB 数据的巨大目录。我知道这需要一段时间,因此我常常ionice
将 I/O 优先级设置为空闲,这样我就可以在删除文件时继续执行其他任务。
time ionice -c3 rm -vrf /tmp/huge-folder
然而,我的整个桌面环境现在仍然非常缓慢,Google Chrome 需要很长时间才能打开新选项卡和加载页面,有时甚至需要一段时间才能打开新的 xterm 窗口。总之:我似乎没有获得降低进程 I/O 优先级的任何好处rm
。
检查情况iotop
表明,一些 I/O 时间花费在rm
具有idle
我想要的 I/O 优先级的进程中:
但有时 I/O 时间花费在 ext4 的日志进程和软件 raid 进程中:
请注意它们如何使用自己的默认 I/O 优先级,这可能是问题的原因。 jbd2
甚至以优先级运行be/3
,这实际上比be/4
我所有其他桌面进程的默认优先级更高。
许多其他问题询问并回答它jbd2
是什么以及为什么它消耗 I/O 时间,这不是我想知道的。我的问题是:有没有办法真正获得这种特定场景下的空闲I/O调度优先级?显然,申请ionice
是jbd2
一个疯狂的想法。
进一步的设置信息:这是在带有 3 个旋转磁盘的软件 raid10 之上的 ext4 文件系统上。 ext4 使用默认选项进行格式化和安装(Debian 默认值,以防有所不同)。
答案1
自从我问这个问题以来,我学到了更多关于 Linux 内核中 I/O 如何工作的知识,我得出的结论是,它ionice
不适用于大多数写操作。
读取操作大多是同步的,并且可以很容易地确定优先级。想必这对于写操作来说要困难得多,因为写操作通常会延迟到稍后的时间(因此是异步的),以便进行优化、聚合等。我可以想象,沿着这种方式传输和正确聚合美好信息并不容易。
来源:关于Linux ionice的一些笔记。请注意,该来源还提到它ionice
不适用于 LVM 或软件 RAID,但我怀疑这是否仍然正确(该博客文章有点过时)。