我有一台8通道LSI SAS3008控制器芯片的机器,单独的驱动器testing表明,我可以以174 MB /秒和193 MB /秒的速度写入任何磁盘或所有磁盘,并具有持续的写入速度:
这是命令dd if=/dev/zero of=/dev/mapper/mpath?p1 bs=1G count=100 oflag=direct的输出dd if=/dev/zero of=/dev/mapper/mpath?p1 bs=1G count=100 oflag=direct 与所有12个磁盘并行运行:
107374182400 bytes (107 GB) copied, 556.306 s, 193 MB/s 107374182400 bytes (107 GB) copied, 566.816 s, 189 MB/s 107374182400 bytes (107 GB) copied, 568.681 s, 189 MB/s 107374182400 bytes (107 GB) copied, 578.327 s, 186 MB/s 107374182400 bytes (107 GB) copied, 586.444 s, 183 MB/s 107374182400 bytes (107 GB) copied, 590.193 s, 182 MB/s 107374182400 bytes (107 GB) copied, 592.721 s, 181 MB/s 107374182400 bytes (107 GB) copied, 598.646 s, 179 MB/s 107374182400 bytes (107 GB) copied, 602.277 s, 178 MB/s 107374182400 bytes (107 GB) copied, 604.951 s, 177 MB/s 107374182400 bytes (107 GB) copied, 605.44 s, 177 MB/s
但是,当我把这些磁盘作为一个软件RAID 10设备时,我得到约500 MB /秒的写入速度。 我预计会得到大约两倍,因为在同一时间访问这些磁盘没有任何处罚。
我注意到了md10_raid10进程,我认为软件raid本身接近80%,一个核心总是等待100%,空闲0%。 然而,哪个核心是变化的。
此外,使用缓冲区高速caching写入已安装的EXT4文件系统时性能会进一步下降,而不是使用oflag = direct来绕过高速caching。 磁盘报告25%忙(根据munin监测),但磁盘显然不热,但我担心md10设备本身可能。
任何build议下一步该怎么去? 我正在尝试一个硬件RAID 10的configuration来比较,虽然我只能build立一个10磁盘单位似乎 – 说,我希望得到900 MB /秒的写入持续。 随着我发现更多,我会更新这个问题。
编辑1:
如果我用一个dd命令写入安装在该设备上的ext4分区,并且不使用缓冲区caching(oflag = direct),那么我可以在峰值和每秒855 MB的速度上获得950 MB /秒的速度持续一些改变的挂载标志。
如果我也用同样的时间读取iflag = direct,我现在可以获得480 MB /秒的写入和750 MB /秒的读取。
如果我没有使用oflag = direct写入,因此使用缓冲区caching,我可以获得230 MB /秒的写入速度和1.2 MB /秒的读取速度,但是机器看起来非常缓慢。
所以,问题是,为什么会使用缓冲区caching严重影响性能? 我已经尝试了各种磁盘队列策略,包括在驱动器级别使用'noop',并且在适当的多pathdm设备上,或者在最后期限或者最后期限之前,在后台驱动器上设置'deadline'或'cfq'。 看起来后备驱动器应该没有,多path设备应该是我想要的,但这至less在缓冲区caching的情况下根本不影响性能。
你的dd oflag=direct观察可能是由于电源pipe理问题。 在写入负载下,使用PowerTOP查看CPU的C状态是否在C1以上切换太频繁。 如果是,请尝试调整PM以确保CPU不会hibernate并重新运行基准testing。 请参阅您的发行版的文档如何做到这一点 – 在大多数情况下,这将是intel_idle.max_cstate=0内核bootline参数,但YMMV。
O_DIRECT写入和缓冲写入之间的巨大差异可能是由于:
这看起来非常像是由md单线程造成的瓶颈。
dd运行每个驱动器显示为170MB / s +,所以path不受连接PCIe带宽的限制 虽然multithreadingRAID5校验和计算的补丁在2013年已经提交给mdraid ,但我找不到类似的RAID1 / RAID10增强function,所以他们可能根本就不在那里。
dd写一个以上的线程,只是为了看看它是否改变了任何东西 FWIW,你很less(如果有的话)将看到写入性能峰值(特别是对于非CoW文件系统)与机械存储介质的带宽。 大多数时候,你会受到寻找时间的限制,所以只要满足你的最低要求,峰值带宽就不应该受到高度的关注。
1如果你做 ZFS的话,你应该改进你的testing方法,因为写一个ZFS数据集的全零块可能是任意快的。 如果数据集已启用压缩,则不将零写入磁盘,而只将其链接到全零块。