文件读取性能随着文件数量的增加而下降

文件读取性能随着文件数量的增加而下降

我们观察到文件读取 IO 结果不佳,我们希望更好地理解这一点。我们可以使用菲奥写入 100 个文件,持续总吞吐量约为 700MB/s。当我们将测试切换为读取而不是写入时,总吞吐量仅为约 55MB/s。下降似乎与文件数量有关,因为对于单个文件,读取和写入的吞吐量相当,然后随着文件数量的增加而按比例分化。

测试服务器有 24 个 CPU 核心、48GB 内存,运行的是 CentOS 6.0。磁盘硬件是一个 RAID 6 阵列,包含 12 个磁盘和一个 Dell H800 控制器。此设备使用默认设置使用 ext4 进行分区。

增加预读(使用区块设备) 显著提高了读取吞吐量,但写入速度仍然不匹配。例如,将预读从 128KB 增加到 1M 可将读取吞吐量提高到 ~145MB/s。

以下是读取案例的 iostat 结果:

$ iostat -mx 2

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.06      0.00       0.15       4.06      0.00     95.73

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00  524.00    0.00    73.12     0.00   285.77    27.07   51.70   1.90  99.70

并写出案例:

$ iostat -mx 2

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.73      0.00    4.98         2.92      0.00      91.37

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.00 195040.50    0.00 3613.00     0.00   776.79   440.32   137.23   37.88   0.28 100.00

一个奇怪的现象是,在读取的情况下,rrqm/s 为 0.0。

这是我们的操作系统/磁盘/文件系统配置中已知的性能问题吗?如果是,我们如何判断?如果不是,我们可以使用哪些工具或测试来进一步隔离问题?

谢谢。

答案1

这肯定与磁头寻道有关,即使每个文件都是按顺序读写的,同时工作意味着驱动器磁头必须一直在每个文件之间跳转。

输出iostat清楚地显示了这张图片:

大多数驱动器的平均寻道时间在 8 到 11 毫秒之间,分布在 12 个驱动器阵列上最多可以获得 1-2 毫秒左右,这与 1.90 的svctm数字一致。

因此,约 2 毫秒的读取可为您提供约 500 次读取/秒。如果每次读取为 128KB,则可获得约 64MB/秒。更大的读取量可让您获得更高的速度,但您的iostat速度avgrq-sz仅为 285KB/读取。显然,IO 调度程序必须减少请求大小,以便其他读取不会等待太长时间。我猜您正在使用deadline调度程序,因为它具有恰好这样的优先级:不让任何进程等待太长时间。

写入性能保持较高水平,因为有了足够的 RAM,IO 调度程序就可以为每个流聚合足够的数据,使其更接近顺序访问。 的大小avgrq-sz只有大约两倍,但avgqu-sz意味着排队的操作是 5 倍,这说明吞吐量提高了 10 倍。

现在,如何实现更好的(更像顺序的)读取?显而易见的方法(在我看来,也是唯一有保证的方法)是减少同时处理的文件数量。您也可以尝试其他调度程序;我不知道它们是否cfq会偏向带宽而不是延迟,也许其中noop一个会表现得更好,但它可能会使系统的其余部分非常迟钝。最后,有几个参数可以调整任一调度程序,您可以尝试这些参数,直到找到自己的理想设置。

相关内容