我正在重新生成一个RAID1数组。/proc/mdstat显示它以预期的速度前进,但iotop显示磁盘在所有方面都是空闲的。它没有显示IO,我猜这是由内核线程md127_resync执行的,尽管man iotop提到了内核线程。
我们如何解释这个IO没有出现在iotop中?这一解释是否意味着其他类型的IO也不会出现?
我在用Debian 9。
发布于 2017-09-09 16:01:24
在仔细阅读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带宽显示在接口顶部。总磁盘读取和总磁盘写入值表示进程和内核线程之间的总读写带宽和内核块设备子系统之间的带宽。实际磁盘读取和实际磁盘写入值表示内核块设备子系统和底层硬件(HDD、SSD等)之间的实际磁盘I/O的相应带宽。因此,在任何给定的时刻,由于数据缓存和I/O操作的重新排序,在Linux内核中发生的总计值和实际值可能不相等。
CONFIG_TASK_DELAY_ACCT,CONFIG_TASK_IO_ACCOUNTING,CONFIG_TASKSTATS听起来就像构成Total的任务统计数据.而CONFIG_VM_EVENT_COUNTERS是一个单一的总体统计数据,即Actual (在/proc/vmstat中,如果您查找config选项)。VM部分,意思是虚拟内存,强烈地暗示这是关于内核缓冲的IO,也就是通过页面缓存的IO。换句话说,当IO从VM子系统转移到块设备子系统时,这些统计信息就会被捕获。
在我看来,绕过VM的IO不会在iotop中计算。例如,它可能不包括O_DIRECT。这也解释了iotop如何避免通过软件RAID (和LVM等)重复计算IO,以及为什么它没有为不同块设备提供统计信息的特性。
RAID resync IO不需要遍历页面缓存。它将使用内核内的API,我认为这些API与异步IO有一些相似之处(Linux只支持异步IO的O_DIRECT )。因此,如果没有页面缓存提供的异步写回和readahead,它就不会受到使用read()和write()的性能限制。
https://unix.stackexchange.com/questions/391332
复制相似问题