利用SPDK改善NVMe存储IO性能.docx
- 文档编号:4429732
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:6
- 大小:618.82KB
利用SPDK改善NVMe存储IO性能.docx
《利用SPDK改善NVMe存储IO性能.docx》由会员分享,可在线阅读,更多相关《利用SPDK改善NVMe存储IO性能.docx(6页珍藏版)》请在冰豆网上搜索。
利用SPDK改善NVMe存储IO性能
利用SPDK改善NVMe存储I/O性能
长期以来,SATA、SAS盘统治着企业级存储,虽然前些年SSD固态存储介质的出现对AHCI协议类型的存储访问带来了一定性能提升,但与CPU的计算速度相比,只能是杯水车薪,并且SSD的性能也不能充分地得到发挥。
传统存储技术也由于访问路径长、时延大和吞吐量低而越发不能满足“大数据”存储的需求,并且饱受诟病。
近几年推出的NVMe技术以PCIe作为SSD的访问接口,极大地缩短了I/O的访问路径,同时NVMe的软件栈也以精简的调用关系进一步降低了数据访问的时延。
可以说,NVMe技术的出现和快速发展,是对存储技术领域的重大革新。
由此NVMe存储的应用自然成了业内的发展趋势,各厂商也都积极投入NVMe存储的研发中来。
越来越多的分布式文件系统积极参与全闪阵营,通过横向扩展能力,对外提供块、对象、文件服务接口及一些增值特性服务,可以通过存储节点堆叠,获得容量和性能的同步提升。
硬件上使用RDMA、NVMe、NVDIMM等先进技术,提供高性能的硬件节点;同时采用软硬件一体化的设计达成高可靠性的目标。
为了减少存储产品面临的传统共性问题,如频繁的系统调用和上下文切换、多次的数据拷贝、过高的协议栈开销、复杂的并发互斥等痛点问题,在用户态化实现的过程中,引入了Intel的DPDK/SPDK作为关键基础技术来进行集成和开发。
基于DPDK和SPDK的用户态实现前端NVMe-oF、FCP、iSCSI块服务相关接口。
DPDK/SPDK技术的引入,通过大页(Hugepage)、轮询、分核、无锁化等机制减少了CPU上下文切换、并发互斥等带来的系统开销,提高了I/O的响应速度,带来了系统性能的提升,有效地解决了前端网络、后端网络和落盘等环节存在的性能瓶颈。
同时SPDK提供的BDEV框架,定义了上层的访问接口,和下层存储设备的注册接口,向上可以支撑多种不同协议的Target,向下可以挂载多种不同的存储设备。
BDEV框架实现了对后端存储设备的统一抽象,可以和后端存储解耦,产品前后端可针对框架开发,减小模块耦合,进行独立的测试验证,提高了产品开发维护的效率。
IntelDPDK/SPDK技术作为该产品设计的关键一环,与分布式架构融合应用,充分发挥全闪(NVMe)存储设备和RDMA传输通道的能力,提供了高性能的系统特性。
当前产品开发的先期任务主要完成针对新技术的可行性分析、验证及高性能硬件节点的原型机开发:
兼容业界主流厂商的RDMA、FC卡,并基于DPDK/SPDK实现前端NVMe-oF、FCP、iSCSI块服务类型接口。
当前的开发实现,验证了新一代全闪(NVMe)技术的高性能能力,为最终的分布式全闪(NVMe)存储产品的实现打下了坚实的基础。
SPDKNVMe-oF介绍
SPDK是Intel提供的高性能存储开发套件,在DPDK基础上实现(封装了DPDK的一些资源管理的组件,例如CPU,内存和PCI设备管理等)。
其核心是基于用户态、异步、轮询方式实现的一套编程框架(SPDKApplicationFramework),以及在该框架下开发的NVMe驱动和Target。
同时,SPDK也提供了一个用户态的块设备抽象层(BlockDeviceAbstractLayer)用以支持开发人员按需构造私有的、高效的存储应用。
SPDK主要架构可如下图。
SPDK的应用框架可概述为:
其一,对CPUcore和线程的管理;
其二,线程间的高效通信;
其三,I/O的处理模型以及数据路径(datapath)的无锁化机制。
这几个机制的共同配合,使得SPDK形成了一套低I/O时延和单CPU核IOPS最大化的高性能解决方案。
块设备抽象层通过BDEV框架向前与存储协议层对接,支持各类Target的实现;向后通过对块设备的抽象可以适配各类型的存储设备。
并且用户可以基于BDEV框架开发自己特有的应用策略,实现差异化的应用场景。
SPDK同时实现了后端NVMe盘的用户态驱动和在前端支持主机远程访问NVMe块设备的Target,在NVMe的使用场景具有天然的优势。
可以毫不夸张地说,SPDK支持的核心业务主要就是NVMeOverFabrics,即NVMe-oF。
基于SPDK的NVMe-oF应用层次关系如下图。
NVMe-oF的核心思想在于让I/O的各个阶段均在同一个CPU核上处理,以此来实现免锁和性能最大化。
其关键实现主要是nvmf功能模块。
nvmf功能模块一方面通过Transport层的实现机制屏蔽了底层“通道”(当前主要是RDMA、FC、TCP)实现的差异;同时也藉由BDEV层的抽象,可以对接各类型的块设备。
基于SPDK的应用编程框架机制,NVMe-oF可以实现将各个I/O的所有操作在同一个CPU核上完成处理,有效减少了上下文切换和并发访问带来的开销,并且能让I/O均匀地分布在各个CPU核上,进一步提升了系统的性能。
SPDK实现上采用了模块化的设计思路。
简单而言,可以将SPDK套件的内容分为三个层次:
其一,基础环境层,主要是调用DPDK接口进行底层运行环境的初始化,同时构建SPDK基于CPU核进行串行、轮询的调度机制;
其二,诸如bdev、nvmf、nvme等分别归集的核心功能模块,实现具体的业务逻辑功能;
其三,特定应用示例的实例程序和测试框架代码,集成和运行各个功能组件。
这样的设计和实现策略使得SPDK具有很强的适应性和可扩展性,用户可以根据需要灵活地进行修改或二次开发,来实现特定场景的应用。
SPDKNVMe-oF应用方案介绍
H3C当前产品的先期开发,主要是完成了通过SPDK对接主流厂商的RDMA卡以及FC卡来实现块存储服务类型的NVMe-oF、FCP、iSCSI的接口,以支持相应Target运行业务。
目前使用IntelDPDK/SPDK的具体方案框架如下图所示。
方案支持业界主流厂商的RDMA卡驱动运行在内核态,通过Verbs框架的接口向上支撑SPDK的调用,向下屏蔽不同卡的底层实现差异,同时FC卡的驱动直接使用DPDK的机制在用户态实现,提供接口支撑上层使用。
对于NVMe-oF而言,在SPDK的nvmf功能模块中,通过Transport层屏蔽了作为“传输通道”的FC和RDMA的实现差异,具体如图所示。
在基于SPDK进行二次开发的过程中,主要完成了如下方面的修改或实现,具体可参见表所述。
1.增加了FCTransport的具体实现;产品需要在前端同时通过RDMA及FC通道支持NVMe-oF业务,因而针对需要的使用场景,增加了nvmfTransport层的FC实现。
2.增加了FC卡的用户态驱动;该驱动基于DPDK及UIO驱动框架实现,主要包含硬件适配、通用管理、连接处理,I/O处理等功能。
3.调整了接口分层;为了更符合实际业务场景的使用需求,增加操作、管理的灵活性,也为了减少模块对外的耦合,在考虑后续版本升级和兼容的情况下,对SPDKnvmf功能模块的代码作了如下分层封装。
4.增加了NQN的唯一性机制;在NVMe-oF应用中,需要确保subsystem的NQN的唯一性,至少在当前网络域内是唯一的,因此引入了NQN与节点唯一标识相结合的方案。
这样,只要能保证节点内的subsystem的NQN不重复,即可保证网络内NQN不重复。
5.增加abort的处理;集成的SPDK版本尚未支持对abort命令的响应,在nvmf功能模块来模拟实现对abort命令的支持。
6.断链时等待I/O归零;断链过程(可能是主动断链或者异常出现时的断链)中,可能有I/O请求还在处理,此时若直接释放链接资源,则有可能会存在未处理完成的请求访问非法资源的情况。
因而断链过程中需要等待I/O请求的完成。
7.主动断链;增加Target侧主动断开链接功能的支持,特别是针对跑业务过程中出现重大错误时的处理。
8.Target侧keep-alive机制;NVMeOverFabricsSpec中定义了由主机定期发送keepalive报文来判断通道是否正常的机制,当网络不通畅时,主机可以感知,并主动断开链接。
但如果网络突然完全中断后,主机断开链接的请求无法到达Target侧,并且Target也无法感知网络的中断,之前与相关主机的链接会持续存在,一方面造成资源泄漏,另外也可能对网络恢复后的业务恢复产生影响(如Target侧会认为已与当前新来的主机建立了链接拒绝重复建链等)。
9.性能统计;为了更好地统计每个I/O请求从到达Target侧后一直到响应从Target侧返回的这个过程中各个阶段的时延情况,当前开发过程中对I/O请求进行了阶段标识并进行打点计时统计,可以清晰看到实时的时延变化及IOPS情况的统计,增加了可定位性手段。
10.监听的合法性判断及同主机同port拒绝重复建链;集成的SPDKNVMe-oF应用中,暂未实现“认证”、“加密”等相应内容,目前能做合法性判断策略的主要就是监听和检查主机的合法性。
当前的实现中,一方面,增加了对请求所属的监听是否当前subsystem所允许的合法性判断,同时也对同一个主机,通过同一个port(主机侧的port和Target侧的监听均一样)来进行重复建链(建立控制链接)的情况的限制。
11.cli功能添加;为了便于调试及问题定位,在开发过程中增加了独立的cli功能,可以支持命令的动态查询、创建、设置等操作,提高了系统的可定位性和可维护性。
12.可靠性问题修改;在本项目的开发过程中,修改了许多可靠性问题,如异常处理不完善、Target进程主动终止时异常退出等,总体的解决思路均是:
遵从SPDK分核思路,将操作通过SPDK的分核轮询机制串化、延后处理,实现免锁和消除并发。
如下可列举部分已解决的典型问题。
1)共享断链时RDMA的共享完成队列报错及造成非法地址访问的问题;
2)断链时判断当前链接数并发造成的判断不准;
3)创建监听时的异常处理;
4)主动终止进程时出现的异常退出。
总体而言,本项目对SPDK的nvmf、iSCSI等模块做了相应的扩展和修改,以更符合实际的业务场景的需求。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 SPDK 改善 NVMe 存储 IO 性能