PCIe Gen5 SSD 为什么读得快、写得慢?从存储原理到 Linux 性能实测

最近在 Jetson AGX Thor 上测试一块 Lexar ARES PRO 4TB Gen5 SSD,遇到一个值得研究的现象:读取约 14.9 GB/s,写入约 5~6 GB/s。

PCIe 已经工作在 Gen5 x4,为什么读写仍有这么大差距?要理解这个问题,需要分清三个层次:PCIe 带宽、主机数据访问路径,以及 SSD 内部 NAND 的读写能力。

一、Gen5 SSD 到底是什么?

图1:Lexar ARES PRO SSD。图片来源:Lexar 官方产品页面。

名称 含义
NAND Flash 真正保存数据的非易失性存储介质
SSD Controller 管理 NAND、地址映射、纠错和缓存的主控
PCIe Gen5 主机与 SSD 之间的接口代际
NVMe 主机访问 SSD 的通信协议
M.2 2280 外形规格:宽 22mm、长 80mm

典型数据路径为:

应用程序 → Linux 文件系统 → NVMe 驱动 → PCIe → SSD 主控 → NAND Flash

Gen5 说明接口传输能力,不能直接代表 NAND 的实际写入速度。

M.2 也不等于 NVMe。 M.2 是外形与连接器规范,既有 M.2 SATA SSD,也有通过 PCIe 连接的 M.2 NVMe SSD;U.2、E1.S 等其他形态的 SSD 同样可以使用 NVMe。选型时要同时确认外形、接口和协议。

Gen5 x4 有多快?

PCIe Gen5 每条 Lane 的速率为 32 GT/s,采用 128b/130b 编码。四条 Lane 的单向理论带宽为:

32 × (128 ÷ 130) × 4 ÷ 8 ≈ 15.75 GB/s

其中,4 表示 Lane 数,除以 8 是将 bit 换算为 Byte。这个结果只扣除了编码开销,还没有扣除 PCIe 数据包等协议开销。

PCIe 版本 单 Lane 速率 x4 单向理论带宽
Gen3 8 GT/s 3.94 GB/s
Gen4 16 GT/s 7.88 GB/s
Gen5 32 GT/s 15.75 GB/s

单位也要统一:GB/s 是十进制,GiB/s 是二进制,1 GiB/s ≈ 1.074 GB/s。例如 5107 MiB/s,约等于 5.35 GB/s。

二、NAND 为什么读写速度不同?

HDD 使用磁性介质保存数据;SSD 主要使用 NAND Flash,通过存储单元的电荷状态改变阈值电压,表示不同的数据。

图2:3D NAND 垂直堆叠结构。来源:Electronics 论文。

从材料和结构看,NAND 是半导体存储器,涉及硅沟道、绝缘介质及电荷存储结构;不同工艺采用浮栅或电荷俘获等方式。3D NAND 将存储单元垂直堆叠,提高单位面积的容量。

读取主要是检测阈值电压;写入则需要对单元编程,精确控制电荷状态,还可能涉及有效数据搬移、块擦除和垃圾回收。NAND 通常以 Page 为单位编程,以 Block 为单位擦除,因此写入过程往往更加复杂。

已经编程的数据不能像 RAM 一样随意原地覆盖。SSD 通常把更新数据写到新位置,再回收旧块;搬移和整理会产生额外写入,这就是写放大(Write Amplification)。例如主机写入 100GB、NAND 实际写入 150GB,写放大系数就是 1.5。它会影响持续写入性能和耐久度。

SLC、MLC、TLC、QLC 的区别

类型 全称 每个 Cell 存储 状态数 一般特点
SLC Single-Level Cell 1 bit 2 快、耐久度高、单位容量成本高
MLC Multi-Level Cell 2 bit 4 这里按行业常用的 2 bit MLC 理解
TLC Triple-Level Cell 3 bit 8 容量、成本与性能较均衡
QLC Quad-Level Cell 4 bit 16 容量密度高,持续写入更依赖具体设计

一个 TLC 单元需要区分 8 种状态,SLC 只需区分 2 种。状态越多,编程通常越精细。但最终性能还取决于 NAND 代际、主控并行度、固件和温度,不能只凭类型判断一块 SSD 的全部表现。TLC 的性能、成本与耐久度较均衡;读取密集、容量优先的应用也可以考虑 QLC,重点仍是目标负载下的表现。

三、pSLC、DRAM 和 HMB 别混淆

pSLC:让部分 NAND 暂时以 SLC 方式工作

pSLC 是 pseudo-SLC,即模拟 SLC。主控让部分 TLC 或 QLC 单元只保存 1 bit,以换取更快的写入。同样数量的 TLC 单元,以这种方式工作时,容量约为原来的三分之一。

写入过程可以概括为:

  1. 数据优先写入较快的 pSLC 区域。
  2. 主控在后台将数据整理到高密度存储区。
  3. 持续写入超过整理能力时,空闲缓存逐渐耗尽。
  4. 后续速度可能下降,具体表现取决于主控策略和 NAND 能力。

pSLC 主要用于加速写入,不会提高 PCIe 链路带宽。 已存在 pSLC 区域的数据也能从那里读取,但这是另一回事。

这里的 pSLC 通常不是额外增加一颗 SLC 芯片,而是 NAND 的一种工作模式。动态缓存往往随空闲容量减少而缩小,还受后台整理影响;同系列 4TB 型号的缓存,也不能简单按 2TB 型号翻倍估算。

短时间写入 8~32GiB,可能只测到缓存内速度;持续写入几百 GiB,才更容易观察耗尽后的变化。因此,不能给所有 SSD 规定一个固定测试量。

DRAM 与 HMB:主要辅助主控管理

SSD 的 FTL(Flash Translation Layer)负责将逻辑地址映射到 NAND 实际位置。主控还要执行磨损均衡,避免少数块过度擦写,并处理垃圾回收、坏块管理和纠错。

技术 使用的介质 主要用途
pSLC SSD 内部 NAND 加速写入
板载 DRAM SSD 上的独立内存 缓存映射表等数据,具体用途由主控决定
HMB 主机内存 为 SSD 提供辅助管理空间

DRAM-less 指没有独立板载 DRAM。部分 NVMe SSD 使用 HMB(Host Memory Buffer),借用少量主机内存。例如:

nvme nvme0: allocated 32 MiB host memory buffer.

这表示驱动分配了 32MiB HMB,不能将它理解为 32MiB 的 pSLC 缓存。一块 SSD 可以同时采用 TLC、没有独立 DRAM、支持 HMB,并拥有动态 pSLC 缓存。

DRAM-less 不等于顺序速度低。 大块连续访问的映射访问模式相对简单,主控并行度、NAND 和 pSLC 仍可能提供很高的吞吐量;随机 I/O、满盘和持续写入表现则需要分别测试。

DRAM 与 HMB 都是易失性内存,pSLC 属于非易失性 NAND。但 NAND 非易失不等于整盘具备完整掉电保护,仍要看固件、元数据保护和具体硬件设计。

四、Thor 上的读写实测说明了什么?

本次型号为 Lexar ARES PRO 4TB。此前查阅的官方规格标称最高顺序读取 14,000 MB/s、写入 11,000 MB/s;标称值对应厂商测试条件,并非所有平台的保证速度。

测试状态 顺序写入
默认功耗模式 约 2.7 GB/s
MAXN + jetson_clocks 约 5.35 GB/s

此前读取测试记录为:

READ: bw=13.9GiB/s (14.9GB/s)

最高性能状态下的写入记录为:

WRITE: bw=5107MiB/s (5355MB/s)

读取值略高于厂商标称,需结合完整 fio 命令、数据路径和重复测试复核,不能仅凭这一组记录宣称稳定超过标称性能。

目前最明确的现象是:切换平台功耗与频率配置后,写入速度明显提高。 这提示主机平台状态会影响结果,但还不足以锁定具体瓶颈。

为什么不能直接归因于 IOMMU?

从 SSD 设备的角度看:

  • 主机读取 SSD:SSD 通过 DMA 将数据写入主机内存。

  • 主机写入 SSD:SSD 通过 DMA 从主机内存取走待写数据。

两者的 PCIe 事务不同。后者通常涉及设备发起 Memory Read 请求、接收 Completion,实际效率可能受到请求并发、主机控制器及内存路径影响。

IOMMU 提供 DMA 地址映射和访问隔离,参与两个方向的数据访问。读快写慢本身,不能证明 IOMMU 就是瓶颈。 还需要相同条件下的持续写入、温度记录,以及跨平台对比。

五、Linux 怎样测试才有说服力?

  1. 先确认链路和设备状态
    以下 PCI 地址和设备节点仅为本次示例,实际使用前先通过 lspci 和 nvme list 确认。
    nvme list
    lspci -vv -s 0005:01:00.0 | grep -E 'LnkCap:|LnkSta:'
    cat /sys/bus/pci/devices/0005:01:00.0/current_link_speed
    cat /sys/bus/pci/devices/0005:01:00.0/current_link_width
    nvme smart-log /dev/nvme0
    dmesg | grep -Ei 'nvme|aer|rxerr|pcie'
    Gen5 x4 应显示 32 GT/s、宽度 x4。除此之外,还要记录 SSD 固件、温度、介质错误和热管理状态。
    如果反复出现 AER RxErr,应优先排查链路稳定性,包括连接器、信号完整性和供电,而不能只调整 fio 参数。协商到 Gen5 x4,也不代表实际吞吐量一定跑满。
  2. 用独立文件做顺序读写
    不要对装有系统或业务数据的裸盘直接执行写入测试。 下面在已挂载的 /data 中创建新目录,先确认它确实位于目标 SSD,并有足够空间。
    findmnt -T /data
    df -h /data
    BENCH_DIR= ( m k t e m p − d / d a t a / s s d − b e n c h . X X X X X X ) e c h o " (mktemp -d /data/ssd-bench.XXXXXX) echo " (mktemp−d/data/ssd−bench.XXXXXX)echo"BENCH_DIR"
    顺序写入:
    fio --name=bench \
    --directory="KaTeX parse error: Undefined control sequence: \- at position 18: ...NCH\_DIR" \\ \̲-̲-rw=write --bs=...BENCH_DIR" \
    --rw=read --bs=1M \
    --ioengine=libaio --iodepth=32 \
    --direct=1 --numjobs=4 \
    --size=8G --allow_file_create=0 \
    --group_reporting
    direct=1 用于绕过 Linux Page Cache,但不会绕过 SSD 的内部缓存,也不等于每次 I/O 都强制数据持久化。
    报告整次任务吞吐量时,优先使用 Run status group 下的 READ: bw= 和 WRITE: bw=,不要将瞬时采样最大值当作持续性能。
  3. 持续写入,观察速度下降点

确认空间充足并接受约 300GiB 测试写入后,可执行:

fio --name=slc_test \

--directory="KaTeX parse error: Undefined control sequence: \- at position 18: ...NCH\_DIR" \\ \̲-̲-rw=write --bs=...BENCH_DIR/slc_bw" \

--log_avg_msec=1000 \

--group_reporting

这里是四个 Job 各写 75GiB,合计 300GiB,会额外占用测试空间。各 Job 的带宽日志应按时间对齐后求和,不能将一个 Job 的日志误认为整盘带宽。

重点观察初始速度、下降位置、下降后的稳定值,以及温度是否同时升高。300GiB 只是一个起点,未必耗尽缓存。

比较多次结果时,应保持功耗模式、SSD 空闲容量、温度和后台负载尽量一致。如果主机先达到约 5~6GB/s 的上限,就可能看不到 SSD 自身更高的缓存内速度。

六、SSD 为什么贵,选型看什么?

SSD 的成本主要来自 NAND、主控、内存、封装与验证;价格还受容量、供需和产品定位影响。Gen5 接口只是其中一个因素。

分类 主要特点 常见用途
SATA SSD 顺序速度通常约 550MB/s 旧设备升级、普通存储
Gen4 NVMe SSD 带宽高,性能与成本较均衡 主流电脑、工作站
Gen5 NVMe SSD 更高带宽,需要关注散热与功耗 大文件处理、高吞吐任务
企业级 SSD 关注持续性能、耐久度及掉电保护等能力 服务器、数据中心
工业级 SSD 关注温度范围、供货周期和环境适应性 工控、嵌入式产品

上述分类维度并不互斥,企业级、工业级产品也可能使用 SATA 或 PCIe 接口,具体能力应查看型号规格。

NAND 制造商包括 Samsung、Micron、SK hynix、KIOXIA、YMTC 等;成品 SSD 品牌包括 Samsung、Lexar、Kingston、WD_BLACK、SanDisk、KIOXIA、Solidigm、致态等。成品品牌不等于全部核心芯片的制造商。

实际选型时,我更关注 NAND 类型、缓存耗尽后的持续速度、主控与散热、TBW 和保修,以及目标平台的兼容性。不能仅凭品牌或最高 GB/s 判断。

例如四路摄像头,每路 H.265 码率为 50Mbps,视频净数据量为:

4 × 50 ÷ 8 = 25 MB/s

这远低于 Gen4 的接口能力。实际还需考虑码率峰值、封装和其他写入负载,但录制场景更应关注稳定性、长时间延迟和异常断电处理。

七、这次测试的结论

层次 可能的限制 验证方法
PCIe 链路 代际、Lane 数、链路错误 lspci、sysfs、内核日志
主机平台 功耗模式、DMA、内存路径、IOMMU 控制变量、平台统计、重复对比
SSD 内部 NAND、pSLC、主控、温度 持续 fio、SMART、跨平台测试

目前确认的是:此前测试记录显示 Gen5 x4 链路下读取可达约 14.9GB/s,写入约 5~6GB/s,并且平台性能配置会明显影响写入结果。至于最终瓶颈在主机还是 SSD 内部,还需要进一步验证。

PCIe 带宽、主机数据路径和 NAND 写入能力,是三个不同的性能边界。 把它们分开分析,比只盯着一个跑分数字更有价值。

参考资料:

  1. Lexar ARES PRO 官方规格表
  2. Micron:Choosing the Right NAND
  3. NVM Express:规范资料
  4. Linux Kernel:Dynamic DMA Mapping
  5. fio 官方文档
相关推荐
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之avcodec_parameters_copy调用流程与实战(二十五)
linux·运维·服务器·ffmpeg·音视频·车载音频
guizhoumen1 小时前
net core下WebSocket请求总是断开的解决方案
网络·websocket·网络协议
HKT_China1 小时前
香港电讯河套区创新科技中心暨AI机楼揭幕,以网络基建助力北部都会区发展
网络·ai
云边云科技_云网融合2 小时前
案例分享 | 某运动零售品牌多云治理实战:一套框架解决权限失控、网络混乱与成本黑箱
网络·零售
ITKEY_2 小时前
emacs 文件管理Dired, the Directory Editor
linux·编辑器·emacs
源图客2 小时前
解决CentOS操作系统网络异常问题
linux·运维·centos
Liuqy-052 小时前
IO模型与并发服务器
服务器·网络·select·多线程·epoll·并发服务器·io多路复用
梅孔立3 小时前
Docker 容器网络不通:Tomcat 无法解析 MySQL、Nginx 无法反代 Tomcat 的生产级排查与治理
网络·docker·tomcat
YWamy10 小时前
如何降低RTC SDK在复杂网络环境下的运行成本
网络·音视频·实时音视频