总低密度脂蛋白
对于非常简单的顺序读取,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
- 考虑增加测试规模或简单地删除限制。使用
--size=1024m
意味着您的目标是特定范围的 NAND 闪存,这可能会限制带宽。 - 选择基于时间的选项和较小的块大小。通过指定
--bs=1024m
相同的大小,您实际上是使用单个 I/O 来完成每个循环fio
(尽管它将在块层分为许多较小的 I/O),从而导致可能出现偏差的结果。 - 增加 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