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

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

祝学习顺利!🎉

相关推荐
你想知道什么?2 小时前
JNI简单学习(java调用C/C++)
java·c语言·学习
TL滕2 小时前
从0开始学算法——第十二天(KMP算法练习)
笔记·学习·算法
TG:@yunlaoda360 云老大3 小时前
腾讯云国际站代理商TACO Kit有什么优势呢?
学习·云计算·腾讯云
半夏知半秋3 小时前
Elasticsearch Query DSL 指令整理
大数据·数据库·笔记·学习·elasticsearch·搜索引擎·全文检索
BFT白芙堂3 小时前
Franka机械臂“举一反三”:LLM Trainer如何通过单次演示实现自动化数据生成与长程任务学习
人工智能·学习·机器学习·自动化·模型训练·具身智能·franka
van久4 小时前
.Net Core 学习:Razor Pages中 HTML 表头字段的两种写法对比
学习·html·.netcore
2501_916766544 小时前
【Git学习】Git的tag标签
git·学习
m0_564876844 小时前
卷积学习录
深度学习·学习·cnn
阿蒙Amon4 小时前
JavaScript学习笔记:2.基础语法与数据类型
javascript·笔记·学习