FPGA实现高带宽NVMeSSD读写——纯逻辑实现
项目背景
在两年之前的帖子《FPGA实现高带宽NVMe SSD读写》中,我们实现了一个基于PS和PL端的高速NVMe SSD IP。这个IP在我们自己的系统中使用正常,但是由于该IP使用了PS端资源,在与其他应用系统集成时遇到了麻烦。为了保护自有的设计,需要独占PS端的一个ARM处理器,这使得该IP在与其他项目集成时,使用很不方便。除此以外,原方案IP写SSD硬盘的最大速度约为2.8GB/s,而PCIe Gen3条件下理论有效带宽为3.938GB/s,基于x86的PC测速一般为3.6GB/S,FPGA的实现方式与理论速度以及x86平台的速度存在一定的差距,因此希望进一步提高IP的硬盘的读写速率。
为此我们对IP进一步进行优化,仅使用PL资源(不使用PS部分资源)实现一个纯逻辑的NVME Host IP,并也想看看基于FPGA的NVME SSD读写最快能到多少。
方案介绍
本IP的核心是对NVME协议进行解析并对应发出控制信号的NVMe Host模块。该模块的核心工作是实现NVMe协议中的命令队列的生成以及响应。NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输。两种命令都需要有对应的SQ和CQ, NVMe Host不仅负责生成SQ任务队列,且需将其发送至控制寄存器,此外模块还需实时响应CQ队列的命令,并做出相应处理。此外该模块中还有一个初始化模块用于对于模块进行初始化。
系统的结构框图如下,其中虚线框内为IP
系统中PCIe PHY为Xilinx官方IP,其可以实现PCIe协议层,通过PCIe 3.0直接连接SSD硬盘,直接实现与硬盘的数据传输。
控制寄存器存储NVMe协议中使用的控制命令及传输命令,本设计中将其独立为一个模块以方便PCIe PHY对其进行读写。
存储队列控制器主要实现对DDR的多任务调度。由于本IP的项目背景需要较高的传输速度,单NVME SSD无法直接满足,需要使用RAID的模式,下挂2个NVMe SSD硬盘。该模块主要负责在两个硬盘进行任务调度以提高DDR4的利用效率。在单盘的应用中,该控制器可不使用。
测试平台
为测试IP模块的读写性能,以NVME Host IP为核心,利用一个MicroBlaze实现测试数据的写入及读出,并使用一段DDR4存储空间作为NVME读写数据的缓存空间,即将需写入NVME SSD的测试数据提前送至DDR4,或是存入从NVME SSD读出的数据。此外,MicroBlaze还为IP提供NVME SSD硬盘所需的读写控制信号R/W、SLBA、NLB以及IP开始工作的Start信号。
MicroBlaze通过AXI Bridge与存储队列控制器一起连接至DDR Controller,使用GPIO模块送出相应的控制信号及数据。此外,该MicroBlaze下挂了一个AXI Timer模块,通过IP实时反馈信号以进行数据传输的实时测速。
整个系统的实现,与之前的几个帖子相同,我们仍然使用Xilinx官方开发板ZCU106和FMC NVMe SSD转接卡。与之前方案的区别在于之前的系统中的NVMe协议由PS中的ARM处理器实现,受限于ARM处理器的速度,协议NVME解析过程中有一定的耗时。新IP设计了一个独立模块以实现NVMe Host的功能,并使用ZCU106主芯片ZU7EV内部集成PCIe RC硬核,完成PCIe协议层。
测试方案
为了验证新IP的读写性能,我们选用了三星硬盘,致态、爱国者、七彩虹市场的三款热卖家(商)用硬盘以及忆芯和至誉两款国产工业盘作为测试对象,通过实际SSD盘的读写来标定IP的性能。此外,也想测试一下市场家用SSD的性能到底如何,并向大家介绍一款新的国产工业用SSD厂家,至誉科技。本次测试中,每个硬盘的详细性能数据,将在随后的另外一个帖子中发布。
测试中,分别进行了功能验证测试、连续数据读写测试、SSD分段测试、交叉读写测试,并为了验证测试平台及环境,还特别进行了时间基准验证。其中,连续数据读写测试是向SSD连续写入/读出1000GB的数据,地址连续,得到的性能参数。交叉读写测试,即交叉执行写入128MB和读出128MB的命令,以测试SSD硬盘交叉读写的性能。
为了进一步提高测试数据的精度,我们使用了一套较之前更精准的测试方案对读写性能进行测试及对比。
关于功能验证测试、连续数据读写测试、SSD分段测试以及时间基准验证将在随后的SSD测试帖子详细介绍。敬请关注。
测试硬盘:
本次测试中所使用的4块SSD的详细信息如下:
三星960PRO 型号:MZ-V6P512,容量:512GB。
三星980PRO 型号:MZ-V8P2T0,容量:2TB。
忆芯Starblaze 型号:S1200ITT2-T2M22T-C1,容量:2TB。
至誉 型号:PI4 EXP4M9A0038ZAN8100,容量:3840GB。
测试结果:
IP连续数据读写测试结果:
PS:由于忆芯读出速度与三星980PRO读出速度基本重合,在作图时进行适当调整
硬盘的测试结果如上图所示。相较于上一次测试( 你所不知道的NVMe SSD固态硬盘读写速度及国货的惊喜–基于FPGA的速度测试_sm961_ARTBES的博客-CSDN博客),三星980 PRO的读盘速度从之前的2.7GB/s提升至3.0GB/s,写盘速度从2.5GB/s提升至2.8GB/s;忆芯硬盘的读出速度从2.7GB/s提升到3.0GB/s,写入速度从2.2GB/s提升至2.3GB/s,也是有一定的提升,这两款硬盘是上次测试时使用过且至今仍能继续正常使用的盘。由此可以看出本IP较之前测试速度有较大提升,足以证明本IP功能的强大。此外我们在本次测试中也加入了许多新的硬盘,三星960PRO的读盘平均速度达到3.05GB/s,写盘平均速度为2.0GB/s;新加的工业级SSD硬盘至誉硬盘的读盘平均速度达到2.45GB/s,写盘平均速度为2.65GB/s。三星980Pro的写盘速度在约200GB的位置开始出现了速度的下跌,这在之前的测试是没有的。经过多次测试,现象依旧。本着如实反映实际测试结果的原则,我们将实际结果列出。欢迎各位朋友指出问题或原因。由于篇幅的原因,测试的具体数据将在另外的一个SSD测试帖子中详细介绍并分析。
在交叉读写测试中,主要测试了三星980PRO未降速部分和至誉硬盘的交叉读写,测得980PRO交叉读写速度约为2.94GB/s,至誉交叉读写速度约为2.52GB/s,均约等于读写速度的平均数,由此可以认为NVME HostIP在读写功能切换中基本没有速度损失。具体测试结果见下图:
在SSD分段测试中三星960PRO读盘的瞬时速度达到了3125MB/s,三星980PRO写盘的瞬时速度达到2960MB/s。
由于在实验中不存在一个足够理想的SSD硬盘对接NVME Host IP,使IP能够达到理想中的最大传输速度,因此IP的最大速度的标定采用了实际测试中的结果。我们认为NVME Host IP写硬盘性能不低于2960MB/s,读硬盘性能不低于3125MB/s,IP整体数据传输性能不低于3125MB/s。
IP实现及测试中的问题
在NVME Host IP的实现、优化和测试过程中,我们也遇到了各种各样的问题,在此把我们遇到的几个有意思的问题和大家分享一下:
Xilinx官方IP:AXI Interconnect
Xilinx的官方IP是真好用,也是真不好用!(对,你没看错)
AXI interconnect是Xilinx官方提供的一个IP,主要用于AXI线的转接,可以实现地址的自动分配。该IP还有其他强大的功能,例如可以实现AXI4和AXI Lite协议转换,可以实现不同位宽的AXI线转换,还可以实现不同时钟域的AXI线转换。对于两个AXI设备的相连,只要把AXI interconnect扔进去,其会根据两个AXI设备的具体配置而自动配置这个IP的功能和参数,而且保证功能是对的。从这个层面来说,Xilinx的官方IP是真好用。
在IP实现及优化的过程中,当AXI数据传输的速度比较快时,AXI interconnect会有各种奇怪的错误,比如左边的信号到了,右边就是不出来。一点解决的办法都没有!所以,从这个层面来说,Xilinx的官方IP是真不好用!后来索性自己写这部分的功能,好麻烦,但是就只能硬着头皮来。自己写出来了,在调试及优化过程中,就方便多了,想怎么加buffer就怎么加,想怎么做并行优化就能怎么做,从而进一步提升传输速度。
硬盘厂商的调教:队列深度
我们一般认为三星980PRO是同参数SSD的标尺,这是有道理的。因为该盘的主控芯片及闪存芯片都是三星自己设计及出品,具有较高的优化程度。在本次测试中,三星980PRO SSD的任务队列深度为协议队列最大深度的一小部分(不到10%)时,就能跑出最好状态。相比之下,忆芯使用的是其自研的主控芯片,其读出速度与三星处于性能顶端,但是其写入的速度略慢,与三星的主控有一点差距。忆芯开发了4款主控芯片,都已投入使用。我们相信经过产品的迭代,忆芯能做出性能更优秀的主控及SSD。在本文之后的另外一篇测试帖子中的其他国产SSD使用的都是第三方的主控芯片,因此国产盘的设计工作更多是在第三方的主控芯片的配置及使用方面。想深入优化队列的处理,因为不是自己的芯片,也无能为力。这种技术的差距,体现在测试中任务队列深度上。国产的SSD一般任务队列要达到三星980PRO的3倍以上,才能达到该盘的最大性能,不同的SSD有各自不同的最佳性能队列深度的阈值。至誉科技使用Marvell的主控芯片,并经深度优化。其产品采用了自适应温控 (Adaptive Thermal Control™) 和SuperCruise™技术,可以优化存储写入速度,达到极高的稳定性,此外在性能及功耗之间取得较好的平衡,具有较高的写入速度。
国产SSD与三星产品的差距,一方面是一个遗憾吧,说明我们在SSD这方面和世界最高水平还有一定的差距。另外一方面,也说明NVME主控芯片的设计是由一定技术门槛的,需要完整的理解协议并按照规范实现传输任务的创建、生成、打包、分配,并优化每个传输环节,以达到最大性能,我们在本次IP实现中,也深深体会到该工作之难。
结语
经过测试,本次的IP使用FPGA纯逻辑实现,相较于上一版基于嵌入式ARM处理器的IP速度有了较大的提升。NVMe协议的固态硬盘在PCIe Gen3条件下,理论有效带宽为3.938GB/s,我们已经近似达到理论值的80%,最高速度不低于3125MB/s,考虑到Xilinx的PCIE3.0 的IP性能要弱于其他如Synopsys的ASIC IP,所以本次的IP性能对于FPGA来说这已经是一个十分可观的速度了。当然,我们的实验中可能仍然存在一些不足之处,如果有朋友有更好的方法欢迎联系我们。
如果需要讨论,联系方式如下:
北京市可线下,地址:北京市海淀区中关村南大街5号北京理工大学。
非京可联系:Tel:13810602873(微信同号)
E-mail:liuzhenyu@bit.edu.cn
声明
在本文的结尾,我们做如下声明:本次的测试仅仅是作为与该领域感兴趣的朋友交流之用。我们仅对某款型号的某块盘,基于FPGA平台,用自己的测试程序做了统一的、无差别的测试而得到了结果。我们仅对我们的方法及所用的盘负责,保证不出现虚假或是伪造的结果。但不是对市场上所有的该型号或类似的产品性能做出推断或推论。本文的数据发布出来,仅供大家参考。