我在 Linux 软件 raid 1 中有两个相同的 HDD。我观察到此 raid 设备上的大部分读取负载,其中进程主要显示 iowait。iotop 显示整体磁盘利用率约为 75%。
如果我现在查看物理磁盘的磁盘利用率,一个磁盘显示读取速度约为 1M/s,另一个磁盘仅显示读取速度为 100K/s。/proc/mdstat 显示阵列运行良好。两个磁盘的使用率不均等,这可能是什么问题?
关于评论:我都试过了。用两个线程和用一个线程读取。什么都没改变。
答案1
对于顺序读取,从两个磁盘读取不会带来性能优势。由于两个磁盘上的数据相同,因此它们必须各自搜索另一个磁盘读取的任何数据。但向前短距离搜索并不比读取所有中间数据快多少。
但是,如果有多个进程并行从磁盘读取不同的数据,那么与单个磁盘相比,您应该会看到显著的性能提升。
两个进程从同一个磁盘读取数据时,每次交替读取数据通常会导致昂贵的寻道。使用 RAID1 时,这两个进程可以从不同的磁盘读取数据,寻道次数将大大减少。
答案2
如果我使用一个线程按顺序读取,则所有内容都会转到一个驱动器。如果我使用两个线程从两个不同的文件读取,则第一个线程会转到一个驱动器,而第二个线程会随机地从一个驱动器转移到另一个驱动器,有时会保持平衡,有时会使第二个驱动器处于几乎空闲的状态,因为两个线程都会从第一个驱动器读取内容。
阅读内核源代码,这是意料之中的。它针对延迟而不是吞吐量进行了优化。对于旋转驱动器,raid1.c 中的 read_balance() 几乎总是会选择磁头位置最接近请求的驱动器。如果第二个驱动器远离操作所在的位置,则很难看出它如何返回。
如果至少有一个底层驱动器是 SSD,则将选择待处理请求最少的设备,这样吞吐量就会平衡。所以,我猜这是一个解决方案:使用 SSD。
有一条注释表明该代码是在 2000 年编写的。除了编辑并重新编译之外,没有其他方法可以对其进行调整。