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)
相关硬件细节:
不幸的是,我想不出对这种行为的任何合理解释,快速总结:
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的功能。这是一种先进的非易失性缓存技术,这是它的工作原理(当然,据我所知):
所以,媒体缓存是一个两阶段的写回缓存,我认为只有在刷新到媒体缓存完成后,写操作才被认为是完成的。
有趣的技术,我必须承认。我的假设是,当我们禁用写缓存时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 磁头移动并带来了更好的性能。我仍然想了解更多关于媒体缓存的信息,所以,我还没有回答我自己的问题。相反,我要求支持提供有关媒体缓存的更多技术信息。如果我得到任何信息,我会用更多信息更新这个问题。
我仍然非常感谢任何建议、评论或替代解释。提前致谢!
最近的 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)
注意事项:
从禁用缓存的direct对比中我们可以看到禁用了DRAM 缓冲区和MediaCache;否则,结果会明显高于实际结果。这些结果与寻道受限的 7200 RPM 磁盘(大约 70 IOPS)的性能完全一致。direct+synchdparm -W0directdirect+sync
启用缓存后,性能会好得多,IOPS 几乎翻倍。由于sync阻止单独在 DRAM 缓冲区中进行缓存,这意味着 MediaCache 在这里工作。
因此,虽然其他一些 NVRAM 技术在WCD/WC0(禁用写入缓存)磁盘设置上运行,但 MediaCache 似乎需要 WCE/WC1工作。