我有很多 1TB 三星 mSATA 硬盘,我想将它们重新用作服务器存储。我购买了 24 个 -星达 25SAT22MSAT适配器,并为每个适配器安装 2 个 mSATA 驱动器。然后,我在每个适配器/载体上启用了 RAID0 功能。
接下来,我把所有 24 个适配器装进SuperMicro SC216BAC-R920LPB机箱,并将 SAS-216A 背板的 6 个 SAS 通道连接到BroadCom MegaRAID SAS 9361-24i卡片。
MegaRAID 9361-24i 卡具有 24 个独立 SAS/SATA 通道和 PCIe Gen3 x8 接口。我原本希望使用此设置能够实现 4-5 GB/s 的读取性能。然而,我能获得的最快读取速度约为 2.1 GB/s。
我一直在使用简单(单线程)定时 cat 操作来测量性能:
$ sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
$ time cat data_20GB.bin > /dev/null
real 0m9.780s
user 0m0.165s
sys 0m5.969s
以及使用我打算在这台机器上运行的(多线程)应用程序。两种方法都表现出类似的性能。
我做的第一件事就是测量单个适配器/载体的性能:
$ sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
$ time cat data_20GB.bin > /dev/null
real 0m38.639s
user 0m0.309s
sys 0m10.142s
我的简单测试显示,每个适配器的单线程读取性能约为 530 MB/s。如果我四舍五入,得出 500 MB/s x 24 = ~12 GB/s。我相信此设置应该能够轻松满足 PCIe Gen 3 x8 链路(8 GT/s)的要求。
SuperMicro 服务器运行的是 Ubuntu 16.04,其启动盘与 RAID 阵列是分开的。我已将 Linux 驱动程序和固件都更新到最新版本。我还验证了 RAID 卡是否以预期的 Gen 3 x8 速率连接。
目标应用程序的数据访问模式主要是大型顺序读取。
以下是我首次配置 RAID 阵列的方式:
storcli64 /c0 add vd type=raid5 name=storage drives=252:0-23 pdperarray=24 pdcache=on cached wb ra strip=256
此配置提供读取性能:
- 简单(定时猫):1.98 GB/s
- 应用程序:2.04 GB/s
以下是从那时起我尝试过的其他一些事情:
- 调整许多(如果不是全部)RAID 配置选项的组合(RAID0 与 RAID5、缓存与直接、预读与不预读、所有支持的条带大小)。没有一种组合能达到高于 2 GB/s 的读取速度,许多组合的速度要慢得多。
- 调整 RAID 卡本身的配置选项。更改这些选项对性能几乎没有影响。
- 仅使用 6 个驱动器创建阵列。我测量的读取性能仍然为 ~2 GB/s,与使用所有 24 个驱动器时相同。这似乎是一个重大危险信号,但我无法找出原因。无论我使用驱动器 0-5 还是驱动器 0、4、8、12、16、20 创建阵列,我都会获得相同的读取性能。
- 创建包含 12 个驱动器的阵列。同样的问题,我测量的读取性能约为 2 GB/s。
我完全被难住了。有人知道为什么硬件 RAID 读取性能最高只有 ~2 GB/s 吗?欢迎提出任何建议。
更新
我将 RAID 卡设置为 JBOD 模式,这样 24 个驱动器中的每一个都作为单独的块设备出现在操作系统中。然后我创建了一个软件 (mdadm) RAID5 并重复了我的性能测量:
- 简单(定时猫):4.06 GB/s
- 实际应用:5.92 GB/s
这是我期望硬件 RAID 达到的性能水平。也许我应该省下 500 美元,直接购买同等的 SAS HBA 卡。