硬盘写入caching被禁用时性能更好? (HGST Ultrastar 7K6000和媒体caching行为)

请注意。 长时间阅读。
在我打算在Ceph设置中使用的日立Ultrastar 7K6000硬盘的初始性能testing中,我发现了一个奇怪的现象:当磁盘写入caching被禁用时,写入性能会更好。


我用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 

写caching禁用时:

 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 

写caching启用时:

 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 

相关的硬件细节:

  • 服务器: Supermicro 5018D8-AR12L
  • 存储控制器: LSI2116 IT模式(集成的软件解决scheme)无需任何caching或逻辑卷pipe理
  • 硬盘日立Ultrastar 7K6000 4Tb(HUS726040ALE614)
  • 操作系统: Ubuntu 16.04.2,内核4.4.0-81-通用

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

  • 禁止写入caching:264 IOPS,提交延迟3.768ms(尽pipe高标准偏差)
  • 写入caching启用:96 IOPS,提交延迟10.3ms

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

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

 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 

写入caching启用:

 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 

禁止写入caching:

 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 

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

•与上一代7K4000相比

使用媒体caching技术,速度提高3倍以上
连续读取/写入性能提高25%

它仍然不能解释为什么写caching被禁用时,性能会更好,但是,看起来确实像写caching被启用时,性能可以与前一版相提并论。 一代7K4000。 没有写caching随机写入性能是2.6倍快,顺序是1.2倍快。

UPD3推测:较新的Hitachi Ultrastar驱动器具有称为“ 媒体caching”的function。 这是一个先进的非易失性caching技术,这是如何工作的(当然,据我所知):

  • 首先将数据写入DRAMcaching
  • 接下来,驱动器在每个盘片上具有许多保留区域,其物理位于提供最佳速度的区域中。 这些区域本质上是媒体caching存储。 所以,这些区域被用作非易失性二级caching。 来自DRAM缓冲区的数据被累积并以高的队列深度刷新到媒体caching中。 这可以使头部移动最小化,并提供额外的可靠性和速度增益。
  • 只有在数据被写入到盘片上的实际存储区域之后。

所以,媒体caching是一个两阶段的写回caching,我认为只有刷新到媒体caching完成后,写操作才算完成。
有趣的技术,我必须承认。 我的假设是,当我们用hdparm -W0 -W0禁用写入caching时,只有媒体caching被禁用。
数据仅被caching在DRAM中,然后直接刷新到盘片上。 尽pipe媒体caching肯定会提供很大的优势,但在同步写入时,我们必须等待写入媒体caching区域。 当媒体caching被禁用时,在数据被写入磁盘DRAM缓冲区之后,认为写入完成。 快多了。 在更低的队列深度上,DRAMcaching提供了足够的空间来写入而不会降低速度,然而,在更大的队列中,当需要不断地向盘片刷新时,情况是不同的。 我已经用QD = 256进行了两个testing。

 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 

所以,我们清楚地看到,启用写caching在IOPS和提交延迟方面有11.5%的优势。 看起来像我的hypotesis是正确的, hdparm只控制媒体caching,但不是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 

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


UPD4(看起来我有一个答案)
我已经联系了HGST的支持,他们已经澄清说,在7K6000媒体caching仅在禁止写入caching(DRAM)时才有效。 所以,看起来像低队列深度媒体caching实际上比DRAMcaching更快。 我想,这是因为媒体caching允许写入数据顺序进入它的caching区域,而不pipeIO模式。 这大大降低了所需的HDD磁头移动,并导致更好的性能。 我仍然想知道更多关于媒体caching,所以,我还没有回答我自己的问题。 相反,我已经要求支持更多有关媒体caching的技术信息。 如果我得到任何更多的信息将更新这个问题。


我仍然非常感谢任何build议,意见或替代解释。 提前致谢!