请注意。 长时间阅读。
在我打算在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
相关的硬件细节:
不幸的是,我想不出这种行为的任何合理的解释,快速总结:
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技术,这是如何工作的(当然,据我所知):
所以,媒体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议,意见或替代解释。 提前致谢!