SPDK零基础入门
第 0 步先搞懂 SPDK 到底解决什么问题别记名词先问一句盘越来越快可软件跟不上了。老式硬盘慢读一次要几毫秒软件那点开销根本无所谓。但现在的 NVMe SSD 快到微秒级这时候你会发现——瓶颈不在盘而在操作系统内核。用生活比喻你要寄一个快递一次读写 I/O传统方式走内核你 → 排队到邮局柜台 → 填单 → 安检 → 分拣 → 才发出每一步都要等快递本身没多久全耗在流程上SPDK 方式绕过内核你 → 直接把包裹交给门口等着的快递员 → 立刻发出砍掉所有中间流程一句话记住 SPDK让程序在用户态直接、不停地、不加锁地操作硬盘把操作系统内核这个中间商甩掉。第 1 步最小的图 —— 就三样东西任何存储系统剥到最简单都是这三层┌─────────────┐ │ 应用程序 │ 我要读写数据 └──────┬──────┘ │ ┌──────┴──────┐ │ 某种软件 │ 我来帮你把请求变成硬件能懂的命令 └──────┬──────┘ │ ┌──────┴──────┐ │ 真实的盘 │ 数据最终存在我这 └─────────────┘SPDK 就是中间那层软件。记住这个骨架后面所有东西都是往中间这层塞积木。第 2 步SPDK 最核心的一个概念 —— bdev把万物变成一块盘新手最该先懂的就是bdevblock device块设备。问题底下的盘五花八门——本机 NVMe SSD、远程的 Ceph 网络存储、甚至一块内存……它们操作方式完全不同。上层应用不可能每种都单独适配。SPDK 的办法给所有东西套一个统一的壳都长得像一块普通的盘。这个统一的壳就叫 bdev。上层应用只认一块盘只会 读/写/flush │ ┌───────────────┴───────────────┐ │ bdev 统一接口 │ ← 统一的插座 └───────────────┬───────────────┘ │ ┌──────────┬───────┴────┬──────────┐ ▼ ▼ ▼ ▼ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │NVMe盘 │ │Ceph网 │ │一块内存│ │本地文件│ │ │ │络存储 │ │(测试用)│ │ │ └───────┘ └───────┘ └───────┘ └───────┘比喻bdev 就像 USB 接口。不管你插的是 U 盘、移动硬盘还是读卡器电脑看到的都是一个 U 盘接口用一样的方式读写。SPDK 用 bdev 把千奇百怪的存储统一成一块盘。第 3 步bdev 最酷的地方 —— 能像乐高一样叠起来这是 SPDK 的精髓一定要用图讲。因为每个 bdev 长得都一样都是一块盘所以一个 bdev 可以架在另一个 bdev 上面每层加一点功能┌──────────────┐ │ 加密 bdev │ 写进去自动加密读出来自动解密 └──────┬───────┘ │ 它把自己当盘用的其实是下面这块 ↓ ┌──────┴───────┐ │ RAID bdev │ 把好几块盘合并成一块坏一块不丢数据 └──────┬───────┘ │ ┌──────┴───────┐ │ NVMe bdev │ 真正对接硬件的那一块 └──────┬───────┘ │ 真实 NVMe SSD比喻像穿衣服。里面是身体真盘外面套一件保暖衣RAID再套一件防水外套加密。每层管一件事穿脱自由组合。由此引出两个新手必须分清的词叶子 bdev最底下、直接连真硬件的NVMe、Ceph…—— 数据真正落地的地方。中间 bdev架在别的 bdev 上面、加功能的加密、RAID、逻辑卷…—— 只加工不存数据。中间 bdev加工工序 加密、压缩、RAID、逻辑卷 叶子 bdev数据终点 NVMe、Ceph、文件、内存第 4 步上面的应用是谁 —— 协议层现在补最上面。SPDK 通常不是自己用而是做成一台存储服务器通过网络把盘提供给别的机器。用什么语言跟别的机器通信就是协议层远程的服务器/虚拟机 (客户端) │ 通过网络 ▼ ┌─────────────────────────────┐ │ 协议层说什么语言提供盘 │ │ NVMe-oF │ iSCSI │ vhost ... │ └──────────────┬──────────────┘ ▼ bdev那一块盘比喻bdev 是货物协议层是用什么快递公司/什么语言把货物送出去。NVMe-oF、iSCSI 就是不同的快递方式。第 5 步为什么 SPDK 快 —— 底下有个发动机前面讲的是数据怎么流。但还有个问题SPDK 凭什么比内核快因为它底层有一套特殊的运行时当发动机┌──────────────────────────────────────┐ │ SPDK 发动机 (核心运行时) │ │ │ │ 轮询不等中断主动一直问好了吗 │ │ 每个CPU核一个线程各干各的不抢锁 │ │ 大页内存让盘直接搬数据不用拷贝 │ │ vfio把硬件控制权直接交给程序 │ └──────────────────────────────────────┘比喻普通程序像上班打卡要请示内核、排队、被中断打断SPDK 像在自己家里干活工具就在手边想干就干一刻不停。这四招合起来 绕过内核 快。新手只需记住这一层是给整个系统供电的地基不用背细节。最后把积木拼成完整图前面五步你都懂了现在这张完整图你就能自己读懂了远程客户端 (通过网络访问) │ ┌───────────────▼───────────────────────────┐ │ ① 协议层 NVMe-oF / iSCSI / vhost │ 用什么语言提供盘 └───────────────┬───────────────────────────┘ ▼ ┌───────────────────────────────────────────┐ │ ② bdev 层 (统一成一块盘还能叠乐高) │ │ │ │ 加密 → RAID → 逻辑卷 (中间加工) │ │ ↓ │ │ NVMe / Ceph / 文件 (叶子落地) │ └───────────────┬───────────────────────────┘ ▼ ┌───────────────────────────────────────────┐ │ ③ 用户态驱动 (绕过内核直接操作硬件) │ └───────────────┬───────────────────────────┘ ▼ ┌───────────────────────────────────────────┐ │ ④ 真实硬件 NVMe SSD / 内存 / 网络存储 ★盘★ │ └───────────────────────────────────────────┘ ┌───────────────────────────────────────────┐ │ ⑤ 发动机(运行时): 轮询 每核一线程 大页 │ ← 横向给①~④全程供电 │ 零拷贝 vfio 绕过内核 高性能 │ └───────────────────────────────────────────┘