我正在重新同步 RAID1 阵列。 /proc/mdstat
显示它以预期的速度进行,但iotop
显示磁盘在所有方面都处于空闲状态。它没有显示 IO,md127_resync
尽管提到了内核线程,但我猜测这是由内核线程执行的man iotop
。
我们如何解释这个 IO 没有出现在 中iotop
?解释是否表明其他类型的 IO 也不会出现?
我使用的是 Debian 9。
答案1
仔细阅读有一个提示man iotop
至少需要在 Linux 内核构建配置中启用 CONFIG_TASK_DELAY_ACCT、CONFIG_TASK_IO_ACCOUNTING、CONFIG_TASKSTATS 和 CONFIG_VM_EVENT_COUNTERS 选项。
iotop 显示采样期间每个进程/线程读取和写入的 I/O 带宽列。它还显示线程/进程在换入和等待 I/O 时所花费的时间百分比。对于每个进程,都会显示其 I/O 优先级(类/级别)。
此外,界面顶部还显示采样期间读写的总I/O带宽。 Total DISK READ 和 Total DISK WRITE 值表示一侧的进程和内核线程与另一侧的内核块设备子系统之间的总读写带宽。而 Actual DISK READ 和 Actual DISK WRITE 值表示内核块设备子系统和底层硬件(HDD、SSD 等)之间实际磁盘 I/O 的相应带宽。因此,由于 Linux 内核内部发生的数据缓存和 I/O 操作重新排序,在任何给定时刻,总计值和实际值可能不相等。
CONFIG_TASK_DELAY_ACCT、CONFIG_TASK_IO_ACCOUNTING、CONFIG_TASKSTATS 听起来像是组成的每个任务的统计信息Total
。而 CONFIG_VM_EVENT_COUNTERS 是单个总体统计数据,即Actual
(在 中/proc/vmstat
,如果您查找配置选项)。 VM 部分,意思是虚拟内存,强烈表明这是关于内核缓冲 IO,即通过页面缓存的 IO。换句话说,这些统计数据是随着 IO 的进行而被捕获的从VM 子系统到块设备子系统。
这对我来说意味着绕过虚拟机的 IO 不会被计入iotop
.O_DIRECT
例如,它可能不包括。这也解释了如何iotop
避免对通过软件 RAID(和 LVM 等)传递的 IO 进行重复计数,以及为什么它没有对不同块设备进行统计的功能。
RAID 重新同步 IO 不需要经过页面缓存。它将使用内核 API,我认为它与异步 IO 有一些相似之处(Linux 仅支持异步 IO 的 O_DIRECT)。因此,它不会受到使用read()
和write()
不使用页面缓存提供的异步回写和预读的性能限制。