ZNS
block based flash的问题
Flash必须先擦除再写,擦除的最小粒度大于写入的最小粒度 =>异地更新 =>使用FTL负责地址映射,垃圾回收、磨损均衡、坏块管理等 =>不同文件的数据杂糅在一起 =>先移动有效数据到OP,才能擦除数据(垃圾回收)=>OP浪费空间,移动有效数据浪费时间=>换一种思路
ZNS的效果
ZNS-SSD的吞吐和延时不受GC影响,且不需要额外的OP空间。 zenfs是端到端的数据访问,不会再走内核庞大的I/O调度逻辑。
ZNS的细节
将整个SSD内部的存储区域分为多个zone 空间。不同的zone 空间之间的数据可以是独立的。最主要的是,每一个zone 内部的写入 只允许顺序写,可以随机读。为了保证zone 内部的顺序写,在ZNS内部想要覆盖写一段LBA地址的话需要先reset(清理当前地址的数据),才能重新顺序写这一段逻辑地址空间。
不需要垃圾回收,需要上层软件配合,保证一个zone在全部数据失效的时候擦除。
ZNS 的结构:Zone
摘自 /usr/include/linux/blkzoned.h
:
/**
* enum blk_zone_type - Types of zones allowed in a zoned device.
*
* @BLK_ZONE_TYPE_CONVENTIONAL: The zone has no write pointer and can be writen
* randomly. Zone reset has no effect on the zone.
* @BLK_ZONE_TYPE_SEQWRITE_REQ: The zone must be written sequentially
* @BLK_ZONE_TYPE_SEQWRITE_PREF: The zone can be written non-sequentially
*
* Any other value not defined is reserved and must be considered as invalid.
*/
enum blk_zone_type {
BLK_ZONE_TYPE_CONVENTIONAL = 0x1,
BLK_ZONE_TYPE_SEQWRITE_REQ = 0x2,
BLK_ZONE_TYPE_SEQWRITE_PREF = 0x3,
};
摘自 libzbd/zdb.h
:
/**
* @brief Zone types
*
* @ZBD_ZONE_TYPE_CNV: The zone has no write pointer and can be writen
* randomly. Zone reset has no effect on the zone.
* @ZBD_ZONE_TYPE_SWR: The zone must be written sequentially
* @ZBD_ZONE_TYPE_SWP: The zone can be written randomly
*/
enum zbd_zone_type {
ZBD_ZONE_TYPE_CNV = BLK_ZONE_TYPE_CONVENTIONAL,
ZBD_ZONE_TYPE_SWR = BLK_ZONE_TYPE_SEQWRITE_REQ,
ZBD_ZONE_TYPE_SWP = BLK_ZONE_TYPE_SEQWRITE_PREF,
};
Zone 的分类:
- Conventional Zone
- 块内地址能够随机写
- 没有写指针机制(与普通 SSD 一致)
- Reset 对这种 Zone 无效
- Sequentially Write Required Zone
- 不能随机写,必须从当前 Zone 的写指针开始顺序写
- 可以 Reset 来清除指针值
Zenfs
Linux内核对ZNS的支持
ZNS的特性 需要内核支持,所以开发了ZBD(zoned block device) 内核子系统 来提供通用的块层访问接口。除了支持内核通过ZBD 访问ZNS之外,还提供了用户API ioctl进行一些基础数据的访问,包括:当前环境 zone 设备的枚举,展示已有的zone的信息 ,管理某一个具体的zone(比如reset)。
在近期,为了更友好得评估ZNS-ssd的性能,在ZBD 上支持了暴露 per zone capacity 和 active zones limit。
Zenfs代码分析
TODO