NVMe-oF RDMA vs. TCP延时测试对比:端到端SPDK的意义

前不久看到一篇《NVIDIA BlueField 再创 DPU 性能世界纪录》的新闻,该测试环境是2台服务器,每台各安装2块NVIDIA Bluefield-2 DPU,形成4条100GbE以太网直连,两端分别跑NVMe-oF Target(存储目标)和Initiator(主机端)。

测试结果包括TCP和RoCE(RDMA)两部分,上图是第一部分。我们看到,用户态SPDK to SPDK的512Byte小块读测试达到了41.5M(超过4100万)IOPS;Linux 5.15内核的FIO测试只有不到SPDK一半的性能,应该是CPU被I/O中断跑满了,4.18内核则又低了不少。

作为块存储设备,512B IOPS性能基本上只对++Optane(傲腾)SCM++介质有意义,比如Intel P5800X的4K随机读写、512Byte随机读IOPS指标分别为是150万和460万。对于传统NAND闪存SSD来说,小于4KB的IOPS通常也不会更高了,因为闪存页面大小一开始就是4KB(先进制程NAND的物理页面大多在8KB-16KB)。

另一点值得注意:在NVIDIA新闻的测试平台介绍中,并没有提到用的什么持久化数据盘,也就是说该测试应该是用DRAM内存模拟块设备来跑网卡的极限性能,没有提到随机访问那就是顺序IO了。

在4KB数据块测试中,用户态与内核的差距就没有那么大了,因为网卡的吞吐量快跑满了。其中SPDK to SPDK的读达到了345Gb/s,读写双向则是431Gb/s。

如果换用RoCE,Bluefield的512B小块IOPS,以及4KB双向带宽比TCP有进一步的提升。不过在这个新闻稿中没有提到延时数字,于是我又把https://spdk.io/doc/performance_reports.html 网站上Intel的测试报告翻了出来。

端到端SPDK延时只有5µs:这个数据落盘了吗?

上图引用自《SPDK NVMe-oF RDMA/TCP (Target & Initiator) Performance Report Release 21.10》这2份文档。Intel是用一台配有16个P4610 SSD的服务器跑NVMe-oF Target,前端通过2个CX-5 100GbE网卡直连2台NVMe-oF Initiator服务器。

这个测试环境,比前面NVIDIA那份新闻稿更接近真实应用。不过当我看到下面的延时数据时,还是怀疑这部分测试的IO是否都落盘(SSD)了?

上面图表是我从Intel报告的"Test Case 3: Linux Kernel vs. SPDK NVMe-oF RDMA Latency"中整理的数据,用iodepth=1和单任务能测出最短延时。

可以看出,使用Linux内核的NVMe-oF Initiator和Target测试,延时在16-18µs之间;如果只是把后端存储换成SPDK Target,延时降低到13µs多;只有IO负载请求和目标端都使用SPDK才能达到最短的5µs左右。

显然NAND闪存SSD应该跑不了这么快。可以参考下我在《++NVMe-oF三种协议(FC、RDMA、TCP)对比:成败不只看性能++》中对比的数字(如下图)------这个是包含SSD延时在内的。

图注:"不同NVMe-oF协议的延时对比主要看低并发/队列深度时。纯软件NVMe/TCP接近100微秒了;而RoCE只有大约30微秒;FC-NVMe在50微秒左右,TCP-Offload甚至比它还要稍好一些。"

记得在几年前的《++SPDK实战、QoS延时验证:Intel Optane P4800X评测(5)++》一文中,我测试过当时唯一能达到10µs以内延时的SSD(DRAM内存盘除外)。

当年我用FIO测试P4800X在Linux Kernel下的随机读延时为14.2µs,而用户态的SPDK则可以跑到6.49 µs。如果是NAND闪存SSD,正常应该在100 µs左右的水平;随机写有可能会较短,因为固态盘上有Cache。

在Intel报告的Latency测试配置部分,我认为是找到了答案(如果不正确的话,请读者朋友纠正我):bdev_null_create应该是创建了一个并不在SSD上的"空"设备,即等于10240MB的内存盘。为了对比测试NVMe-oF网络的延时,在这一段如此操作倒也合理。

同时我还对比了另一份本地盘的测试报告《SPDK NVMe BDEV Performance Report Release 21.10 》,其中延时数据如下:

上面这个才是实打实的NAND闪存SSD延时水平------我们看到Linux内核libaio引擎平均随机读延时为85µs,SPDK BDEV和io_uring则能够分别降低到71µs和73µs。

SPDK对NVMe/TCP网络延时贡献有限

这个图表整理自Intel报告的"*Test Case 3: Linux Kernel vs. SPDKNVMe-oF TCP Latency"*部分数据,可以看出NVMe/TCP的延时水平,以及SPDK在这里的价值。

本文主要就写这么多,下面给出本次阅读理解的结论:

1、++SPDK的最大价值,依然是用户态Pooling,相比传统内核IRQ I/O能够显著节省CPU资源;++

2、++当使用Linux Kernel I/O时,NVMe-oF RoCE网络的延时约在16-18µs;NVMe/TCP则达到30++ ++µs左右,并且TCP网络混合读写的延时还有增大;++

3、++在Target/Initiator端到端SPDK配置下,NVMe-oF RoCE延时降低到5µs左右;NVMe/TCP与内核态I/O相比也有改善,但仍在20µs以上;++

注:除非特别说明,以上关于NVMe-oF延时的数据,都没有将SSD延时考虑在内。

简单来说,NVMe/TCP比基于RDMA和FC的NVMe-oF网络延时高,这是许多人都知道的。端到端SPDK能够降低延时,而且这种贡献在RoCE网络下表现更好。

附:SPDK(即IRQ vs. Polling)性能提升原理示意图

上面这个是经典的Polling模式,会把一个CPU核心长时间占满。

后来又有人提出了Hybird Polling(混合轮询),在没有I/O时可以插入Sleep睡眠来降低CPU负载。

参考资料

NVIDIA BlueField 再创 DPU 性能世界纪录

https://spdk.io/doc/performance

相关推荐
4647的码农历程2 分钟前
Linux网络编程 -- 网络基础
linux·运维·网络
向李神看齐7 分钟前
RTSP协议讲解
网络
Death20012 分钟前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
虽千万人 吾往矣18 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
魏大橙25 分钟前
linux RCE本地/公网测试
网络·网络协议·udp
陈逸轩*^_^*41 分钟前
Java 网络编程基础
java·网络·计算机网络
l1x1n02 小时前
网络安全概述:从认知到实践
网络
鄃鳕2 小时前
HTTP【网络】
网络·网络协议·http
蜡笔小新星2 小时前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
小白爱电脑3 小时前
WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?
网络·智能路由器·桥接模式