禁用 HDD 写入缓存时性能更好?(HGST Ultrastar 7K6000 和媒体缓存行为)

J''*_*J'' 6 performance storage cache iops ceph

请注意。长读。
在我计划在我的 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
Run Code Online (Sandbox Code Playgroud)

当写缓存被禁用时:

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
Run Code Online (Sandbox Code Playgroud)

启用写缓存时:

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
Run Code Online (Sandbox Code Playgroud)

相关硬件细节:

  • 服务器: Supermicro 5018D8-AR12L
  • 存储控制器: LSI2116 IT模式(集成软件解决方案)无需任何缓存或逻辑卷管理即可工作
  • 磁盘:日立 Ultrastar 7K6000 4Tb (HUS726040ALE614)
  • 操作系统: Ubuntu 16.04.2,内核 4.4.0-81-generic

不幸的是,我想不出对这种行为的任何合理解释,快速总结:

  • 禁用写缓存:264 IOPS,3.768ms 提交延迟(尽管标准偏差很高)
  • 启用写入缓存:96 IOPS,10.3 毫秒提交延迟

UPD:我已经测试了直接连接到主板上的 SATA 端口的磁盘(单独的 SATA 控制器,不是 LSI2116)并且没有任何变化,结果相同。所以,我认为,这不是导致奇怪结果的 SW LSI2116 控制器。

UPD2:有趣的是,禁用缓存时顺序操作的性能增益较低,但稳定。下面是一个例子:

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 
Run Code Online (Sandbox Code Playgroud)


写缓存启用:

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
Run Code Online (Sandbox Code Playgroud)

写缓存禁用

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
Run Code Online (Sandbox Code Playgroud)

这变得很有趣,因为启用和禁用缓存时结果之间的差异正是 HGST 在其数据表中声称的:https :
//www.hgst.com/sites/default/files/resources/Ultrastar-7K6000-DS.pdf

• 与上一代 7K4000 相比
...
使用媒体缓存技术的随机写入性能提高 3 倍
顺序读/写性能提高 25%

它仍然没有解释为什么禁用写缓存时性能更好,但是,确实看起来当启用写缓存时,我的性能与上一个相当。7K4000代。没有写缓存,随机写性能快 2.6 倍,顺序写性能快 1.2 倍。

UPD3 假设: 较新的 Hitachi Ultrastar 驱动器具有称为Media Cache的功能。这是一种先进的非易失性缓存技术,这是它的工作原理(当然,据我所知):

  • 第一个数据写入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
Run Code Online (Sandbox Code Playgroud)

因此,我们清楚地看到启用写缓存在 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
Run Code Online (Sandbox Code Playgroud)

所以,我猜,媒体缓存在随机写入负载上提供了速度优势,对于顺序写入,它可能主要用作额外的可靠性机制。



UPD4(看起来我得到了答案)
我已经联系了 HGST 支持,他们已经澄清说,7K6000 上的媒体缓存仅在禁用写入缓存 (DRAM) 时才处于活动状态。因此,看起来在低队列深度上,媒体缓存实际上比 DRAM 缓存快。我想,这是因为媒体缓存允许将数据按顺序写入它的缓存区域,而不管 IO 模式如何。这极大地减少了所需的 HDD 磁头移动并带来了更好的性能。我仍然想了解更多关于媒体缓存的信息,所以,我还没有回答我自己的问题。相反,我要求支持提供有关媒体缓存的更多技术信息。如果我得到任何信息,我会用更多信息更新这个问题。


我仍然非常感谢任何建议、评论或替代解释。提前致谢!

sho*_*hok 1

最近的 HGST 驱动器似乎表现不同,同时控制hdparm -W0|1DRAM缓存和 MediaCache。此外,MediaCache 似乎在(启用缓存)而不是(禁用缓存)上处于活动状态。WCE/W1WCD/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)
...
Run Code Online (Sandbox Code Playgroud)

禁用缓存 ( 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)
...
Run Code Online (Sandbox Code Playgroud)

启用缓存 ( 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)
...
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 从禁用缓存的direct对比中我们可以看到禁用了DRAM 缓冲区MediaCache;否则,结果会明显高于实际结果。这些结果与寻道受限的 7200 RPM 磁盘(大约 70 IOPS)的性能完全一致。direct+synchdparm -W0directdirect+sync

  2. 启用缓存后,性能会好得多,IOPS 几乎翻倍。由于sync阻止单独在 DRAM 缓冲区中进行缓存,这意味着 MediaCache 在这里工作。

因此,虽然其他一些 NVRAM 技术在WCD/WC0(禁用写入缓存)磁盘设置上运行,但 MediaCache 似乎需要 WCE/WC1工作。