# ReStor-AD **Repository Path**: anolis/restor-ad ## Basic Information - **Project Name**: ReStor-AD - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-10 - **Last Updated**: 2026-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ReStor-AD ## 介绍 ReStor-AD 是一个研究性项目,旨在用 FPGA 硬件加速的方式实现解耦式 NVMe 存储(Disaggregated NVMe Storage)。其核心思想是:通过 FPGA 硬件卸载 NVMe 协议的处理逻辑,绕过传统软件协议栈(如 NVMe-oF over TCP/RDMA),从而实现更低延迟、更高吞吐的远程存储访问。 该项目基于开源 NVMe 控制器 [NVMeCHA](https://github.com/yhqiu16/NVMeCHA) 及 [verilog-ethernet](https://github.com/alexforencich/verilog-ethernet) 10G 以太网协议栈构建,在益思芯 FPGA 平台上实现了完整的硬件加速远程 NVMe 存储数据通路。 本项目是项目**适配国产异构软硬件平台的云原生生态**子课题二**计算优化与新硬件赋能**的成果之一。 ## 系统架构 ``` ┌─────────────────────┐ 10G Ethernet (UDP) ┌─────────────────────┐ │ Host (CPU) │ │ NVMe SSD │ │ │ │ │ │ NVMe Driver │ ┌──────────────┐ │ │ │ ↓ │ │ Network │ │ │ │ FPGA Initiator │◄──►│ (QSFP+) │◄────►│ FPGA Target │ │ (NVMe Controller │ └──────────────┘ │ (NVMe Controller │ │ + Network TX/RX) │ │ + Local SSD I/O) │ └─────────────────────┘ └─────────────────────┘ ``` **数据流:** 1. 主机通过标准 NVMe 驱动发送 I/O 命令至 Initiator FPGA 2. Initiator 根据命名空间 ID(NSID)判断访问目标:NSID=1 为本地,NSID=2 为远程 3. 远程命令的 SQE(Submission Queue Entry, 512-bit)通过 UDP/10G Ethernet 硬件协议栈发送至 Target 4. Target FPGA 解析 SQE,通过 PCIe/XDMA 访问本地 NVMe SSD 执行读写操作 5. Target 将 CQE(Completion Queue Entry, 128-bit)通过网络返回 Initiator 6. 整个远程存储访问路径完全在 FPGA 硬件中完成,无需 CPU 软件协议栈参与 ## 项目结构 ``` ReStor-AD/ ├── ReStor_Hardware/ # FPGA 硬件设计 │ ├── build_restor.tcl # Vivado 工程重建脚本 │ ├── download_restor_target.tcl # Target bitstream 下载脚本 │ ├── download_restor_initiator.tcl # Initiator bitstream 下载脚本 │ ├── restor_target_test.bit/.elf # Target 预编译固件 │ ├── restor_initiator_test.bit/.elf# Initiator 预编译固件 │ └── ReStor_AD/ # Vivado 工程目录 │ ├── ReStor_AD.xpr # Vivado 工程文件 │ ├── ReStor_AD.srcs/sources_1/ # RTL 源码 │ │ ├── imports/NVMeCHA/ # NVMeCHA NVMe 控制器 & 网络协议栈 │ │ └── new/ # ReStor-AD 新增模块 │ └── ReStor_AD.gen/ # Vivado 生成的 IP 核 ├── Micro_Bench/ # 微基准测试 │ ├── fio_test.py # FIO 自动化性能测试脚本 │ ├── fio-fio-3.31.zip # FIO 3.31 源码 │ ├── nvme_over_tcp_config.sh # NVMe-over-TCP 对比配置 │ ├── nvme_over_rdma_config.sh # NVMe-over-RDMA 对比配置 │ └── i10_config.sh # i10 协议对比配置 └── Realistic_Workloads/ # 真实负载测试 ├── rocksdb.zip # RocksDB KV 存储引擎 └── YCSB-cpp.zip # YCSB C++ 基准测试 ``` ## 硬件设计说明 ### 开发环境 - **EDA 工具**:Xilinx Vivado 2021.1 - **目标芯片**:Xilinx ZU19EG(Zynq UltraScale+ MPSoC) - **PCIe 配置**:Gen3 x8, 256-bit 数据宽度 - **网络接口**:QSFP+ 10G Ethernet ### 主要硬件模块 | 模块 | 说明 | | ---------------------------- | ---------------------------------------- | | `nvme_top` | NVMe 控制器顶层,集成 XDMA、Admin/IO 控制器、网络模块 | | `nvme_io_ctl_top_new` | I/O 命令控制器顶层,处理读写命令的 DMA 传输 | | `nvme_sq_parallel_fetch` | 多 SQ 并行命令获取,支持 8 个 I/O 队列同时工作 | | `nvme_admin_controller` | Admin 命令控制器(PL+PS 混合实现) | | `nvme_user_id_analysis` | 用户/命名空间 ID 分析,区分本地与远程命令 | | `io_controller_xdma_arbiter` | XDMA 接口仲裁,管理多 I/O 控制器的 DMA 通道访问 | | `qsfp_network` | QSFP 网络顶层,集成 10G Ethernet PHY/MAC | | `fpga_core0_1` | 网络核心逻辑,实现 SQE/CQE 的 UDP 收发 | | `prp_manager` | PRP(Physical Region Page)管理,处理 NVMe 地址翻译 | ### 关键设计参数 - 最大 I/O 队列数:16(`MAX_QID`) - 每队列最大条目数:1024(`MAX_QSIZE`) - 并行 I/O Handler 数:8 - DMA 传输粒度:4096 字节 - 最大数据传输大小:4KB × 2^15 = 128MB(`NS_MDTS`) ## 安装教程 ### 1. 重建 Vivado 工程 ```bash # 在 Vivado Tcl Shell 中执行 cd ReStor_Hardware source build_restor.tcl ``` 该脚本将重建完整的 Vivado 工程。如需修改设计,可在此基础上进行综合与实现。 ### 2. 下载预编译固件至 FPGA **Target 端(连接本地 NVMe SSD 的一侧):** ```bash # 在 Vivado Hardware Manager 或 XSCT 中执行 cd ReStor_Hardware source download_restor_target.tcl ``` **Initiator 端(连接主机的一侧):** ```bash # 在 Vivado Hardware Manager 或 XSCT 中执行 cd ReStor_Hardware source download_restor_initiator.tcl ``` 下载脚本会自动完成:FPGA 配置(.bit)→ MicroBlaze 复位 → 固件下载(.elf)→ 启动运行。 ### 3. 部署基准测试工具 **FIO 微基准测试:** ```bash cd Micro_Bench unzip fio-fio-3.31.zip cd fio-fio-3.31 ./configure && make && sudo make install ``` **真实负载测试:** ```bash cd Realistic_Workloads unzip rocksdb.zip unzip YCSB-cpp.zip # 分别按照 RocksDB 和 YCSB-cpp 的文档进行编译 ``` ## 使用说明 ### 运行 FIO 性能测试 ```bash cd Micro_Bench python3 fio_test.py ``` 测试脚本会自动遍历不同的 block size(4K~256K)组合,对 `/dev/nvme1n1` 设备执行随机混合读写测试,结果以 CSV 格式输出,包含 IOPS、带宽、平均延迟和 CPU 利用率。 如需修改测试参数,编辑 `fio_test.py` 中的以下变量: ```python filename = '/dev/nvme1n1' # 目标 NVMe 设备 rw = ['read', 'write', ...] # 读写模式 bs = ['4K', '8K', ...] # Block size iodepth = [1, 4, 8, ...] # I/O 队列深度 numjobs = [1, 2, 3, ...] # 并发任务数 ``` ### 配置软件对比方案 项目提供了三种软件远程存储方案的配置脚本,用于与 ReStor-AD 硬件方案进行性能对比: **NVMe-over-TCP:** ```bash sudo bash Micro_Bench/nvme_over_tcp_config.sh ``` **NVMe-over-RDMA:** ```bash sudo bash Micro_Bench/nvme_over_rdma_config.sh ``` **i10 协议:** ```bash sudo bash Micro_Bench/i10_config.sh ``` > 注意:使用前需根据实际网络环境修改脚本中的 IP 地址(默认 `10.42.0.1`)和 NVMe 设备路径(默认 `/dev/nvme0n1`)。 ## 参与贡献 1. Fork 本仓库 2. 新建分支 (`git checkout -b feature/your-feature`) 3. 提交更改 (`git commit -m 'Add your feature'`) 4. 推送到分支 (`git push origin feature/your-feature`) 5. 新建 Pull Request ## 致谢 - [NVMeCHA](https://github.com/yhqiu16/NVMeCHA) — 复旦大学 ASIC 与系统国家重点实验室 - [verilog-ethernet](https://github.com/alexforencich/verilog-ethernet) — Alex Forencich - [FIO](https://github.com/axboe/fio) — Flexible I/O Tester - [RocksDB](https://github.com/facebook/rocksdb) — Facebook - [YCSB-cpp](https://github.com/ls4154/YCSB-cpp) — Yahoo! Cloud Serving Benchmark C++ 实现