X9DR3-F 上的 NVMe 驱动器性能意外不佳

Bry*_*her 8 raid performance nvme

我遇到了服务器中 NVMe SSD 条带性能异常低下的情况。硬件如下:

  • 主板:X9DR3-F
  • CPU:双E5-2650v2
  • 内存:128GB DDR3-1333 UDIMM (16x8GB)
  • NVMe 驱动器:4 个 MZVLB256HBHQ-000L7,通过带有分叉通道的 PCIe 扩展器

lspci -nvv显示了设备的 8GT/s x4 链路,显示它在 PCIe 3.0 上运行,就像驱动器想要的那样: LnkSta: Speed 8GT/s, Width x4。该驱动器的基准测试表明它能够以 1.4GB/s 左右的写入速度运行。

当我尝试对驱动器进行顺序写入时,我获得了大约三分之一的性能。下面显示了写入期间的 619MB/s,然后又暂停了 50 秒,大概是在数据完全刷新到磁盘时。

$ sudo dd if=/dev/zero of=/dev/nvme1n1 bs=16M count=1k status=progress
16726884352 bytes (17 GB, 16 GiB) copied, 27 s, 619 MB/s
1024+0 records in
1024+0 records out
17179869184 bytes (17 GB, 16 GiB) copied, 71.8953 s, 239 MB/s
Run Code Online (Sandbox Code Playgroud)

假设这只是我的综合基准与其他人的综合基准相比的一些怪癖,我将所有 4 个设备放入 MD RAID-0 中并再次尝试:

$ sudo mdadm --create /dev/md0 --level=0 --raid-devices=4 --force --run /dev/nvme?n1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
$ sudo dd if=/dev/zero of=/dev/md0 bs=16M count=2k status=progress
34191966208 bytes (34 GB, 32 GiB) copied, 57 s, 600 MB/s
2048+0 records in
2048+0 records out
34359738368 bytes (34 GB, 32 GiB) copied, 79.7502 s, 431 MB/s
Run Code Online (Sandbox Code Playgroud)

更好,但还有很多不足之处。如果我的公立学校教育数学可信的话,这些驱动器的传输速度在每秒 430x10 到 600x10 兆位之间,因此最好的情况是 6gbit。在理想条件下,根据其他人的综合基准,我预计 4x 驱动器在简单的全 0 条带写入中将达到 6GByte。假设这只是系统的一些限制,我针对不同的主机测试了不相关的 40gbps 以太网卡:

$ iperf -c 10.x.x.x -P 4
------------------------------------------------------------
Client connecting to 10.x.x.x, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  2] local 10.x.x.x port 53750 connected with 10.x.x.x port 5001 (icwnd/mss/irtt=87/8948/196)
[  1] local 10.x.x.x port 53754 connected with 10.x.x.x port 5001 (icwnd/mss/irtt=87/8948/132)
[  3] local 10.x.x.x port 53738 connected with 10.x.x.x port 5001 (icwnd/mss/irtt=87/8948/212)
[  4] local 10.x.x.x port 53756 connected with 10.x.x.x port 5001 (icwnd/mss/irtt=87/8948/107)
[ ID] Interval       Transfer     Bandwidth
[  2] 0.0000-10.0027 sec  12.4 GBytes  10.6 Gbits/sec
[  1] 0.0000-10.0180 sec  12.7 GBytes  10.9 Gbits/sec
[  3] 0.0000-10.0179 sec  10.6 GBytes  9.05 Gbits/sec
[  4] 0.0000-10.0180 sec  10.5 GBytes  8.97 Gbits/sec
[SUM] 0.0000-10.0011 sec  46.1 GBytes  39.6 Gbits/sec
Run Code Online (Sandbox Code Playgroud)

虽然该网卡与 SSD 性能无关,但对我来说,它确实表明系统能够通过 PCIe 使至少 40gbit 链路饱和,特别是因为该卡只是 x8 链路而不是 4x4。 值得注意的一件事是,以太网卡位于 CPU1_SLOT1 上,SSD 位于 CPU2_SLOT4 上。 我不确定这是否会导致性能上的巨大差异,因为 SLOT4 直接挂在 CPU2 上,而 SLOT1 直接挂在 CPU1 上。CPU 之间有双 8GT/s QPI 链路,无需额外交换机: X9DR3-F框图

对我来说,值得注意的是读取性能也相应较低。这里没有文件系统开销,这只是有效的原始闪存和 PCIe 性能。这是关于较小硬件上 RAID-5 中 4 倍消费类 SATA HDD 的读取性能,因此绝对慢得令人无法接受:

$ sudo dd if=/dev/md0 of=/dev/null bs=16M count=8k
8192+0 records in
8192+0 records out
137438953472 bytes (137 GB, 128 GiB) copied, 214.738 s, 640 MB/s
Run Code Online (Sandbox Code Playgroud)

top在此读取操作期间检查显示dd占用了 100% CPU,其中 97% 用于系统等待。其他 31 个线程或多或少处于空闲状态。我可以从哪里开始诊断这里遇到的性能问题?


假设这只是 DD 的问题,我再次尝试使用 fio。我保留 MD 设备,将其格式化为 XFS,允许其选择默认设置,安装它,并运行https://cloud.google.com/compute/docs/disks/benchmarking-pd-performance中概述的测试:

顺序写入

Run status group 0 (all jobs):
  WRITE: bw=1348MiB/s (1414MB/s), 1348MiB/s-1348MiB/s (1414MB/s-1414MB/s), io=80.8GiB (86.7GB), run=61368-61368msec

Disk stats (read/write):
    md0: ios=0/710145, merge=0/0, ticks=0/397607236, in_queue=397607236, util=99.82%, aggrios=0/177558, aggrmerge=0/2, aggrticks=0/99452549, aggrin_queue=99465067, aggrutil=99.62%
  nvme0n1: ios=0/177568, merge=0/5, ticks=0/56627328, in_queue=56635784, util=97.96%
  nvme3n1: ios=0/177536, merge=0/1, ticks=0/145315089, in_queue=145331709, util=99.62%
  nvme2n1: ios=0/177559, merge=0/3, ticks=0/151148103, in_queue=151165889, util=99.44%
  nvme1n1: ios=0/177569, merge=0/0, ticks=0/44719677, in_queue=44726889, util=97.87%
Run Code Online (Sandbox Code Playgroud)

随机写入

Run status group 0 (all jobs):
  WRITE: bw=101MiB/s (106MB/s), 101MiB/s-101MiB/s (106MB/s-106MB/s), io=6074MiB (6370MB), run=60003-60003msec

Disk stats (read/write):
    md0: ios=0/1604751, merge=0/0, ticks=0/623304, in_queue=623304, util=100.00%, aggrios=0/401191, aggrmerge=0/2, aggrticks=0/153667, aggrin_queue=153687, aggrutil=99.99%
  nvme0n1: ios=0/402231, merge=0/3, ticks=0/156754, in_queue=156775, util=99.98%
  nvme3n1: ios=0/401144, merge=0/2, ticks=0/149648, in_queue=149667, util=99.98%
  nvme2n1: ios=0/400158, merge=0/0, ticks=0/150380, in_queue=150400, util=99.98%
  nvme1n1: ios=0/401233, merge=0/4, ticks=0/157887, in_queue=157908, util=99.99%
Run Code Online (Sandbox Code Playgroud)

顺序读取

Run status group 0 (all jobs):
   READ: bw=6244MiB/s (6547MB/s), 6244MiB/s-6244MiB/s (6547MB/s-6547MB/s), io=367GiB (394GB), run=60234-60234msec

Disk stats (read/write):
    md0: ios=3089473/14, merge=0/0, ticks=272954324/220, in_queue=272954544, util=99.98%, aggrios=779529/3, aggrmerge=6/1, aggrticks=68744470/104, aggrin_queue=68744621, aggrutil=99.60%
  nvme0n1: ios=779520/6, merge=12/2, ticks=24023533/1, in_queue=24023534, util=98.84%
  nvme3n1: ios=779519/2, merge=14/0, ticks=145571896/378, in_queue=145572449, util=99.60%
  nvme2n1: ios=779536/3, merge=0/1, ticks=77038488/3, in_queue=77038492, util=98.90%
  nvme1n1: ios=779544/3, merge=0/1, ticks=28343963/34, in_queue=28344012, util=98.81%
Run Code Online (Sandbox Code Playgroud)

随机读取

Run status group 0 (all jobs):
   READ: bw=372MiB/s (390MB/s), 372MiB/s-372MiB/s (390MB/s-390MB/s), io=21.8GiB (23.4GB), run=60002-60002msec

Disk stats (read/write):
    md0: ios=5902401/10, merge=0/0, ticks=2684388/0, in_queue=2684388, util=100.00%, aggrios=1475009/3, aggrmerge=608/0, aggrticks=685706/0, aggrin_queue=685706, aggrutil=99.90%
  nvme0n1: ios=1475288/4, merge=632/1, ticks=697246/0, in_queue=697246, util=99.89%
  nvme3n1: ios=1475328/2, merge=611/0, ticks=678849/1, in_queue=678850, util=99.89%
  nvme2n1: ios=1474625/3, merge=588/1, ticks=673908/0, in_queue=673909, util=99.90%
  nvme1n1: ios=1474795/3, merge=602/0, ticks=692822/1, in_queue=692822, util=99.90%
Run Code Online (Sandbox Code Playgroud)

这些速度要快得多,表明多个线程在阵列上运行具有优势,但其他在线基准测试再次显示这些驱动器单独执行 1GB/s 写入(而我的所有 4 个驱动器组合的峰值为 1.4GB/s),并且我我们已经看到 UserBenchmark 结果显示每个驱动器的读取速度为 2.2GB/s,因此 6GB/s 的读取速度在上下文中表现得相当不错。

那么有什么办法可以提高单进程性能呢?

sho*_*hok 7

三星 MZVLB256HBHQ-000L7 是小型 SSD (256 GB),因此对于跨越多个 GB 的任何写入操作,您都将遇到内部 NAND 带宽瓶颈。您可以修剪它们(丢失当前存储在驱动器上的所有数据)以清理内部 pSLC 缓存,为第一个基准测试提供更多带宽,但您很快就会再次使其饱和。


Bry*_*her 0

好吧,我不想这样做,但最终我应该回答并结束这个问题。PM981 驱动器确实具有 512MB DRAM 缓存,并且还提供 12GB SLC 缓存,因此它们应该很快。RAID-0 中的四个人应该尖叫。

https://www.techpowerup.com/ssd-specs/samsung-pm981a-256-gb.d784

我只是买了一个NAS,因为我从来没有解决过这个问题。