请注意。文章很长。
在对计划在 Ceph 设置中使用的 Hitachi Ultrastar 7K6000 驱动器进行初始性能测试时,我注意到一件奇怪的事情:禁用磁盘写入缓存时,写入性能会更好。
我用fio
:
fio --filename=/dev/sda --direct=1 --sync=1 --rw=randwrite --bs=4k --numjobs=1 --iodepth=1 --runtime=60 --time_based --group_reporting --name=4krandw
当禁用写入缓存时:
hdparm -W 0 /dev/sda
4krandw: (groupid=0, jobs=1): err= 0: pid=6368: Thu Jun 22 07:36:44 2017
write: io=63548KB, bw=1059.9KB/s, iops=264, runt= 60003msec
clat (usec): min=473, max=101906, avg=3768.57, stdev=11923.0
启用写入缓存时:
hdparm -W 1 /dev/sda
4krandw: (groupid=0, jobs=1): err= 0: pid=6396: Thu Jun 22 07:39:14 2017
write: io=23264KB, bw=397005B/s, iops=96, runt= 60005msec
clat (msec): min=1, max=48, avg=10.30, stdev= 4.12
相关硬件详细信息:
- 服务器:超微 5018D8-AR12L
- 存储控制器:LSI2116 IT 模式(集成 SW 解决方案)无需任何缓存或逻辑卷管理即可工作
- 磁盘:日立 Ultrastar 7K6000 4Tb (HUS726040ALE614)
- 操作系统:Ubuntu 16.04.2,内核 4.4.0-81-generic
不幸的是,我无法想到这种行为的任何合理解释,简要总结一下:
- 禁用写入缓存:264 IOPS,提交延迟为 3.768ms(但标准偏差较高)
- 启用写入缓存:96 IOPS,提交延迟 10.3ms
更新:我已经测试了直接连接到主板上的 SATA 端口的磁盘(单独的 SATA 控制器,而不是 LSI2116),没有任何变化,结果相同。因此,我推测,这不是 SW LSI2116 控制器导致的奇怪结果。
更新2:有趣的是,当缓存已禁用较低,但稳定。以下是示例:
fio --filename=/dev/sdl --direct=1 --sync=1 --rw=write --bs=16M --numjobs=1 --iodepth=1 --runtime=60 --time_based --group_reporting --name=16M-wr
启用写入缓存:
16M-wr: (groupid=0, jobs=1): err= 0: pid=2309: Fri Jun 23 11:52:37 2017
write: io=9024.0MB, bw=153879KB/s, iops=9, runt= 60051msec
clat (msec): min=86, max=173, avg=105.37, stdev= 9.64
写缓存已禁用:
16M-wr: (groupid=0, jobs=1): err= 0: pid=2275: Fri Jun 23 11:45:22 2017
write: io=10864MB, bw=185159KB/s, iops=11, runt= 60082msec
clat (msec): min=80, max=132, avg=87.42, stdev= 6.84
这变得很有趣,因为启用和禁用缓存时的结果差异正是 HGST 在其数据表中所声称的:
https://www.hgst.com/sites/default/files/resources/Ultrastar-7K6000-DS.pdf
•与上一代 7K4000 相比
...
—使用媒体缓存技术,随机写入性能最高可提高 3 倍
—顺序读/写性能提高 25%
它仍然无法解释为什么禁用写入缓存时性能会更好,但是,确实看起来当启用写入缓存时,我获得的性能与上一代 7K4000 相当。没有写入缓存时,随机写入性能快 2.6 倍,顺序写入性能快 1.2 倍。
UPD3假设: 较新的 Hitachi Ultrastar 硬盘具有一项功能,称为媒体缓存这是一种先进的非易失性缓存技术,它的工作原理如下(当然,这是我的理解):
- 第一个数据被写入DRAM缓存
- 其次,驱动器在每个盘片上都有许多保留区域,这些区域物理上位于提供最佳速度的区域。这些区域本质上是媒体缓存存储。因此,这些区域用作非易失性第二阶段缓存。来自 DRAM 缓冲区的数据被累积并以高队列深度刷新到媒体缓存中。这可以最大限度地减少磁头移动并提供额外的可靠性和速度增益。
- 只有在此之后,数据才会被写入盘片上的实际存储区域。
因此,媒体缓存是一个两阶段写回缓存,我认为只有在刷新到媒体缓存后,写入操作才被视为完成。
我必须承认,这是一种有趣的技术。我的假设是,当我们用禁用写入缓存时hdparm -W0
,只有媒体缓存被禁用。
数据只缓存在 DRAM 中,然后直接刷新到盘片。虽然媒体缓存肯定会提供很大的优势,但是在同步写入期间,我们必须等待写入媒体缓存区域。并且当媒体缓存被禁用时,在数据写入磁盘 DRAM 缓冲区后,写入才被视为完成。速度快得多。在较低的队列深度上,DRAM 缓存提供了足够的空间来写入而不会降低速度,但是,在较大的队列中,当必须不断进行许多刷新到盘片的操作时,情况就不同了。我已经使用 QD=256 进行了两次测试。
fio --filename=/dev/sda --direct=1 --sync=1 --rw=randwrite --bs=4k --numjobs=1 --iodepth=256 --runtime=180 --time_based --group_reporting --name=4krandwrite
hdparm -W0 /dev/sda (write cache disabled)
4krandwrite: (groupid=0, jobs=1): err= 0: pid=3176: Wed Jun 28 10:11:15 2017
write: io=62772KB, bw=357093B/s, iops=87, runt=180005msec
clat (msec): min=1, max=72, avg=11.46, stdev= 4.95
hdparm -W1 (write cache enabled)
4krandwrite: (groupid=0, jobs=1): err= 0: pid=3210: Wed Jun 28 10:14:37 2017
write: io=70016KB, bw=398304B/s, iops=97, runt=180004msec
clat (msec): min=1, max=52, avg=10.27, stdev= 3.99
因此,我们清楚地看到,启用写入缓存可在 IOPS 和提交延迟方面带来 11.5% 的优势。看来我的假设是正确的,并且hdparm
只控制媒体缓存,而不是 DRAM 缓冲区。而且在更高的队列深度上,MC 确实物有所值
但对于顺序操作来说情况并非如此。
fio --filename=/dev/sda --direct=1 --sync=1 --rw=write --bs=16M --numjobs=1 --iodepth=256 --runtime=180 --time_based --group_reporting --name=16Mseq
hdparm -W0 /dev/sda (write cache disabled)
16Mseq: (groupid=0, jobs=1): err= 0: pid=3018: Wed Jun 28 09:38:52 2017
write: io=32608MB, bw=185502KB/s, iops=11, runt=180001msec
clat (msec): min=75, max=144, avg=87.27, stdev= 6.58
hdparm -W1 /dev/sda (write cache enabled)
16Mseq: (groupid=0, jobs=1): err= 0: pid=2986: Wed Jun 28 09:34:00 2017
write: io=27312MB, bw=155308KB/s, iops=9, runt=180078msec
clat (msec): min=83, max=165, avg=104.44, stdev=10.72
因此,我猜测,Media Cache 在随机写入负载上提供了速度优势,对于顺序写入,它可能主要用作附加可靠性机制。
UPD4(看起来我找到答案了)
我已经联系了 HGST 支持人员,他们澄清说 7K6000 上的媒体缓存处于活动状态仅当禁用写入缓存 (DRAM) 时。因此,看起来在低队列深度下,Media Cache 实际上比 DRAM 缓存更快。我猜,这是因为 Media Cache 允许将数据按顺序写入其缓存区域,而不管 IO 模式如何。这大大减少了所需的 HDD 磁头移动并带来了更好的性能。我仍然想了解更多关于 Media Cache 的信息,所以我还没有回答我自己的问题。相反,我已向支持人员询问有关 Media Cache 的更多技术信息。如果我得到任何信息,我会用更多信息更新这个问题。
我仍然会非常感激任何建议、评论或其他解释。提前谢谢!
答案1
最近的 HGST 硬盘似乎表现有所不同,hdparm -W0|1
控制两个都DRAM 缓存和 MediaCache。此外,MediaCache 似乎在WCE/W1
(缓存启用)而不是WCD/W0
(缓存禁用)上处于活动状态。
让我们看看这个 HGST HUS722T2TALA604 磁盘在一些fio
运行中的表现如何。
禁用缓存(hdparm -W0
)和direct
写入
[root@singularity ~]# fio --name=test --filename=/dev/sda --io_size=4M --direct=1 --rw=randwrite
...
write: IOPS=73, BW=295KiB/s (302kB/s)(4096KiB/13908msec)
...
禁用缓存 ( hdparm -W0
),direct
+sync
写入
[root@singularity ~]# fio --name=test --filename=/dev/sda --io_size=4M --direct=1 --sync=1 --rw=randwrite
...
write: IOPS=73, BW=295KiB/s (302kB/s)(4096KiB/13873msec)
...
启用缓存 ( hdparm -W1
),direct
+sync
写入
[root@singularity ~]# fio --name=test --filename=/dev/sda --io_size=4M --direct=1 --sync=1 --rw=randwrite
...
write: IOPS=127, BW=510KiB/s (523kB/s)(4096KiB/8027msec)
...
注意事项:
从禁用缓存的
direct
vs中我们可以看到禁用direct+sync
hdparm -W0
两个都DRAM 缓冲区和MediaCache;否则,direct
结果将明显高于这些direct+sync
。这些结果与寻道受限的 7200 RPM 磁盘的性能完全一致,约为 70 IOPS。启用缓存后,性能会好很多,IOPS 几乎翻倍。由于
sync
单独阻止了 DRAM 缓冲区中的缓存,这意味着 MediaCache 正在这里工作。
因此,虽然其他一些 NVRAM 技术在WCD/WC0
(禁用写入缓存)磁盘设置下运行,但 MediaCache需要 WCE/WC1
去工作。