我在软件 RAID1 中使用 Ubuntu 12.04 和 2 x 2TB SATA3 硬盘。文件系统是 ext4 data=writeback
。
当使用find . -maxdepth 1 -name '*' -delete
删除目录中的大量文件时,df
间隔地执行表明:
最初大量文件被删除,并iotop
显示该find
操作占用了大部分 IO。
之后 df
显示文件数量保持不变,并iotop
显示 IO 使用率现在由jbd2
和主导md4_raid1
。
几分钟后,df
显示文件数量再次下降。
有人能解释一下这种现象吗?这是正常的吗?还是我的服务器出了问题?另外,为什么 3 个进程的 IO 使用率同时达到 99.99%?
答案1
这正是我所期望的。Find 查找文件 - 即它从 VFS 读取,当数据不在缓存中时,需要从磁盘中获取。在处理每个文件时,它会将要写入的更改排入队列。在某个时候,写入缓冲区已满,必须将更改写入磁盘 - 此时,执行写入的进程将被阻止,从而发出进一步的写入或读取请求,直到有空间缓冲更多写入。
答案2
可以通过降低进程的I/O优先级来防止系统被阻塞:
ionice -c3 nice -15 find ... -delete
如果这还不够,那么您可以使用 chrt 将进程放入 SCHED_IDLE 类。