惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
博客园 - 叶小钗
小众软件
小众软件
WordPress大学
WordPress大学
I
InfoQ
Last Week in AI
Last Week in AI
Vercel News
Vercel News
博客园 - Franky
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
腾讯CDC
D
DataBreaches.Net
有赞技术团队
有赞技术团队
宝玉的分享
宝玉的分享
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
G
Google Developers Blog
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
为什么 NFS Over RDMA 比 NFS 的 FIO 大块读性能好很多
微信公众号 · 2025-03-30 · via 陈少文的网站

Please enable Javascript to view the contents

1. 背景

在测试 NFS Over RDMA 的性能时,发现 4M 的文件的读取性能竟然能达到 45GB/s。

1
2
3
fio -numjobs=128 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/data1/nfs

   READ: bw=42.3GiB/s (45.4GB/s), 42.3GiB/s-42.3GiB/s (45.4GB/s-45.4GB/s), io=1269GiB (1363GB), run=30019-30019msec

而磁盘的 4M 多线程读取性能只有 6 GB/s

1
2
3
fio -numjobs=128 -fallocate=none -iodepth=2 -ioengine=libaio -direct=1 -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/data1/host

   READ: bw=6190MiB/s (6491MB/s), 6190MiB/s-6190MiB/s (6491MB/s-6491MB/s), io=182GiB (196GB), run=30152-30152msec

2. NFS Over RDMA VS NFS

3. 数据拷贝路径比较

3.1 NFS

传输路径:

磁盘 -> 内核页缓存 -> 用户态内存 (read) -> 内核态网络缓冲区 (send) -> 协议栈处理 -> 网卡 -> 网络 -> 网卡 -> 协议栈处理 -> 内核态网络缓冲区 (receive) -> 用户态内存 (write) -> 磁盘

3.2 NFS Over RDMA

传输路径:

磁盘 -> 内核页缓存 -> RDMA 网卡 -> 网络 -> RDMA 网卡 -> 内核页缓存(绕过内核网络协议栈)-> 用户态内存 (write) -> 磁盘

3.3 比较

对比项NFS (基于 TCP/IP)NFS Over RDMA
数据拷贝需要多次拷贝(用户态 ↔ 内核态,网络缓冲区等)采用 RDMA 直接访问内存,减少拷贝
CPU 占用高,CPU 需处理协议栈和数据拷贝低,RDMA 硬件卸载传输,减少 CPU 负担
延迟较高,TCP/IP 处理增加开销低,绕过协议栈,直接 DMA 访问
吞吐量受限于 TCP/IP 和 CPU 处理能力高,RDMA 提供更高的带宽
网络协议依赖 TCP/UDP 传输协议使用 RDMA 直接访问远程内存
适用场景适用于一般网络环境,对低成本存储共享适用适用于高性能计算(HPC)、大规模分布式存储
部署复杂度易于部署,适用于标准以太网需支持 RDMA(RoCE 或 InfiniBand),部署较复杂
硬件依赖只需要标准网卡需要 RDMA 兼容网卡(如 RoCE、InfiniBand)

4. 传输路径逐步分析

FIO 测试的传输路径:

内核页缓存 -> RDMA 网卡 -> 网络 -> RDMA 网卡 -> 内核页缓存(绕过内核网络协议栈)-> FIO 用户态内存

从监控中,可以看到,在测试期间只有前一次测试的磁盘操作,后面就都没有经过磁盘。fio 的 direct=1 参数只能控制客户端是否使用缓存,不能控制 NFS 服务端。

但 RDMA 的速度跑满了,能达到 45 GB/s。

测试一下内存的读写速度:

1
2
3
fio -numjobs=128 -iodepth=2 -ioengine=sync -rw=read -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/dev/shm

   READ: bw=135GiB/s (145GB/s), 135GiB/s-135GiB/s (145GB/s-145GB/s), io=4057GiB (4356GB), run=30004-30004msec
1
2
3
fio -numjobs=128 -iodepth=2 -ioengine=sync -rw=write -bs=4M --group_reporting -size=100m -time_based -runtime=30 -name=fio-test -directory=/dev/shm

  WRITE: bw=74.4GiB/s (79.9GB/s), 74.4GiB/s-74.4GiB/s (79.9GB/s-79.9GB/s), io=2233GiB (2398GB), run=30008-30008msec

内存的读写速度分别达到 145 GB/s 和 79.9 GB/s,远高于单个 RDMA 网卡的 45 GB/s。

这样看,fio 测试大文件读取时的瓶颈,确实就是 RDMA 网络传输速度。


微信公众号