RDMA 编程完整学习路线图

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周)

必备技能清单

  1. C/C++ 编程 (必须精通)
  • ✅ 指针、内存管理、结构体
  • ✅ 多线程编程 (pthread)
  • ✅ 网络编程 (socket API)
  • ✅ 系统调用
    学习资源:
  • 书籍:《C 程序设计语言》(K&R)
  • 书籍:《Unix 网络编程》(卷1)
  1. Linux 系统编程
  • ✅ 进程/线程管理
  • ✅ 内存映射 (mmap)
  • ✅ I/O 多路复用 (epoll)
  • ✅ 信号处理
    实践练习:
    // 练习1:实现一个简单的 TCP echo 服务器
    // 练习2:使用 epoll 实现并发服务器
    // 练习3:共享内存通信示例
  1. 网络基础知识
  • ✅ TCP/IP 协议栈
  • ✅ 以太网原理
  • ✅ 网络性能指标 (带宽、延迟、吞吐量)
  • ✅ DMA (Direct Memory Access) 概念
  1. 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


💡 学习技巧和建议

  1. 建立知识体系
  • 使用思维导图整理知识点
  • 建立个人技术 Wiki
  • 定期回顾和总结
  1. 源码阅读方法

    Step 1: 从示例程序入手 (examples/)

    Step 2: 阅读核心 API (libibverbs/verbs.c)

    Step 3: 深入内核实现 (drivers/infiniband/core/)

    Step 4: 研究硬件驱动 (drivers/infiniband/hw/)

  2. 调试技巧

  • 使用 printk 和 pr_debug 打印日志
  • 使用 gdb 调试用户态程序
  • 使用 ftrace 跟踪内核函数
  • 分析 /sys/class/infiniband/ 下的信息
  1. 性能分析方法

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. 避免常见误区
    ❌ 只看理论不动手❌ 忽视网络基础知识❌ 跳过用户态直接学内核态❌ 不重视性能调优❌ 不阅读官方文档
    ✅ 理论与实践结合✅ 扎实的网络基础✅ 循序渐进✅ 重视性能和稳定性✅ 多读官方文档和源码

🎓 进阶方向选择

方向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 技术在不断演进

从今天开始,每天进步一点点!

祝学习顺利!🎉

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习