SeaStore 物理盘接口与底层库
1. 概述
SeaStore 支持多种物理存储设备类型,通过统一的设备抽象接口访问底层存储。所有设备操作最终都基于 Seastar 框架 的异步 I/O 接口实现。
2. 支持的设备类型
2.1 设备类型枚举
位置: seastore_types.h:957
1 | enum class device_type_t : uint8_t { |
2.2 后端类型分类
设备类型按后端实现分为两类:
1 | enum class backend_type_t : uint8_t { |
映射关系:
SEGMENTED: HDD, SSD, ZBD, EPHEMERAL_MAIN, EPHEMERAL_COLDRANDOM_BLOCK: RANDOM_BLOCK_SSD, RANDOM_BLOCK_EPHEMERAL
3. 设备实现与底层库
3.1 段式设备 (SEGMENTED)
3.1.1 BlockSegmentManager (SSD/HDD)
位置: segment_manager/block.h, segment_manager/block.cc
底层库: Seastar DMA 接口
实现方式:
- 使用
seastar::file::dma_read()和dma_write()进行 I/O - 通过
seastar::open_file_dma()打开设备文件 - 支持批量 I/O (
writev/readv)
关键代码:
1 | // 打开设备 |
系统调用:
- Seastar 的 DMA 接口最终调用 Linux AIO (
io_submit/io_getevents) 或io_uring
3.1.2 ZBDSegmentManager (ZBD)
位置: segment_manager/zbd.h, segment_manager/zbd.cc
底层库:
- Seastar DMA 接口 (基础 I/O)
- Linux ZBD 接口 (
linux/blkzoned.h)
实现方式:
- 使用 Seastar DMA 进行数据读写
- 使用 Linux
ioctl进行 Zone 管理操作
Zone 操作:
1 |
|
支持的设备:
- ZNS SSD (NVMe Zoned Namespaces)
- SMR HDD (Shingled Magnetic Recording)
3.1.3 EphemeralSegmentManager (临时设备)
位置: segment_manager/ephemeral.h, segment_manager/ephemeral.cc
底层库: 内存映射 (用于测试)
实现方式:
- 使用内存作为存储介质
- 不涉及实际物理设备
3.2 随机块设备 (RANDOM_BLOCK)
3.2.1 NVMeBlockDevice (RANDOM_BLOCK_SSD)
位置: random_block_manager/nvme_block_device.h, nvme_block_device.cc
底层库:
- Seastar DMA 接口 (基础 I/O)
- Linux NVMe ioctl (
linux/nvme_ioctl.h)
实现方式:
- 使用 Seastar DMA 进行常规读写
- 使用 Linux NVMe ioctl 进行设备特性查询和管理
NVMe 特性支持:
- Identify 命令:
1 | // 识别控制器 |
- 多流写入 (Multi-Stream):
1 | // 支持多流写入,通过 stream 参数区分数据生命周期 |
- 端到端数据保护 (E2E Data Protection):
1 | // 检查是否支持端到端数据保护 |
- NVMe Passthrough:
1 | // 传递 IO 命令 |
关键代码:
1 | // 打开设备 |
3.2.2 EphemeralRBMDevice (临时随机块设备)
位置: random_block_manager/rbm_device.h
底层库: 内存映射 (用于测试)
实现方式:
- 使用
mmap分配内存 - 模拟随机块设备行为
4. 底层库详解
4.1 Seastar 框架
核心库: Seastar (https://github.com/scylladb/seastar)
主要接口:
- 文件操作:
1 | // 打开文件(DMA 模式) |
- DMA I/O:
1 | // DMA 写入 |
- ioctl 支持:
1 | // 执行 ioctl |
Seastar 底层实现:
Linux AIO:
- 使用
io_submit()提交异步 I/O - 使用
io_getevents()获取完成事件 - 通过 epoll 监听完成事件
- 使用
io_uring (如果支持):
- 使用更高效的 io_uring 接口
- 减少系统调用开销
- 支持批量提交和完成
直接 I/O:
- 绕过页缓存
- 直接访问存储设备
- 需要 O_DIRECT 标志
4.2 Linux 内核接口
4.2.1 ZBD 接口
头文件: <linux/blkzoned.h>
ioctl 命令:
BLKGETNRZONES: 获取 Zone 数量BLKOPENZONE: 打开 ZoneBLKCLOSEZONE: 关闭 ZoneBLKFINISHZONE: 完成 ZoneBLKRESETZONE: 重置 ZoneBLKGETZONESZ: 获取 Zone 大小BLKGETZONEINFO: 获取 Zone 信息
数据结构:
1 | struct blk_zone { |
4.2.2 NVMe 接口
头文件: <linux/nvme_ioctl.h>
ioctl 命令:
NVME_IOCTL_ID: 识别设备NVME_IOCTL_ADMIN_CMD: 执行管理命令NVME_IOCTL_IO_CMD: 执行 I/O 命令NVME_IOCTL_SUBMIT_IO: 提交 I/O(已废弃)
关键数据结构:
1 | struct nvme_passthru_cmd { |
5. 设备选择与配置
5.1 配置参数
主设备类型:
1 | seastore_main_device_type = "SSD" | "RANDOM_BLOCK_SSD" |
设备路径:
1 | seastore_device_path = "/dev/nvme0n1" // NVMe 设备 |
5.2 设备创建流程
1 | Device::make_device(device_path, device_type) |
6. 性能特性
6.1 Seastar DMA 优势
零拷贝:
- 数据直接从用户缓冲区传输到设备
- 减少内核拷贝开销
异步 I/O:
- 所有操作都是异步的
- 不阻塞线程
- 充分利用 CPU
批量操作:
- 支持向量 I/O
- 减少系统调用次数
事件驱动:
- 基于 epoll/io_uring
- 高效的事件处理
6.2 设备特定优化
6.2.1 ZBD 优化
- 顺序写入: 利用 Zone 的顺序写入特性
- Zone 管理: 批量重置 Zone,提高效率
- 写指针跟踪: 自动管理写指针,避免覆盖
6.2.2 NVMe 优化
- 多流写入: 根据数据生命周期选择流
- 端到端保护: 利用硬件校验,减少软件开销
- 原子写入: 利用 NVMe 原子写入单元
- 写粒度对齐: 根据设备特性对齐写入
7. 与 SPDK 的关系
7.1 SeaStore 不使用 SPDK
重要说明: SeaStore 不直接使用 SPDK。它通过以下方式访问存储:
- Seastar DMA 接口: 主要 I/O 路径
- Linux 内核接口: ioctl 用于设备管理
- POSIX API: 文件操作
7.2 SPDK 在 Ceph 中的使用
SPDK 主要用于 AlienStore (BlueStore 的适配层):
1 | Crimson OSD |
7.3 为什么 SeaStore 不使用 SPDK?
Seastar 已提供高性能 I/O:
- Seastar 的 DMA 接口已经足够高效
- 支持 io_uring,性能接近 SPDK
简化架构:
- 减少依赖
- 降低复杂度
异步模型匹配:
- Seastar 的异步模型与 SeaStore 完美匹配
- 无需额外的适配层
8. 总结
8.1 支持的接口
| 设备类型 | 底层库 | 主要接口 | 特殊功能 |
|---|---|---|---|
| SSD/HDD | Seastar DMA | dma_read/dma_write |
批量 I/O |
| ZBD | Seastar DMA + Linux ZBD | dma_read/dma_write + ioctl |
Zone 管理 |
| RANDOM_BLOCK_SSD | Seastar DMA + Linux NVMe | dma_read/dma_write + ioctl |
多流、E2E 保护 |
8.2 核心库
Seastar:
- 异步 I/O 框架
- DMA 接口
- 事件驱动模型
Linux 内核接口:
- ZBD:
linux/blkzoned.h - NVMe:
linux/nvme_ioctl.h
- ZBD:
系统调用:
- AIO:
io_submit/io_getevents - io_uring: (如果支持)
- ioctl: 设备管理
- AIO:
8.3 设计特点
- 统一抽象: 通过 Device 接口统一不同设备类型
- 高性能: 基于 Seastar 的异步 I/O 和零拷贝
- 设备优化: 针对不同设备类型提供特定优化
- 简化架构: 不依赖 SPDK,减少复杂度
通过这种设计,SeaStore 能够高效地访问各种类型的存储设备,同时保持代码的清晰和可维护性。
正在加载留言…