2、NVM硬件特性解析:NAND Flash与3D XPoint原理、读写擦除特性、延迟与带宽模型
好,我们直接进入正题。这一章聊的是NVM的硬件底牌——NAND Flash和3D XPoint。说白了,你如果不懂这两兄弟的脾气,分区设计就是纸上谈兵。我这些年踩过的坑,有一半都跟没摸透硬件特性有关。
2.1 NAND Flash:存储界的“老黄牛”
NAND Flash,大家太熟了。手机、SSD、U盘,哪儿都有它。但它的脾气,你得摸清楚。
2.1.1 原理:浮栅晶体管
NAND Flash的核心是浮栅晶体管。你可以把它想象成一个带“小仓库”的开关。电子被注入这个小仓库(浮栅),就代表存了“0”;电子被赶出去,就代表“1”。
嗯,这里要注意:电子注入和赶出去,都需要高压。这就是为什么NAND Flash需要12V甚至20V的电压来编程和擦除。读取时电压低很多,大概0.4V左右。
我个人习惯把NAND Flash的存储单元比作一个水桶。充电(编程)就是往桶里倒水,放电(擦除)就是把水倒掉。倒水容易,倒干净难——这就是擦除比编程慢的根本原因。
2.1.2 读写擦除特性:三个速度完全不同的操作
NAND Flash最坑爹的地方在于:读、写、擦,三个操作的速度天差地别。我当年第一次做SSD FTL时,就因为这个吃了大亏。
| 操作 | 典型延迟 | 粒度 | 特点 |
|---|---|---|---|
| 读(Page Read) | ~50-100 µs | Page(4KB-16KB) | 最快,但比DRAM慢1000倍 |
| 写(Program) | ~200-500 µs | Page | 比读慢3-5倍,需要高压 |
| 擦除(Erase) | ~2-5 ms | Block(256页-1024页) | 最慢,且只能按块擦除 |
看到了吗?擦除比读慢了整整两个数量级。这就是为什么NAND Flash不能“覆盖写”——你必须先擦除整个块,才能写其中的页。
2.1.3 延迟与带宽模型
我们来算一笔账。假设一个NAND Flash通道,Page大小16KB,读延迟75µs,写延迟300µs。
- 读带宽: 16KB / 75µs ≈ 213 MB/s
- 写带宽: 16KB / 300µs ≈ 53 MB/s
但这是理想情况。实际中还有总线传输时间、ECC校验时间、命令调度开销。我一般会打个7折来估算真实带宽。
为什么会这样?因为NAND Flash的接口是异步的。你发一个读命令,等75µs,数据才从存储阵列搬到页寄存器,然后再花时间从寄存器搬出来。这中间的等待,就是延迟的根源。
2.2 3D XPoint:存储界的“跑车”
3D XPoint,Intel和镁光搞出来的东西。它跟NAND Flash完全不是一个物种。
2.2.1 原理:相变存储
3D XPoint用的是硫系化合物材料。这种材料有两种状态:晶态(低电阻)和非晶态(高电阻)。晶态代表“1”,非晶态代表“0”。
改变状态需要加热。一个短而强的电流脉冲,把材料加热到熔化然后快速冷却,就变成非晶态。一个长而弱的电流脉冲,慢慢加热到结晶温度再冷却,就变回晶态。
你想想看,这跟NAND Flash的浮栅电子注入完全是两码事。3D XPoint没有电子迁移的问题,所以它的寿命比NAND Flash长得多——理论上可以到百万次级别。
2.2.2 读写擦除特性:字节可寻址
3D XPoint最大的优势是:字节可寻址。你不需要像NAND Flash那样按页读写,按块擦除。你可以直接修改一个字节。
| 操作 | 典型延迟 | 粒度 | 特点 |
|---|---|---|---|
| 读 | ~300 ns - 1 µs | 字节/缓存行 | 比NAND Flash快100倍 |
| 写 | ~1-10 µs | 字节/缓存行 | 比NAND Flash快50倍 |
| 擦除 | 不需要显式擦除 | N/A | 直接覆盖写,无擦除开销 |
注意看,3D XPoint没有擦除操作。你直接写新值上去,旧值就被覆盖了。这跟DRAM的行为很像,但它是非易失的——断电数据不丢。
2.2.3 延迟与带宽模型
3D XPoint的带宽模型跟NAND Flash完全不同。因为它字节可寻址,你可以用更小的访问粒度,而且没有擦除开销。
我举个例子。假设一个3D XPoint设备,读延迟500ns,写延迟5µs,总线带宽6.4 GB/s(DDR3-1600的典型值)。
- 小粒度随机读(64字节): 64B / 500ns ≈ 128 MB/s。受限于延迟。
- 大粒度顺序读(256字节): 256B / 500ns ≈ 512 MB/s。带宽开始显现。
- 写操作: 64B / 5µs ≈ 12.8 MB/s。写延迟是瓶颈。
你看,3D XPoint在小粒度随机访问上优势巨大,但写延迟仍然比读慢一个数量级。我在项目中用3D XPoint做写缓存时,就特别注意这一点——写操作需要合并成大粒度再提交。
2.3 NAND Flash vs 3D XPoint:一张图看懂
下面这张SVG图,是我自己总结的对比框架。它把两个技术的核心差异画得清清楚楚。
2.4 实战中的延迟与带宽模型
理论说完了,我们来点实际的。我在做存储系统性能建模时,会用下面这个公式估算有效带宽:
有效带宽 = 传输大小 / (延迟 + 传输大小 / 总线带宽)
举例:
NAND Flash 读 4KB:
有效带宽 = 4KB / (75µs + 4KB / 400MB/s)
= 4KB / (75µs + 10µs)
≈ 47 MB/s
3D XPoint 读 64B:
有效带宽 = 64B / (500ns + 64B / 6.4GB/s)
= 64B / (500ns + 10ns)
≈ 125 MB/s
你看,小粒度访问时,延迟是瓶颈。大粒度访问时,总线带宽才是瓶颈。这就是为什么我建议:小粒度访问用3D XPoint,大粒度访问用NAND Flash。
2.5 总结
NAND Flash和3D XPoint,一个像卡车,一个像跑车。卡车能拉很多货(容量大、成本低),但跑得慢(延迟高、有擦除开销)。跑车跑得快(延迟低、字节可寻址),但拉不了多少货(容量小、成本高)。
做存储分区设计,你得清楚每个硬件的脾气。NAND Flash适合大块顺序读写,3D XPoint适合小块随机访问。把数据放到对的地方,性能才能发挥出来。
嗯,这一章就到这里。下一章我们聊分区策略——怎么把数据安排得明明白白。