RDMA 编程完整学习路线图
📚 学习路径概览
┌─────────────────────────────────────────────────────────────────┐
│ 第0阶段:基础准备 (1-2周) │
│ 网络编程基础 → Linux 系统编程 → C/C++ 熟练 → 内核基础概念 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 第1阶段:RDMA 理论基础 (2-3周) │
│ RDMA 概念 → IB/RoCE 架构 → Verbs API → QP 状态机 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 第2阶段:用户态编程入门 (3-4周) │
│ 环境搭建 → 基础示例 → RC/UD/UC → RDMA CM → 实战项目 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 第3阶段:用户态编程进阶 (4-6周) │
│ 性能优化 → 多线程 → 内存管理 → 异常处理 → 生产级应用 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 第4阶段:内核态编程 (6-8周) │
│ 内核模块 → 驱动开发 → InfiniBand 子系统 → ULP 开发 │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 第5阶段:高级主题 (持续学习) │
│ 硬件卸载 → GPUDirect → 存储加速 → 网络虚拟化 │
└─────────────────────────────────────────────────────────────────┘
🎯 第0阶段:基础准备 (1-2周)
必备技能清单
- C/C++ 编程 (必须精通)
- ✅ 指针、内存管理、结构体
- ✅ 多线程编程 (pthread)
- ✅ 网络编程 (socket API)
- ✅ 系统调用
学习资源: - 书籍:《C 程序设计语言》(K&R)
- 书籍:《Unix 网络编程》(卷1)
- Linux 系统编程
- ✅ 进程/线程管理
- ✅ 内存映射 (mmap)
- ✅ I/O 多路复用 (epoll)
- ✅ 信号处理
实践练习:
// 练习1:实现一个简单的 TCP echo 服务器
// 练习2:使用 epoll 实现并发服务器
// 练习3:共享内存通信示例
- 网络基础知识
- ✅ TCP/IP 协议栈
- ✅ 以太网原理
- ✅ 网络性能指标 (带宽、延迟、吞吐量)
- ✅ DMA (Direct Memory Access) 概念
- Linux 内核基础 (可选,但建议)
- ✅ 内核模块编程入门
- ✅ 字符设备驱动
- ✅ 内核内存管理
学习资源: - 书籍:《Linux 设备驱动程序》(第3版)
- 在线:Linux Kernel Documentation
📖 第1阶段:RDMA 理论基础 (2-3周)
学习目标
理解 RDMA 核心概念、架构和工作原理
1.1 RDMA 基础概念 (3-4天)
核心知识点:
- RDMA 是什么?与传统网络的区别
- 零拷贝、内核旁路、硬件卸载
- RDMA 的三种实现:InfiniBand、RoCE、iWARP
- RDMA 的应用场景
学习方法:
1.阅读:RDMA Aware Programming User Manual
2.观看:YouTube 搜索 "RDMA Introduction" 视频
3.阅读博客:RDMA Mojo (rdmamojo.com)
作业: - 画出传统 TCP/IP vs RDMA 的数据流程对比图
- 总结 InfiniBand、RoCE、iWARP 的区别
1.2 InfiniBand 架构 (3-4天)
核心知识点: - IB 架构层次:物理层、链路层、网络层、传输层
- HCA (Host Channel Adapter)
- Subnet Manager (SM)
- LID (Local Identifier) vs GID (Global Identifier)
推荐阅读: - InfiniBand Architecture Specification (官方文档)
- 重点章节:第9章 (Verbs)、第10章 (Transport Services)
1.3 RoCE 原理 (2-3天)
核心知识点: - RoCE v1 vs RoCE v2
- UDP 封装
- PFC (Priority Flow Control)
- ECN (Explicit Congestion Notification)
实验:
检查 RoCE 配置
rdma link show
ibv_devinfo
配置 RoCE
sudo mlxconfig -d mlx5_0 set LINK_TYPE_P1=2
1.4 Verbs API 核心概念 (4-5天)
必须理解的对象:
对象作用关键 APIContextIB 设备句柄ibv_open_device()PDProtection Domainibv_alloc_pd()MRMemory Regionibv_reg_mr()CQCompletion Queueibv_create_cq()QPQueue Pairibv_create_qp()AHAddress Handleibv_create_ah()
QP 状态机 (必须熟记):
RESET → INIT → RTR → RTS → SQD → SQE → ERR
作业:
- 手绘 RDMA Verbs 对象关系图
- 写出 QP 从 RESET 到 RTS 的完整代码
💻 第2阶段:用户态编程入门 (3-4周)
2.1 环境搭建 (1-2天)
硬件选择
1.生产环境:
- Mellanox ConnectX-5/6 网卡
- 至少2台物理机器
2.学习环境 (预算有限): - 软件模拟:SoftRoCE (Linux 内核模块)
- 云服务器:阿里云、AWS 提供 RDMA 实例
软件安装
Ubuntu/Debian
sudo apt-get install libibverbs-dev librdmacm-dev
rdma-core perftest infiniband-diags
CentOS/RHEL
sudo yum install rdma-core-devel perftest
加载 SoftRoCE (学习用)
sudo modprobe rdma_rxe
sudo rdma link add rxe0 type rxe netdev eth0
验证环境
1. 检查 RDMA 设备
ibv_devices
2. 查看设备详细信息
ibv_devinfo
3. 测试基本连通性
服务端
ib_write_bw -d mlx5_0
客户端
ib_write_bw -d mlx5_0 <server_ip>
2.2 第一个 RDMA 程序 (2-3天)
学习路径:
1.运行并理解 ibv_rc_pingpong 源码
2.修改参数,观察行为变化
3.自己从零实现一个简化版
核心代码框架:
// 1. 打开设备
struct ibv_device **dev_list = ibv_get_device_list(NULL);
struct ibv_context *ctx = ibv_open_device(dev_list[0]);
// 2. 分配 PD
struct ibv_pd *pd = ibv_alloc_pd(ctx);
// 3. 注册内存
char *buf = malloc(4096);
struct ibv_mr *mr = ibv_reg_mr(pd, buf, 4096,
IBV_ACCESS_LOCAL_WRITE);
// 4. 创建 CQ
struct ibv_cq *cq = ibv_create_cq(ctx, 10, NULL, NULL, 0);
// 5. 创建 QP
struct ibv_qp_init_attr attr = {
.send_cq = cq,
.recv_cq = cq,
.cap = {
.max_send_wr = 10,
.max_recv_wr = 10,
.max_send_sge = 1,
.max_recv_sge = 1,
},
.qp_type = IBV_QPT_RC,
};
struct ibv_qp *qp = ibv_create_qp(pd, &attr);
// 6. 修改 QP 状态 RESET -> INIT -> RTR -> RTS
// 7. 投递接收请求
// 8. 发送数据
// 9. 轮询 CQ
// 10. 清理资源
作业:
- 实现一个 "Hello World" RDMA 程序
- 支持发送/接收单个消息
2.3 传输类型深入 (5-7天)
RC (Reliable Connected) - 3天 - 实现双向可靠通信
- 理解 PSN (Packet Sequence Number)
- 练习 RDMA Write/Read
实验:
// RDMA Write 示例
struct ibv_send_wr wr = {
.opcode = IBV_WR_RDMA_WRITE,
.wr.rdma.remote_addr = remote_addr,
.wr.rdma.rkey = remote_rkey,
// ...
};
ibv_post_send(qp, &wr, &bad_wr);
UD (Unreliable Datagram) - 2天
- 理解 UD 的无连接特性
- 掌握 Address Handle 的使用
- 处理 GRH (Global Routing Header)
作业: - 实现一对多的 UD 广播程序
UC (Unreliable Connected) - 1天 - 了解 UC 的应用场景
- 对比 RC/UC/UD 的性能差异
2.4 RDMA CM (Connection Manager) (3-4天)
为什么需要 RDMA CM: - 简化地址解析
- 标准化连接建立流程
- 跨网络支持 (IB/RoCE/iWARP)
核心 API:
// 服务端
rdma_create_event_channel()
rdma_create_id()
rdma_bind_addr()
rdma_listen()
rdma_get_cm_event() // CONNECT_REQUEST
rdma_accept()
// 客户端
rdma_resolve_addr()
rdma_resolve_route()
rdma_connect()
作业:
- 将之前的 RC 程序改用 RDMA CM 实现
- 支持动态 IP 地址解析
2.5 实战项目1:Key-Value 存储 (5-7天)
项目目标:实现一个简单的分布式 KV 存储,使用 RDMA 进行数据传输
功能需求: - 支持 PUT/GET/DELETE 操作
- 使用 RDMA Write 进行数据写入
- 使用 RDMA Read 进行数据读取
- 客户端-服务器架构
技术要点: - 内存注册策略
- 并发控制
- 错误处理
参考实现:
// 伪代码
struct kv_request {
uint8_t op; // PUT/GET/DELETE
char key[256];
uint64_t value_addr; // RDMA 地址
uint32_t value_len;
};
// 服务端处理
void handle_request(struct kv_request *req) {
if (req->op == OP_PUT) {
// 使用 RDMA Read 读取客户端数据
rdma_read(req->value_addr, local_buf, req->value_len);
store_kv(req->key, local_buf);
}
}
🚀 第3阶段:用户态编程进阶 (4-6周)
3.1 性能优化 (7-10天)
零拷贝技术
- Direct Data Placement (DDP)
- Inline 数据发送
- Memory Registration Cache
实验:
// Inline 发送 (小消息优化)
wr.send_flags = IBV_SEND_INLINE;
// 注册内存缓存
struct mr_cache {
void *addr;
size_t len;
struct ibv_mr *mr;
};
批量操作
- Doorbell 合并
- 批量投递 WR
- 批量轮询 CQ
性能对比实验:
// 单次投递 vs 批量投递
for (int i = 0; i < 1000; i++) {
ibv_post_send(); // 慢
}
// vs
for (int i = 0; i < 1000; i++) {
wr[i].next = &wr[i+1];
}
ibv_post_send(qp, wr, &bad_wr); // 快
Completion Event vs Polling
- Event-driven 模式
- Busy polling 模式
- Hybrid 模式
作业: - 测试不同消息大小的延迟和吞吐量
- 绘制性能曲线图
3.2 多线程编程 (5-7天)
并发模型
1.Thread-per-QP 模型
2.QP Pool 模型
3.Shared CQ 模型
线程安全问题: - QP 操作不是线程安全的
- CQ 轮询需要加锁或分离
- Memory Registration 的并发控制
实现示例:
// 多线程服务器框架
struct worker_thread {
pthread_t tid;
struct ibv_qp *qp;
struct ibv_cq *cq;
};
void* worker_func(void *arg) {
struct worker_thread *worker = arg;
while (running) {
ibv_poll_cq(worker->cq, ...);
process_completion(...);
}
}
3.3 内存管理进阶 (4-5天)
Memory Registration 策略
1.On-demand Registration: 按需注册
2.Pre-registration: 预注册池
3.ODP (On-Demand Paging): 硬件支持
实现 MR Cache:
struct mr_cache_entry {
void *addr;
size_t len;
struct ibv_mr *mr;
time_t last_used;
struct mr_cache_entry *next;
};
struct ibv_mr* get_cached_mr(void *addr, size_t len) {
// 查找缓存
// 如果不存在,注册新的
// LRU 淘汰策略
}
Huge Pages
配置 Huge Pages
echo 1024 > /proc/sys/vm/nr_hugepages
代码中使用
void *buf = mmap(NULL, size, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
3.4 异常处理和调试 (3-4天)
常见错误处理
-
QP 进入 ERROR 状态
-
CQ Overflow
-
RNR (Receiver Not Ready)
-
超时重传
错误恢复策略:
void handle_qp_error(struct ibv_qp *qp) {
// 1. 查询 QP 状态
struct ibv_qp_attr attr;
ibv_query_qp(qp, &attr, IBV_QP_STATE, NULL);
if (attr.qp_state == IBV_QPS_ERR) {
// 2. 销毁并重建 QP
ibv_destroy_qp(qp);
qp = create_new_qp();
// 3. 重新建立连接 reconnect();}
}
调试工具
查看 RDMA 统计信息
rdma statistic show
查看 QP 状态
rdma resource show qp
抓包分析
tcpdump -i ib0 -w rdma.pcap
3.5 实战项目2:RDMA 文件传输 (7-10天)
项目目标:实现高性能文件传输工具,类似 scp,但使用 RDMA
功能需求:
- 支持大文件传输 (GB 级别)
- 断点续传
- 多线程并行传输
- 进度显示
技术要点: - 文件分块
- 流水线传输
- RDMA Write with Immediate
性能目标: - 小文件 (<1MB): 延迟 < 10μs
- 大文件 (>1GB): 吞吐量 > 90Gbps
🔧 第4阶段:内核态编程 (6-8周)
4.1 Linux 内核模块基础 (5-7天)
内核模块框架
#include <linux/module.h>
#include <linux/kernel.h>
static int __init my_module_init(void) {
printk(KERN_INFO "RDMA module loaded\n");
return 0;
}
static void __exit my_module_exit(void) {
printk(KERN_INFO "RDMA module unloaded\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("RDMA Learning Module");
编译和加载
obj-m += rdma_module.o
all:
make -C /lib/modules/(shelluname−r)/buildM=(shell uname -r)/build M=(shelluname−r)/buildM=(PWD) modules
clean:
make -C /lib/modules/(shelluname−r)/buildM=(shell uname -r)/build M=(shelluname−r)/buildM=(PWD) clean
make
sudo insmod rdma_module.ko
dmesg | tail
sudo rmmod rdma_module
作业:
- 实现一个打印 "Hello RDMA" 的内核模块
- 添加模块参数支持
4.2 InfiniBand 子系统架构 (7-10天)
核心组件
┌─────────────────────────────────────────┐
│ User Space Applications │
└───────────────┬─────────────────────────┘
│ Verbs API (libibverbs)
┌───────────────▼─────────────────────────┐
│ IB Core (ib_core.ko) │
│ - Device Management │
│ - CM (Connection Manager) │
│ - SA (Subnet Administration) │
└───────────────┬─────────────────────────┘
│
┌───────────────▼─────────────────────────┐
│ ULP (Upper Layer Protocols) │
│ - IPoIB - SRP - iSER - NVMe-oF │
└───────────────┬─────────────────────────┘
│
┌───────────────▼─────────────────────────┐
│ HCA Driver (mlx5_ib, qedr, ...) │
└───────────────┬─────────────────────────┘
│
┌───────────────▼─────────────────────────┐
│ Hardware (HCA) │
└─────────────────────────────────────────┘
关键数据结构
// IB 设备
struct ib_device {
struct device *dev;
char name[IB_DEVICE_NAME_MAX];
struct list_head port_list;
// 操作函数集
int (*query_device)(struct ib_device *device, ...);
int (*create_cq)(struct ib_cq *cq, ...);
int (*create_qp)(struct ib_qp *qp, ...);
// ...
};
// QP
struct ib_qp {
struct ib_device *device;
struct ib_pd *pd;
struct ib_cq *send_cq;
struct ib_cq *recv_cq;
enum ib_qp_type qp_type;
u32 qp_num;
};
学习方法:
1.阅读内核源码:drivers/infiniband/core/
2.重点文件:
- device.c: 设备注册
- verbs.c: Verbs 实现
- cq.c: CQ 管理
- qp.c: QP 管理
4.3 编写简单的 ULP (10-14天)
项目目标:实现一个简单的 ULP (Upper Layer Protocol)
示例:简单的字符设备 ULP
#include <linux/module.h>
#include <linux/fs.h>
#include <rdma/ib_verbs.h>
static struct ib_device *rdma_dev;
static struct ib_pd *pd;
static struct ib_cq *cq;
static struct ib_qp *qp;
// 字符设备操作
static ssize_t rdma_dev_write(struct file *file,
const char __user *buf,
size_t count, loff_t *ppos) {
// 将用户数据通过 RDMA 发送
struct ib_send_wr wr, *bad_wr;
struct ib_sge sge;
// 准备发送请求
memset(&sge, 0, sizeof(sge));
sge.addr = (u64)kernel_buf;
sge.length = count;
sge.lkey = mr->lkey;
memset(&wr, 0, sizeof(wr));
wr.wr_id = 1;
wr.sg_list = &sge;
wr.num_sge = 1;
wr.opcode = IB_WR_SEND;
return ib_post_send(qp, &wr, &bad_wr);
}
static const struct file_operations rdma_fops = {
.owner = THIS_MODULE,
.write = rdma_dev_write,
.read = rdma_dev_read,
};
static int __init rdma_ulp_init(void) {
// 1. 查找 RDMA 设备
rdma_dev = ib_device_get_by_name("mlx5_0");
// 2. 分配 PD
pd = ib_alloc_pd(rdma_dev, 0);
// 3. 创建 CQ
struct ib_cq_init_attr cq_attr = { .cqe = 16 };
cq = ib_create_cq(rdma_dev, NULL, NULL, NULL, &cq_attr);
// 4. 创建 QP
struct ib_qp_init_attr qp_attr = {
.send_cq = cq,
.recv_cq = cq,
.cap.max_send_wr = 16,
.cap.max_recv_wr = 16,
.qp_type = IB_QPT_RC,
};
qp = ib_create_qp(pd, &qp_attr);
// 5. 注册字符设备
major = register_chrdev(0, "rdma_ulp", &rdma_fops);
return 0;
}
module_init(rdma_ulp_init);
module_exit(rdma_ulp_exit);
学习资源:
-
参考现有 ULP:IPoIB (drivers/infiniband/ulp/ipoib/)
-
参考 SRP (drivers/infiniband/ulp/srp/)
4.4 HCA 驱动开发基础 (可选,14-21天)
注意: 这是最复杂的部分,通常只有硬件厂商工程师需要
驱动框架
// 驱动初始化
static int mlx_probe(struct pci_dev *pdev,
const struct pci_device_id *id) {
struct ib_device *ibdev;
// 1. 初始化 PCI 设备
pci_enable_device(pdev);
pci_request_regions(pdev, DRV_NAME);
// 2. 映射硬件寄存器
dev->bar = pci_iomap(pdev, 0, 0);
// 3. 注册 IB 设备
ibdev = ib_alloc_device(sizeof(*dev));
ibdev->ops.create_qp = mlx_create_qp;
ibdev->ops.post_send = mlx_post_send;
// ...
ib_register_device(ibdev, "mlx_%d");
return 0;
}
学习方法:
- 阅读 Mellanox 驱动源码:drivers/infiniband/hw/mlx5/
- 理解硬件抽象层 (HAL)
🎓 第5阶段:高级主题 (持续学习)
5.1 GPUDirect RDMA (2-3周)
- CUDA 与 RDMA 结合
- GPU 内存直接访问
- 应用:AI 训练、HPC
5.2 RDMA 存储加速 (2-3周) - NVMe-oF (NVMe over Fabrics)
- iSER (iSCSI Extensions for RDMA)
- 分布式存储系统
5.3 容器和虚拟化 (2-3周) - SR-IOV
- RDMA 容器化 (Docker + RDMA)
- Kubernetes RDMA 设备插件
5.4 网络功能虚拟化 (2-3周) - OVS-DPDK + RDMA
- RDMA 在 SDN 中的应用
📚 推荐学习资源
书籍
1.《RDMA Aware Programming User Manual》 - 必读
2.《InfiniBand Architecture Specification》 - 官方标准
3.《Linux Device Drivers》 (3rd Edition) - 内核编程
4.《Understanding the Linux Kernel》 - 内核原理
在线资源
1.RDMA Mojo (rdmamojo.com) - 优质博客
2.Linux RDMA 邮件列表 - 社区讨论
3.GitHub: linux-rdma/rdma-core - 官方代码仓库
4.Mellanox Community - 官方文档和示例
视频课程
1.Linux Foundation: RDMA Programming (推荐)
2.YouTube: RDMA Technology Series
3.Coursera: High Performance Computing
论文和技术报告
1."Understanding InfiniBand" - Mellanox
2."RDMA over Commodity Ethernet at Scale" - Microsoft
3."FaRM: Fast Remote Memory" - SOSP 2014
🎯 学习时间规划 (建议 6-8 个月)
全职学习计划 (每天 6-8 小时)
阶段时长每周学习内容第0阶段1-2周基础补强第1阶段2-3周RDMA 理论第2阶段3-4周用户态入门第3阶段4-6周用户态进阶第4阶段6-8周内核态编程第5阶段持续高级主题
业余学习计划 (每天 2-3 小时)
阶段时长学习重点月1-2基础准备 + 理论网络编程、RDMA 概念月3-5用户态编程Verbs API、实战项目月6-8进阶优化性能调优、生产实践月9-12内核态编程内核模块、ULP 开发
📝 每日学习建议
学习模式:理论 + 实践 + 总结
上午 (2-3小时):理论学习
- 阅读文档和书籍
- 观看视频教程
- 研究源码
下午 (2-3小时):动手实践 - 编写代码
- 运行实验
- 调试问题
晚上 (1-2小时):总结反思 - 写技术博客
- 绘制思维导图
- 整理笔记
🎮 实战项目推荐 (从易到难)
初级项目 (第2阶段)
1.Echo Server: 简单的请求-响应服务器
2.Chat Room: 多客户端聊天室
3.File Transfer: 基础文件传输工具
中级项目 (第3阶段)
1.KV Store: 分布式键值存储
2.RPC Framework: 基于 RDMA 的 RPC
3.Message Queue: 高性能消息队列
高级项目 (第4-5阶段)
1.Distributed Lock: 分布式锁服务
2.Block Storage: RDMA 块存储
3.AI Training Framework: GPU + RDMA 训练加速
🛠️ 必备工具和环境
开发工具
编译工具
sudo apt-get install build-essential cmake git
RDMA 工具
sudo apt-get install rdma-core perftest infiniband-diags
性能分析
sudo apt-get install perf linux-tools-common
调试工具
sudo apt-get install gdb valgrind strace
测试工具
性能测试
ib_write_bw # 吞吐量测试
ib_write_lat # 延迟测试
ib_send_bw # Send 操作测试
诊断工具
ibv_devinfo # 查看设备信息
ibv_devices # 列出所有设备
rdma link # 查看链路状态
rdma resource # 查看资源使用
监控工具
实时监控
watch -n 1 'rdma statistic show'
性能计数器
perfquery -x
网络抓包
tcpdump -i ib0 -w capture.pcap
💡 学习技巧和建议
- 建立知识体系
- 使用思维导图整理知识点
- 建立个人技术 Wiki
- 定期回顾和总结
-
源码阅读方法
Step 1: 从示例程序入手 (examples/)
Step 2: 阅读核心 API (libibverbs/verbs.c)
Step 3: 深入内核实现 (drivers/infiniband/core/)
Step 4: 研究硬件驱动 (drivers/infiniband/hw/)
-
调试技巧
- 使用 printk 和 pr_debug 打印日志
- 使用 gdb 调试用户态程序
- 使用 ftrace 跟踪内核函数
- 分析 /sys/class/infiniband/ 下的信息
- 性能分析方法
1. 使用 perf 分析热点
perf record -g ./your_program
perf report
2. 使用 flame graph 可视化
git clone https://github.com/brendangregg/FlameGraph
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
3. 分析延迟分布
在代码中添加时间戳统计
- 避免常见误区
❌ 只看理论不动手❌ 忽视网络基础知识❌ 跳过用户态直接学内核态❌ 不重视性能调优❌ 不阅读官方文档
✅ 理论与实践结合✅ 扎实的网络基础✅ 循序渐进✅ 重视性能和稳定性✅ 多读官方文档和源码
🎓 进阶方向选择
方向1:应用开发工程师
重点学习:
- 用户态编程 (第2-3阶段)
- 性能优化
- 分布式系统
职业方向: - 高性能计算应用
- 金融交易系统
- AI/ML 基础设施
方向2:系统工程师
重点学习: - 内核态编程 (第4阶段)
- 驱动开发
- 系统优化
职业方向: - 操作系统开发
- 存储系统
- 云计算平台
方向3:硬件工程师
重点学习: - 硬件架构
- 驱动开发
- 协议栈实现
职业方向: - 网卡厂商 (Mellanox/Intel)
- 芯片公司
- 硬件加速
📊 学习效果评估
初级 (第2阶段结束)
- ✅ 能独立编写 RC/UD 通信程序
- ✅ 理解 QP 状态机
- ✅ 能使用 RDMA CM 建立连接
- ✅ 能排查常见问题
中级 (第3阶段结束) - ✅ 能进行性能优化
- ✅ 能处理并发场景
- ✅ 能设计简单的分布式系统
- ✅ 了解生产环境部署
高级 (第4阶段结束) - ✅ 能编写内核模块
- ✅ 能开发简单的 ULP
- ✅ 理解内核 RDMA 子系统
- ✅ 能参与社区贡献
专家级 (第5阶段持续学习) - ✅ 能设计复杂的 RDMA 系统
- ✅ 能优化硬件性能
- ✅ 能解决罕见的 bug
- ✅ 能指导团队成员
🌐 社区参与
开源贡献
1.rdma-core: 用户态库
2.Linux Kernel: 内核 RDMA 子系统
3.DPDK: 数据平面开发套件
社区资源
- Linux RDMA 邮件列表
- OFED (OpenFabrics Enterprise Distribution)
- Mellanox Community Forum
- Stack Overflow (tag: rdma)
技术交流 - 参加技术会议 (OFA Workshop)
- 加入技术群组
- 撰写技术博客
- 分享实战经验
📖 推荐阅读顺序
第一本: 入门
《RDMA Aware Programming User Manual》
- 章节1-3: RDMA 基础
- 章节4-6: Verbs API
- 章节7-9: 编程实践
第二本: 深入
《InfiniBand Architecture Specification》 - 章节9: Verbs 详解
- 章节10: 传输服务
- 附录: 状态机
第三本: 内核
《Linux Device Drivers》 - 章节1-6: 内核模块基础
- 章节14: 网络驱动
- 章节15: 内存映射
第四本: 高级
《Understanding the Linux Kernel》 - 章节8: 进程调度
- 章节12: 虚拟文件系统
- 章节13: I/O 架构
🎯 6个月速成路线图 (密集学习)
月份1: 基础准备 + RDMA 理论
├─ Week 1-2: C/C++、网络编程复习
├─ Week 3: RDMA 概念、InfiniBand 架构
└─ Week 4: Verbs API、QP 状态机
月份2: 用户态编程入门
├─ Week 1: 环境搭建、第一个程序
├─ Week 2: RC/UD/UC 深入实践
├─ Week 3: RDMA CM 学习
└─ Week 4: 项目:KV Store (Part 1)
月份3: 用户态编程进阶
├─ Week 1: 项目:KV Store (Part 2)
├─ Week 2: 性能优化技术
├─ Week 3: 多线程编程
└─ Week 4: 项目:文件传输工具
月份4: 内核编程基础
├─ Week 1: 内核模块编程
├─ Week 2: 字符设备驱动
├─ Week 3: IB 子系统架构
└─ Week 4: 阅读 IB Core 源码
月份5: ULP 开发
├─ Week 1-2: 简单 ULP 实现
├─ Week 3: IPoIB 源码分析
└─ Week 4: 项目:自定义 ULP
月份6: 综合项目和总结
├─ Week 1-2: 综合项目实战
├─ Week 3: 性能优化和调试
└─ Week 4: 总结、面试准备
🚀 开始你的 RDMA 学习之旅!
记住三个原则:
1.循序渐进: 不要跳阶段
2.动手实践: 每个概念都要写代码验证
3.持续学习: RDMA 技术在不断演进
从今天开始,每天进步一点点!
祝学习顺利!🎉