我有一台服务器,配有 LSI MegaRAID SAS 9260-4i 控制器、RAID-5 和 3 个 2 TB 磁盘。我做了一些性能测试(使用 iozone3),数字清楚地表明写入缓存策略也会影响读取性能。如果我将策略设置为 WriteBack,与 WriteThrough 相比,我的读取性能大约是前者的 2 倍。写入缓存如何影响读取性能?
以下是设置的详细信息:
megacli -LDInfo -L0 -a0
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name :
RAID Level : Primary-5, Secondary-0, RAID Level Qualifier-3
Size : 3.637 TB
Is VD emulated : Yes
Parity Size : 1.818 TB
State : Optimal
Strip Size : 512 KB
Number Of Drives : 3
Span Depth : 1
Default Cache Policy: WriteThrough, ReadAhead, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteThrough, ReadAhead, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy : Disabled
Encryption Type : None
Bad Blocks Exist: No
Is VD Cached: No
启用 WriteBack 后(其他所有内容保持不变):
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
来自 iozone3 的一些数据:
WriteThrough:
random random
KB reclen write rewrite read reread read write
2033120 64 91963 38146 144980 139122 11795 21564
2033120 128 83039 90746 118660 118147 21193 33686
2033120 256 78933 40359 113611 114327 31493 51838
2033120 512 71133 39453 131113 143323 28712 60946
2033120 1024 91233 76601 141257 142820 35869 45331
2033120 2048 58507 48419 136078 135220 51200 54548
2033120 4096 98426 70490 119342 134319 80883 57843
2033120 8192 70302 63047 132495 144537 101882 57984
2033120 16384 79594 29208 148972 135650 124207 79281
WriteBack:
random random
KB reclen write rewrite read reread read write
2033120 64 347208 302472 331824 302075 12923 31795
2033120 128 354489 343420 292668 322294 24018 45813
2033120 256 379546 343659 320315 302126 37747 71769
2033120 512 381603 352871 280553 322664 33192 116522
2033120 1024 374790 349123 289219 290284 43154 232669
2033120 2048 364758 342957 297345 320794 73880 264555
2033120 4096 368939 339926 303161 324334 128764 281280
2033120 8192 374004 346851 303138 326100 186427 324315
2033120 16384 379416 340577 284131 289762 254757 356530
有关该系统的一些细节:
- Ubuntu 12.04
- 64 位
- 内核 3.2.0(3.2.0-58-通用)
- 测试时内存限制为 1 GB
- iozone3 版本 397-2
- 用于测试的分区:
/dev/sda4 /var ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
答案1
通过使用写回缓存,您可以节省磁盘 IOPS。控制器可以将较小的写入分批处理为一个较大的写入。
因此,有更多的 IOPS 可用于读取。
这假设测试是并发的。如果给定的测试只是读取或写入,则这无关紧要。
答案2
这次测试在什么文件系统上运行?
我想到的是 atime。如果您的文件系统使用 atime 选项挂载,或者缺少 no/relatime 挂载选项,则每次读取都会获得一次写入。
(atime表示记录文件最后访问时间)
如果您发布输出可能会有所帮助
mount
并指定您在哪个设备上进行测试。
答案3
回写政策做在使用 iozone 等测试时会对红色性能产生影响,因为这些基准测试工具通过读取先前写入的数据来测量读取性能。因此,当 iozone 开始读取测试时,一些数据仍然位于缓存中,从而使读取吞吐量高得多。这与文件大小无关,因为 raid 适配器不了解文件,甚至不知道文件系统。它所知道的只有 IO 和块。请记住 iozonr 我有一个 fs 基准测试工具,而 thug 完全抽象了硬件。也许使用 -J/-Y 您可以减轻写回策略的影响并了解您的读取性能……或者使用真正的 HDD 基准测试工具(hdparm?)
答案4
很可能在文件被写入时它也被作为连续的块写入磁盘上。
先前的解决方案没有考虑到的一件事是控制器上处理回写命令和写通命令的方式之间的差异。
回写意味着当控制器收到命令时,它会立即告诉操作系统处理程序该命令“成功”,并给出下一个命令。直写等待每个单独的命令报告成功后再处理下一个查询。
因此命令排队速度更快。然后阵列的预读设置将开始用连续的数据流填充缓存。
如果您观察随机写入和随机读取事件之间的非常小的百分比差异,您会发现具有更快命令排队的预读有很大帮助,这些差异基本上消除了预读的提升,尤其是在较小的块大小时。
另一个可能影响性能的因素是每次读取或写入操作涉及多少个不同磁头的切片大小和块大小。