为什么我的RAID1读取访问速度比写入访问速度慢?


10

我已经做了一些简单的性能测试,看来从RAID1读取要比写入慢:

root@dss0:~# for i in 1 2 3; do dd if=/dev/zero of=/dev/sda bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 192.349 s, 715 MB/s
137438953472 bytes (137 GB) copied, 192.851 s, 713 MB/s
137438953472 bytes (137 GB) copied, 193.026 s, 712 MB/s
root@dss0:~# for i in 1 2 3; do dd if=/dev/sda of=/dev/null bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 257.201 s, 534 MB/s
137438953472 bytes (137 GB) copied, 255.522 s, 538 MB/s
137438953472 bytes (137 GB) copied, 259.945 s, 529 MB/s

我知道dd并不是性能测试工具,但是这个结果仍然令人惊讶。

该系统由供应商构建,并具有一个带16 GB RAM的Supermicro主板。RAID控制器是具有1 GB缓存的MegaRAID 9271-8i。SAS-933EL1背板上有8个2 TB的SAS磁盘。我不确定电缆连接,控制器的一个连接器连接到SAS背板,另一个连接器连接到两个装有操作系统的SATA磁盘。

使用以下命令设置RAID1:

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r1 [8:0,8:1,8:2,8:3,8:4,8:5,8:6,8:7] WB NORA Direct -a0
Adapter 0: Created VD 0
Adapter 0: Configured the Adapter!!
Exit Code: 0x00

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aALL
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 7.275 TB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 7.275 TB
State               : Optimal
Strip Size          : 256 KB
Number Of Drives    : 8
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
PI type: No PI
Is VD Cached: No
Exit Code: 0x00

我希望读访问至少与写访问一样快,甚至更快。715 MByte / sec的写入速度似乎接近单个SAS / SATA连接器的6 GBit限制。这可能是SAS背板的配置或布线问题?可以使用MegaRAID命令查询SAS背板配置吗?请指教。

更新资料

正如poige和Peter所解释的,读取性能慢于预期可能是由于Linux I / O子系统的缓存引起的。

当在dd命令中使用直接标志时,我得到

root@dss0:~# dd if=/dev/sda of=/dev/null bs=1048576 count=131072 iflag=direct
137438953472 bytes (137 GB) copied, 199.862 s, 688 MB/s

更好,但仍然比写入速度慢10%。使用oflag = direct不会影响写入速度。


简单答案:读取需要等待结果,写入则不需要。
David Schwartz

Answers:


8

poige关于写缓存是完全正确的,但是这里有更多详细信息。

dd为零并使用写入缓存不是进行基准测试的正确方法(除非您当然要测试写入缓存,这可能仅对文件系统有用,以查看其同步元数据,创建新文件的数量等)。 )(很可能是dd始终是错误的基准测试类型,但适用于非常基本的测试)

我建议您将dd与以下选项之一一起使用:

conv=fdatasync -> this will make it flush to disk before finishing and calculating speed
oflag=direct   -> this will make it skip the OS cache but not the disk cache
conv=sync      -> more like skipping the disk cache too, but not really ... just flushing it every block or something like that.

并且也不使用零。如果数据可预测为零,则某些智能硬件/软件/固件可能会使用一些快捷方式。如果存在我猜您没有使用的压缩,则尤其如此。而是使用内存中的随机文件(例如/ dev / shm)。urandom很慢,因此您需要暂时将其写入某个地方以再次阅读。创建一个50MB的随机文件:

dd if=/dev/urandom of=/dev/shm/randfile bs=1M count=50

多次读取文件以将其写入(此处我使用cat读取了6次):

dd if=<(cat /dev/shm/randfile{,,,,,}) of= ... conv=fdatasync

rm /dev/shm/randfile

还请记住,并行操作最快读取raid1,因此可以独立使用磁盘。协调磁盘以读取不同磁盘上的同一操作的不同部分可能不够聪明。


10

问题答案的关键是预读。从前,我也碰巧遇到了这个问题

IOW,为获得最佳顺序读取性能,所有磁盘应永久包含在Input中。

当您使用ddw / o directio(请参阅参考资料man dd)时,写入操作不会立即执行,而是通过OS缓存进行,因此有更多机会按顺序涉及所有磁盘并获得最大可能的性能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.