总低密度脂蛋白

总低密度脂蛋白

总低密度脂蛋白

对于非常简单的顺序读取,FIO 报告比 NVMe SSD 顺序读取能力慢得多。


正文

大家好,

我在尝试为我的三星 980 Pro 1T NVMe SSD 实现供应商报告的最大读取带宽时遇到了问题。根据三星产品描述,该SSD能够达到约7GB/s的读取带宽。然而,尽管我付出了努力,我仍然无法达到这个最大读取带宽。

当前设置:

  • 固态硬盘:三星980 Pro 1T NVMe固态硬盘
  • 连接:PCIe 4.0端口
  • 操作系统:Linux Ubuntu

当前的 FIO 脚本和结果:为了测试 SSD 的读取性能,我一直在使用 FIO 基准测试工具和以下脚本:

$ sudo fio --loops=5 --size=1024m --filename=/dev/nvme0n2 --stonewall --ioengine=libaio --direct=1 --zero_buffers=1 --name=Seqread --bs=1024m --iodepth=1 --numjobs=1 --rw=read

以下是运行 FIO 脚本获得的结果:

Seqread: (g=0): rw=read, bs=(R) 1024MiB-1024MiB, (W) 1024MiB-1024MiB, (T) 1024MiB-1024MiB, ioengine=libaio, iodepth=1
fio-3.28
Starting 1 process
Jobs: 1 (f=1)
Seqread: (groupid=0, jobs=1): err= 0: pid=1504682: Mon Oct 16 09:28:48 2023
  read: IOPS=3, BW=3368MiB/s (3532MB/s)(5120MiB/1520msec)
    slat (msec): min=151, max=314, avg=184.19, stdev=72.71
    clat (msec): min=2, max=149, avg=119.59, stdev=65.39
     lat (msec): min=300, max=316, avg=303.77, stdev= 7.33
    clat percentiles (msec):
     |  1.00th=[    3],  5.00th=[    3], 10.00th=[    3], 20.00th=[    3],
     | 30.00th=[  148], 40.00th=[  148], 50.00th=[  148], 60.00th=[  148],
     | 70.00th=[  150], 80.00th=[  150], 90.00th=[  150], 95.00th=[  150],
     | 99.00th=[  150], 99.50th=[  150], 99.90th=[  150], 99.95th=[  150],
     | 99.99th=[  150]
   bw (  MiB/s): min= 2048, max= 4096, per=81.07%, avg=2730.67, stdev=1182.41, samples=3
   iops        : min=    2, max=    4, avg= 2.67, stdev= 1.15, samples=3
  lat (msec)   : 4=20.00%, 250=80.00%
  cpu          : usr=0.00%, sys=31.47%, ctx=405, majf=0, minf=262156
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=5,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: bw=3368MiB/s (3532MB/s), 3368MiB/s-3368MiB/s (3532MB/s-3532MB/s), io=5120MiB (5369MB), run=1520-1520msec

Disk stats (read/write):
  nvme0n2: ios=9391/0, merge=0/0, ticks=757218/0, in_queue=757218, util=93.39%

我将不胜感激任何指导或建议如何优化我的 FIO 脚本以实现大约 7 GB/s 的预期读取带宽。如果可以对脚本进行任何改进或修改,请告诉我。预先感谢您的帮助!

请随时提供可能与当前问题相关的任何其他信息或见解。


笔记:

应该是PCIe4.0*4:

$ lspci -vv -s 5e:00.0
5e:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO (prog-if 02 [NVM Express])
    Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
    Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0, Cache Line Size: 32 bytes
    Interrupt: pin A routed to IRQ 39
    NUMA node: 0
    IOMMU group: 84
    Region 0: Memory at c5e00000 (64-bit, non-prefetchable) [size=16K]
    Capabilities: <access denied>
    Kernel driver in use: nvme
    Kernel modules: nvme

$ cat /sys/class/pci_bus/0000\:5e/device/0000\:5e\:00.0/max_link_width 
4
$ cat /sys/class/pci_bus/0000\:5e/device/0000\:5e\:00.0/max_link_speed 
16.0 GT/s PCIe

答案1

  1. 考虑增加测试规模或简单地删除限制。使用--size=1024m意味着您的目标是特定范围的 NAND 闪存,这可能会限制带宽。
  2. 选择基于时间的选项和较小的块大小。通过指定--bs=1024m相同的大小,您实际上是使用单个 I/O 来完成每个循环fio(尽管它将在块层分为许多较小的 I/O),从而导致可能出现偏差的结果。
  3. 增加 I/O 深度。任何 SSD 的规格数字都不可能基于单个作业和深度 1。

考虑尝试以下命令:

sudo fio --time_based --runtime=300 --filename=/dev/nvme0n2 --ioengine=libaio --direct=1 --bs=1024k --iodepth=128 --numjobs=1 --rw=read --name=read --group_reporting

相关内容