CN113721852A - 一种屏蔽接口差异的架构及其方法及系统 - Google Patents
一种屏蔽接口差异的架构及其方法及系统 Download PDFInfo
- Publication number
- CN113721852A CN113721852A CN202111006929.1A CN202111006929A CN113721852A CN 113721852 A CN113721852 A CN 113721852A CN 202111006929 A CN202111006929 A CN 202111006929A CN 113721852 A CN113721852 A CN 113721852A
- Authority
- CN
- China
- Prior art keywords
- spdk
- request
- interface
- ioctx
- event
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0604—Improving or facilitating administration, e.g. storage management
- G06F3/0607—Improving or facilitating administration, e.g. storage management by facilitating the process of upgrading existing storage systems, e.g. for improving compatibility between host and storage device
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/42—Bus transfer protocol, e.g. handshake; Synchronisation
- G06F13/4282—Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
- G06F3/0611—Improving I/O performance in relation to response time
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0659—Command handling arrangements, e.g. command buffers, queues, command scheduling
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0673—Single storage device
- G06F3/0679—Non-volatile semiconductor memory device, e.g. flash memory, one time programmable memory [OTP]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2213/00—Indexing scheme relating to interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F2213/0026—PCI express
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Advance Control (AREA)
Abstract
本发明提出了一种屏蔽接口差异的架构及其方法及系统,涉及计算机系统领域。一种屏蔽接口差异的架构及其方法包括:通过基于spdk原生接口实现的类libaio接口libaio Wrapper,可以对上层屏蔽下层物理硬件的差异,快速替代上层业务中基于块设备的libaio接口。其能够根据底层实现通过spdk nvme原生接口、外部调用通过和libaio相似的接口,使之兼容已有接口,屏蔽硬件细节,便于使用,缩短技术升级成本和周期。此外本发明还提出了一种屏蔽接口差异的架构及其系统。
Description
技术领域
本发明涉及计算机系统领域,具体而言,涉及一种屏蔽接口差异的架构及其方法及系统。
背景技术
SPDK NVME原生接口提供了针对NVME控制器硬件队列的初始化、IO提交、收割的操作。但这种接口需要和硬件队列直接交互,初始化参数比较多,还需要用户自己保证收割和提交串行执行,使用方式和传统的libaio接口有很大不同,出错概率和学习成本相对比较高,导致在SSD场景把传统的接口替换成SPDK接口增加了不少工作量。
此外,原生的NVME接口初始化的时候需要了解queue pair队列深度和数量等硬件细节。虽然在spdk中的bdev层能够承上启下,可以隔离具体的设备和IO模式,对vdev等上层抽象出了统一的框架。但是bdev框架需要注册一系列接口函数,此外io请求提交和收割方式和已有的libaio等接口也无法直接兼容。已经支持libaio的业务也需要额外的改动才能适配。
发明内容
本发明的目的在于提供一种屏蔽接口差异的架构及其方法,其能够根据其底层实现通过spdk nvme原生接口,外部调用通过和libaio相似的接口,使之兼容已有接口,屏蔽硬件细节,便于使用,缩短技术升级成本和周期。
本发明的另一目的在于提供一种屏蔽接口差异的架构及其系统,其能够运行一种屏蔽接口差异的架构及其方法。
本发明的实施例是这样实现的:
第一方面,本申请实施例提供一种屏蔽接口差异的架构及其方法,其包括业务层调用spdk_io_submit接口,内部通过spdk_thread_send_mess-age把包含业务层回调的ioctx发送到后台绑定的spdk_thread内部的无锁队列(ctx ring);Spdk thread按照FIFO的顺序获取ctx ring中的请求,通过spdk_nvme_ns_cmd_write/read执行IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的ioctx塞入到无锁的完成事件队列eventring;NVME controller从hardware提交队列消费新的IO请求ioctx;NVME con-troller把完成的IO请求ioctx放到hardware completion queue;Spdk thread的poller线程周期地执行spdk_nvme_qpair_process_completions操作,收割完成的IO,把hardwarecompletion queue上的请求消费掉,并触发上面的回调函数的执行。
在本发明的一些实施例中,上述还包括:业务层通过spdk_io_getevents()获取完成的io_events。
在本发明的一些实施例中,上述还包括:业务层根据业务场景调用ioctx/ioevent中对应的业务层回调。
在本发明的一些实施例中,上述Spdk thread的poller线程周期地执行spdk_nvme_qpair_process_completions操作,收割完成的IO,把hard ware completion queue上的请求消费掉,并触发上面的回调函数的执行包括:根据ioctx中的参数和操作字段构造io_event,并把构造出来的io_event塞到无锁的完成事件队列。
在本发明的一些实施例中,上述还包括:spdk_io_getevents()以无锁的方式访问无锁的完成事件队列,按照FIFO的顺序获取io_event,通过上面ioctx和ioevent的对应关系从io_event中反向解析出io_ctx和回调函数,并且执行。
在本发明的一些实施例中,上述反向解析包括:从io_event的data字段获取ioctx的回调函数;从Io_event的obj字段获取ioctx;从Io_e-vent的res字段获取IO完成的返回值;从Io_event的res2字段获取IO失败时的错误码。
在本发明的一些实施例中,上述还包括:如果IO完成的返回值表示失败,不执行回调,返回当时的错误码;如果IO完成的返回值表示成功,执行回调io_event->data(io_event->obj)。
第二方面,本申请实施例提供一种屏蔽接口差异的架构及其系统,其包括接入模块,用于业务层调用spdk_io_submit接口,内部通过spdk_th-read_send_message把ioctx和提交动作发到后台绑定的spdk thread;
执行模块,用于Spdk thread通过spdk_nvme_ns_cmd_write/read执行IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的ioct-x塞入到无锁的完成事件队列event ring;
提交请求模块,用于NVME controller从hardware提交队列消费新的I-O请求ioctx;
收割完成请求模块,用于NVME controller把完成的IO请求ioctx放到hardwarecompletion queue;
触发模块,用于Spdk thread的poller线程周期地执行spdk_nvme_q-pair_process_completions操作,收割完成的IO,把hardware comple-tion queu-e上的请求消费掉,并触发上面的回调函数的执行。
在本发明的一些实施例中,上述包括:用于存储计算机指令的至少一个存储器;与上述存储器通讯的至少一个处理器,其中当上述至少一个处理器执行上述计算机指令时,上述至少一个处理器使上述系统执行:接入模块、执行模块、提交请求模块、收割完成请求模块以及触发模块。
第三方面,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如一种屏蔽接口差异的架构及其方法中任一项的方法。
相对于现有技术,本发明的实施例至少具有如下优点或有益效果:
基于SPDK原生nvme接口实现的类libaio接口,内部能够屏蔽两种差异,对外能够提供兼容linux原生的libaio接口。通过直接替换相应的函数、链接底层封装后的spdk_libaio库,能够快速地把业务里的原生libaio接口替换成使用用户态NVME接口,减低业务IO延时,并且改动小、周期短、成本低。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明实施例提供的一种屏蔽接口差异的架构及其方法步骤示意图;
图2为本发明实施例提供的nvme_io_setup主要流程示意图;
图3为本发明实施例提供的nvme_io_submit的实现流程示意图;
图4为本发明实施例提供的nvme_io_getevents的实现流程示意图;
图5为本发明实施例提供的NVME SSD盘nvme hardware queue pair ID的编码格式示意图;
图6为本发明实施例提供的路由示意图;
图7为本发明实施例提供的一种屏蔽接口差异的架构及其系统模块示意图;
图8为本发明实施例提供的一种电子设备;
图9为本发明实施例提供的主要架构图;
图10为本发明实施例提供的时序图。
图标:10-接入模块;20-执行模块;30-提交请求模块;40-收割完成请求模块;50-触发模块;101-存储器;102-处理器;103-通信接口。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
需要说明的是,术语“包括”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
下面结合附图,对本申请的一些实施方式作详细说明。在不冲突的情况下,下述的各个实施例及实施例中的各个特征可以相互组合。
实施例1
请参阅图1,图1为本发明实施例提供的一种屏蔽接口差异的架构及其方法步骤示意图,其如下所示:
S100,业务层调用spdk_io_submit接口,内部通过spdk_thread_send_mess-age把包含业务层回调的ioctx发送到后台绑定的spdk_thread内部的无锁队列(ctx ring);
S110,Spdk thread按照FIFO的顺序获取ctx ring中的请求,通过spdk_nvme_ns_cmd_write/read执行IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的ioctx塞入到无锁的完成事件队列event ring;
S120,NVME controller从hardware提交队列消费新的IO请求ioctx;
S130,NVME controller把完成的IO请求ioctx放到hardware compl etionqueue;
S140,Spdk thread的poller线程周期地执行spdk_nvme_qpair_proc ess_completions操作,收割完成的IO,把hardware completion queue上的请求消费掉,并触发上面的回调函数的执行;
在一些实施方式中,通过基于spdk原生接口实现的类libaio接口libaioWrapper,可以对上层屏蔽下层物理硬件的差异,快速替代上层业务中基于块设备的libaio接口,具体的架构请参阅图9。
在一些实施方式中,参阅图10的时序图,主要流程如下:
业务层调用spdk_io_submit接口,其内部通过spdk_thread_send_message把ioc-tx和提交动作发到后台绑定到某个核的1个spdkthr-ead;
spdkthread通过spdk_nvme_ns_cmd_write/read执行真正的IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的ioctx塞入到无锁的完成事件队列eventring;3.NVMEcontroller从hardware提交队列消费新的IO请求ioctx;
NVMEcontroller把完成的IO请求ioctx放到hardwarecomplet-ion queue;
spdkthread的poller线程周期地执行spdk_nvme_qpair_process_completions操作,收割完成的IO,把hardware completion queue上的请求消费掉,并触发上面的回调函数的执行。回调函数的主要功能是:根据ioctx中的参数和操作字段构造io_event,并把构造出来的io_ev-ent塞到无锁的完成事件队列。
在一些实施方式中,回调函数的主要功能是:根据ioctx中的参数和操作字段构造io_event,并把构造出来的io_event塞到无锁的完成事件队列。
其中io_event的构造方法如下:
io_event的data字段设置成ioctx的回调函数;
Io_event的obj字段设置成ioctx地址;
Io_event的res字段设置成IO完成的返回值;
Io_event的res2字段设置成IO失败时的错误码。
S150,业务层通过spdk_io_getevents()获取完成的io_events;
在一些实施方式中,spdk_io_getevents()以无锁的方式访问无锁的完成事件队列,按照FIFO的顺序获取io_event,通过上面ioctx和io event的对应关系从io_event中反向解析出io_ctx和回调函数,并且执行。
反向解析的方法如下:
从io_event的data字段获取ioctx的回调函数;从Io_event的obj字段获取ioctx;
从Io_event的res字段获取IO完成的返回值;
从Io_event的res2字段获取IO失败时的错误码。
S160,业务层根据业务场景调用ioctx/ioevent中对应的业务层回调。
在一些实施方式中,如果IO完成的返回值表示失败,不执行回调,返回时的错误码;
如果IO完成的返回值表示成功,执行回调io_event->data(io_event->obj)。
实施例2
请参阅图2,图2为本发明实施例提供的nvme_io_setup主要流程示意图,其如下所示:
标准的io_setup的主要功能是io_context_t对应内核中一个结构,为异步IO请求提供上下文环境。它通过系统调用创建1个io操作的句柄,为后续的io_submit/io_getevents提供接受请求的目的地。为了兼容libaio接口,nvme_io_setup也需要提供相同的一个接受请求的目的地:nvme_io_ctx_p,其中包括用作接口兼容的io_ctx_t数接口以及用来真正接受IO请求的nvme hardware queue pair相关的信息。主要内容如下:
Struct nvme_io_ctx_t{Io_ctx_t;
Nvme controller;Nvme name space;Nvme hardware queue;
Max_events;//表示最大允许在飞的请求数量
};
nvme_io_setup主要流程请参阅图2:
图2中:
spdk_env_opts_init()处理内存申请分配和NVME PCI环境初始化spdk_env_init初始化NVME控制器
spdk_nvme_probe(NULL,NULL,probe_cb,attach_cb,NULL)开始NVME启动枚举阶段,每一个NVME控制器在被探测到都会调用probe_cb:在其被初始化完成之后,每个NVME控制器会调用attach_cb函数。
主要流程:
得到nvme控制相关的接口
得到该NVME控制器上name space相关的接口;
考虑到在有的NVME控制器上,一个NVME控制器有多个name space,所以这里实现控制器和name space的映射管理;(参考操作对象差异的屏蔽一节)
注册name space;
检查当前nvme接口是否激活。如果激活,就申请nvme queue pair
请参阅图3,图3为本发明实施例提供的nvme_io_submit的实现流程示意图,其如下所示:
根据aio_lio_opcode中记录的读写类型,分别调用spdk_nvme_ns_cmd_write/read。主要流程请参阅图3:
从ioct中获取fd;
根据fd命名规则,找到对应的PCIE控制;
根据fd规则,找到对应的nvme hardware queue;
基于ioctx构造适配spdk原生nvme接口的回调函数的参数;
基于ioctx指定回调函数;
把ioctx及调用nvme原生读写接口的操作发送到spdk thread去执行。
请参阅图4,图4为本发明实施例提供的nvme_io_getevents的实现流程示意图,其如下所示:
Spdk thread的poller会周期地把完成事件收割到,并塞入到完成事件队列。上层业务通过nvme_io_getevents()获取所有已经完成的IO事件,然后根据io event和ioctx的对应关系,解析出业务回调函数及其参数,并执行。主要流程如下:
从event ring中获取已完成IO的event;
根据前述的event和ioctx的对应关系解析出Spdk_io_submit传入的ioctx;
从ioctx中解析出上层业务的回调函数的参数;
执行上层业务的回调函数。
请参阅图5,图5为本发明实施例提供的NVME SSD盘nvme hardwar-e queue pairID的编码格式示意图,其如下所示:
在标准libaio中,通过文件描述符来表示接受IO请求的目的。使用spdk后,没有文件系统和块设备的概念。但libaio中的fd表示接受请求的目的地,同样在封装出的libaio接口中,也可以通过fd来表示接受请求的目的盘的nvme hardware queue pair的ID。
根据图5中的编码按照图6的路由,能够找到对应的hardware queue pair。通过图6的步骤,可以基于spdk nvme原生接口封装成libaio接口。
传统libaio使用用户态内存,而SPDK使用支持DMA的huge page内存。这个可以把申请内存的malloc换成dma_alloc、把释放内存的free换成dma_free去实现。
在一些实施方式中,为了在使用上述的spdk libaio库,可以通过下面两种方式进行:
代码层级替换步骤如下:
替换业务层中open某个块设备为打开某个nvme controller,返回其上的某个或某些nvme quere pair(用fd表示)
替换业务层中close某个块设备为关闭某个nvme controller(可以不需要);
替换io_submit为spkd_io_submit/io_getevents为spdk_io_get-events;
在一些实施方式中,编译器级别替换,这种方法不需要改动代码,只是通过把对应的函数在链接的时候映射成相应的spdk函数:制定映射关系表、实现映射、构造基于映射函数的动态库、在编译器中屏蔽老的链接,让其链向映射的动态库。
在一些实施方式中,修改相关的编译器指令和链接库的过程如下:
屏蔽传统的open/close/malloc/calloc/free函数;主要的选项包括:编译选项:增加下面的选项
-fno-builtin-malloc-fno-builtin-calloc-fno-builtin-realloc-fno-builtin-free
链接接口兼容的库,链接选项:-lunify_libaio。
实施例3
请参阅图7,图7为本发明实施例提供的一种屏蔽接口差异的架构及其系统模块示意图,其如下所示:
接入模块10,用于业务层调用spdk_io_submit接口,内部通过spdk_th-read_send_message把ioctx和提交动作发到后台绑定spdk thread;
执行模块20,用于Spdk thread通过spdk_nvme_ns_cmd_write/read执行IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的io ctx塞入到无锁的完成事件队列event ring;
提交请求模块30,用于NVME controller从hardware提交队列消费新的I-O请求ioctx;
收割完成请求模块40,用于NVME controller把完成的IO请求ioctx放到har-dware completion queue;
触发模块50,用于Spdk thread的poller线程周期地执行spdk_nvme_qpair_process_completions操作,收割完成的IO,把hardware compl-etion queue上的请求消费掉,并触发上面的回调函数的执行。
如图8所示,本申请实施例提供一种电子设备,其包括存储器101,用于存储一个或多个程序;处理器102。当一个或多个程序被处理器102执行时,实现如上述第一方面中任一项的方法。
还包括通信接口103,该存储器101、处理器102和通信接口103相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。存储器101可用于存储软件程序及模块,处理器102通过执行存储在存储器101内的软件程序及模块,从而执行各种功能应用以及数据处理。该通信接口103可用于与其他节点设备进行信令或数据的通信。
其中,存储器101可以是但不限于,随机存取存储器101(Random Access Memory,RAM),只读存储器101(Read Only Memory,ROM),可编程只读存储器101(ProgrammableRead-Only Memory,PROM),可擦除只读存储器101(Erasable Programmable Read-OnlyMemory,EPROM),电可擦除只读存储器101(Electric Erasable Programmable Read-OnlyMemory,EEPROM)等。
处理器102可以是一种集成电路芯片,具有信号处理能力。该处理器102可以是通用处理器102,包括中央处理器102(Central Processing Unit,CPU)、网络处理器102(Network Processor,NP)等;还可以是数字信号处理器102(Digital Signal Processing,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
在本申请所提供的实施例中,应该理解到,所揭露的方法及系统和方法,也可以通过其它的方式实现。以上所描述的方法及系统实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的方法及系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
另一方面,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器102执行时实现如上述第一方面中任一项的方法。所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器101(ROM,Read-Only Memory)、随机存取存储器101(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
综上所述,本申请实施例提供的一种屏蔽接口差异的架构及其方法及系统,通过上面的架构和实现可以看到,本发明提出的基于SPDK原生nvme接口实现的类libaio接口,内部能够屏蔽两种差异,对外能够提供兼容linux原生的libaio接口。通过直接替换相应的函数、链接底层封装后的spdk_libaio库,能够快速地把业务里的原生libaio接口替换成使用用户态NVME接口,减低业务IO延时,并且改动小、周期端、成本低。
以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其它的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
Claims (10)
1.一种屏蔽接口差异的架构及其方法,其特征在于,包括:
业务层调用spdk_io_submit接口,内部通过spdk_thread_send_mess-age把包含业务层回调的ioctx发送到后台绑定的spdk_thread内部的无锁队列(ctx ring);
Spdk thread按照FIFO的顺序获取ctx ring中的请求,通过spdk_nv-me_ns_cmd_write/read执行IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的ioctx塞入到无锁的完成事件队列event ring;
NVME controller从hardware提交队列消费新的IO请求ioctx;
NVME controller把完成的IO请求ioctx放到hardware completion queue;
Spdk thread的poller线程周期地执行spdk_nvme_qpair_process_co-mpletions操作,收割完成的IO,把hardware completion queue上的请求消费掉,并触发上面的回调函数的执行。
2.如权利要求1所述的一种屏蔽接口差异的架构及其方法,其特征在于,还包括:
业务层通过spdk_io_getevents()获取完成的io_events。
3.如权利要求2所述的一种屏蔽接口差异的架构及其方法,其特征在于,还包括:
业务层根据业务场景调用ioctx/ioevent中对应的业务层回调。
4.如权利要求1所述的一种屏蔽接口差异的架构及其方法,其特征在于,所述Spdkthread的poller线程周期地执行spdk_nvme_qpair_p_roc-ess_completions操作,收割完成的IO,把hardware completion queu-e上的请求消费掉,并触发上面的回调函数的执行包括:
根据ioctx中的参数和操作字段构造io_event,并把构造出来的io_e-vent塞到无锁的完成事件队列。
5.如权利要求2所述的一种屏蔽接口差异的架构及其方法,其特征在于,还包括:
spdk_io_getevents()以无锁的方式访问无锁的完成事件队列,按照FIFO的顺序获取io_event,通过上面ioctx和ioevent的对应关系从io_event中反向解析出io_ctx和回调函数,并且执行。
6.如权利要求5所述的一种屏蔽接口差异的架构及其方法,其特征在于,所述反向解析包括:
从io_event的data字段获取ioctx的回调函数;
从Io_event的obj字段获取ioctx;
从Io_event的res字段获取IO完成的返回值;
从Io_event的res2字段获取IO失败时的错误码。
7.如权利要求3所述的一种屏蔽接口差异的架构及其方法,其特征在于,还包括:
如果IO完成的返回值表示失败,不执行回调,返回当时的错误码;
如果IO完成的返回值表示成功,执行回调io_event->data(io_even t->obj)。
8.一种屏蔽接口差异的架构及其系统,其特征在于,包括:
接入模块,用于业务层调用spdk_io_submit接口,内部通过spdk_t hread_send_message把ioctx和提交动作发到后台绑定的spdk_thread;
执行模块,用于Spdk thread通过spdk_nvme_ns_cmd_write/read执行IO请求提交工作,后续对应的回调函数将把已经完成的IO对应的ioct-x塞入到无锁的完成事件队列event ring;
提交请求模块,用于NVME controller从hardware提交队列消费新的IO请求ioctx;
收割完成请求模块,用于NVME controller把完成的IO请求ioctx放到hardwarecompletion queue;
触发模块,用于Spdk thread的poller线程周期地执行spdk_nvme_q-pair_process_completions操作,收割完成的IO,把hardware complet ion queue上的请求消费掉,并触发上面的回调函数的执行。
9.如权利要求8所述的一种屏蔽接口差异的架构及其系统,其特征在于,包括:
用于存储计算机指令的至少一个存储器;
与所述存储器通讯的至少一个处理器,其中当所述至少一个处理器执行所述计算机指令时,所述至少一个处理器使所述系统执行:接入模块、执行模块、提交请求模块、收割完成请求模块以及触发模块。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1-7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111006929.1A CN113721852A (zh) | 2021-08-30 | 2021-08-30 | 一种屏蔽接口差异的架构及其方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111006929.1A CN113721852A (zh) | 2021-08-30 | 2021-08-30 | 一种屏蔽接口差异的架构及其方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113721852A true CN113721852A (zh) | 2021-11-30 |
Family
ID=78679292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111006929.1A Withdrawn CN113721852A (zh) | 2021-08-30 | 2021-08-30 | 一种屏蔽接口差异的架构及其方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113721852A (zh) |
-
2021
- 2021-08-30 CN CN202111006929.1A patent/CN113721852A/zh not_active Withdrawn
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11544120B2 (en) | Tracking application programming interface requests in a cloud computing system | |
JP6739633B2 (ja) | 構成可能論理プラットフォーム | |
CN110601880B (zh) | 一种云平台、业务处理方法、命令接口及计算机设备 | |
US11210131B2 (en) | Method and apparatus for assigning computing task | |
CN110188110B (zh) | 一种构建分布式锁的方法及装置 | |
CN106648569B (zh) | 目标序列化实现方法和装置 | |
CN111343181B (zh) | 报文的处理方法,系统以及数据池和计算机可读存储介质 | |
CN103685292A (zh) | 一种通用的协议转换装置及方法 | |
US11321090B2 (en) | Serializing and/or deserializing programs with serializable state | |
US10289424B2 (en) | System and method for loading and populating system inventory data in an event driven model | |
CN112698888A (zh) | 应用程序的组件化、组件调用和组件初始化方法及其装置 | |
CN113703862A (zh) | 基于配置的接口调用方法、装置、设备及存储介质 | |
CN108804100B (zh) | 创建界面元素的方法、装置、存储介质及移动终端 | |
US20240126567A1 (en) | Data processing system, method, and apparatus | |
CN113391972A (zh) | 一种接口测试方法及装置 | |
CN111258684B (zh) | 一种控制方法和装置 | |
CN113625998A (zh) | 一种请求处理方法和装置 | |
US9064042B2 (en) | Instrumenting computer program code by merging template and target code methods | |
WO2023208012A1 (zh) | 程序处理、运行方法、装置、终端、智能卡及存储介质 | |
US8819494B2 (en) | Automatically changing parts in response to tests | |
CN113721852A (zh) | 一种屏蔽接口差异的架构及其方法及系统 | |
US8041902B2 (en) | Direct memory move of multiple buffers between logical partitions | |
CN114564241B (zh) | 硬件设备的访问方法、装置、计算机设备和存储介质 | |
US10620946B1 (en) | Dynamic modeling for opaque code during static analysis | |
CN112256455A (zh) | 一种优化交易远程过程调用的方法、介质和电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20211130 |
|
WW01 | Invention patent application withdrawn after publication |