公开/公告号CN107704194A
专利类型发明专利
公开/公告日2018-02-16
原文格式PDF
申请/专利权人 北京忆恒创源科技有限公司;
申请/专利号CN201610644949.4
申请日2016-08-08
分类号G06F3/06(20060101);
代理机构11201 北京清亦华知识产权代理事务所(普通合伙);
代理人张大威
地址 100192 北京市海淀区西小口路东升科技园B-2号楼3层302室
入库时间 2023-06-19 04:31:42
法律状态公告日
法律状态信息
法律状态
2020-07-31
授权
授权
2018-03-16
实质审查的生效 IPC(主分类):G06F3/06 申请日:20160808
实质审查的生效
2018-02-16
公开
公开
技术领域
本发明涉及存储系统技术,特别涉及一种存储系统的IO请求处理方法及装置。
背景技术
固态驱动器(SSD,Solid State Drive)采用半导体存储介质制作而成,具有优越的读写性能。然而,尽管SSD驱动器性能很高,但是数据可靠性以及SSD驱动器的成本限制了SSD盘的普及。现有技术中,采用RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)技术保证SSD驱动器数据的可靠性,同时也提高了SSD驱动器的使用效率,从而降低了成本。
但是,RAID技术加长了IO路径,加大了计算开销。为了充分发挥多块SSD驱动器的性能,目前通常采用多核多CPU技术。只要尽可能让各个CPU并发处理IO请请求,就有可能达到数据保护和高性能的目标。可是同一个RAID Array(阵列)上对于同一个条带的读请求、写请求,还有重构请求之间有关联,而且与RAID Array的某些管理控制请求有依赖,即对于共享资源需要进行同步和互斥访问。
目前,并没有统一的方法来解决RAID Array(阵列)上相关请求之间的同步与互斥。大多数的实现都是为每个RAID Array(阵列)创建一个独立的线程,专门处理这个阵列相关的管理控制请求,以及读请求、写请求和重构请求。然而,当RAID系统在一个SSD驱动器组成的资源池中创建成千上万个RAID Array(阵列)时,如果采用这种方法将会创建成千上万个线程,导致内存开销巨大。而且,线程调度和切换的开销会导致CPU效率急剧下降。
发明内容
本发明旨在至少在一定程度上解决上述相关技术中的技术问题。
根据本发明的第一方面,提供了根据本发明第一方面的存储系统的IO请求处理方法,所述存储系统包括多个虚拟存储盘,虚拟存储盘包括多个逻辑地址区域,所述方法包括:接收第一IO请求,其中,所述第一IO请求访问第一逻辑地址区域;根据第一逻辑地址区域确定第一线程,使第一线程处理所述第一IO请求。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第二存储系统的IO请求处理方法,所述多个逻辑地址区域的逻辑地址互不交叠,所述方法还包括:接收第二IO请求,其中所述第二IO请求访问第二逻辑地址区域;根据第二逻辑地址区域确定第二线程,使第二线程处理所述第二IO请求。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第三在存储系统的IO请求处理方法,所述根据第一逻辑地址区域确定第一线程,使第一线程处理所述第一IO请求包括:根据第一IO请求生成第一IO命令,并根据第一逻辑地址区域,将第一IO命令填充到与第一线程对应的第一队列,第一线程从第一队列中取出并处理第一IO命令,其中第一线程仅处理第一队列的命令。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第四在存储系统的IO请求处理方法,根据第二逻辑地址区域确定第二线程,使第二线程处理所述第二IO请求包括:根据第二IO请求生成第二IO命令,并根据第二逻辑地址区域,将第二IO命令填充到与第二线程对应的第二队列,第二线程从第二队列中取出并处理第二IO命令,其中第二线程仅处理第二队列的命令。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第五在存储系统的IO请求处理方法,还包括:将第一逻辑地址区域的索引对线程的数量取模的结果为第一线程的索引;或者将第二逻辑地址区域的索引对线程的数量取模的结果为第二线程的索引。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第六在存储系统的IO请求处理方法,还包括:对第一逻辑地址区域的索引计算散列,得到第一线程的索引;或者对第二逻辑地址区域的索引计算散列,得到第二线程的索引。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第七在存储系统的IO请求处理方法,还包括:将第一逻辑地址区域的索引对线程的数量取模的结果为第一队列的索引;或者将第二逻辑地址区域的索引对线程的数量取模的结果为第二队列的索引。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第八在存储系统的IO请求处理方法,还包括:对第一逻辑地址区域的索引计算散列,得到第一队列的索引;或者对第二逻辑地址区域的索引计算散列,得到第二队列的索引。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第九在存储系统的IO请求处理方法,还包括:根据第一逻辑地址区域确定第一映射表表项;所述第一线程访问第一映射表表项,根据第一IO请求访问的第一逻辑地址从第一映射表表项中获取第一存储对象,并访问所述第一存储对象来处理所述第一IO请求。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第十在存储系统的IO请求处理方法,还包括:根据第二逻辑地址区域确定第二映射表表项;所述第二线程访问第二映射表表项,根据第二IO请求访问的第二逻辑地址从第二映射表表项中获取第二存储对象,并访问所述第二存储对象来处理所述第二IO请求。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第十一在存储系统的IO请求处理方法,还包括:将第一逻辑地址区域的索引对映射表表项的数量取模的结果为第一映射表表项的索引;或者对第一逻辑地址区域的索引计算散列,得到第一映射表表项的索引。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第十二在存储系统的IO请求处理方法,还包括:将第二逻辑地址区域的索引对映射表表项的数量取模的结果为第二映射表表项的索引;或者对第二逻辑地址区域的索引计算散列,得到第二映射表表项的索引。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第十三在存储系统的IO请求处理方法,还包括:若从第一映射表表项中无法获得存储对象,对于IO请求中的写请求,创建第三存储对象,并在第一映射表项中记录第三存储对象,以及向第三存储对象写入数据。
根据本发明的第一方面的存储系统的IO请求处理方法,提供了根据本发明第一方面的第十四在存储系统的IO请求处理方法,还包括:若从第二映射表表项中无法获得存储对象,对于IO请求中的写请求,创建第四存储对象,并在第二映射表项中记录第四存储对象,以及向第四存储对象写入数据。
根据本发明的第二方面,提供了根据本发明第二方面的存储系统的IO请求处理方法,所述存储系统包括多个虚拟存储盘,虚拟存储盘包括多个逻辑地址区域,所述方法包括:接收第一IO请求;根据第一IO请求生成第一IO命令与第二IO命令,其中第一IO命令访问第一逻辑地址区域,而第二IO命令访问第二逻辑地址区域;根据第一逻辑地址区域确定第一线程,使第一线程处理所述第一IO命令;以及根据第二逻辑地址区域确定第二线程,使第二线程处理所述第二IO命令。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第二在存储系统的IO请求处理方法,还包括:根据第一逻辑地址区域,将第一IO命令填充到与第一线程对应的第一队列,第一线程从第一队列中取出并处理第一IO命令,其中第一线程仅处理第一队列的命令;以及并根据第二逻辑地址区域,将第二IO命令填充到与第二线程对应的第二队列,第二线程从第二队列中取出并处理第二IO命令,其中第二线程仅处理第二队列的命令。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第三在存储系统的IO请求处理方法,还包括:根据第一逻辑地址区域确定第一映射表表项;所述第一线程访问第一映射表表项,根据第一IO命令访问的第一逻辑地址从第一映射表表项中获取第一存储对象,并访问所述第一存储对象来处理所述第一IO命令。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第四在存储系统的IO请求处理方法,还包括:根据第二逻辑地址区域确定第二映射表表项;所述第二线程访问第二映射表表项,根据第二IO命令访问的第二逻辑地址从第二映射表表项中获取第二存储对象,并访问所述第二存储对象来处理所述第二IO命令。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第五在存储系统的IO请求处理方法,还包括:将第一逻辑地址区域的索引对映射表表项的数量取模的结果为第一映射表表项的索引;或者对第一逻辑地址区域的索引计算散列,得到第一映射表表项的索引。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第六在存储系统的IO请求处理方法,还包括:将第二逻辑地址区域的索引对映射表表项的数量取模的结果为第二映射表表项的索引;或者对第二逻辑地址区域的索引计算散列,得到第二映射表表项的索引。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第七在存储系统的IO请求处理方法,其中,对于IO请求中的写请求,创建第三存储对象,并在第一映射表项中记录第三存储对象,以及向第三存储对象写入数据。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第八在存储系统的IO请求处理方法,其中,对于IO请求中的写请求,创建第四存储对象,并在第二映射表项中记录第四存储对象,以及向第四存储对象写入数据。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第九在存储系统的IO请求处理方法,其中,映射表项的数量是处理IO命令的线程的数量的整数倍。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第十在存储系统的IO请求处理方法,还包括:若从第一映射表表项中无法获得存储对象,对于IO请求中的读请求,返回指示读请求异常的结果。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第十一在存储系统的IO请求处理方法,还包括:若从第二映射表表项中无法获得存储对象,对于IO请求中的读请求,返回指示读请求异常的结果。
根据本发明的第二方面的存储系统的IO请求处理方法,提供了根据本发明第二方面的第十二在存储系统的IO请求处理方法,其中,所述第一线程仅由第一CPU执行,而所述第二线程仅由第二CPU执行。
根据本发明的第三方面,提供了根据本发明第三方面的存储系统的IO请求处理装置,所述存储系统包括多个虚拟存储盘,虚拟存储盘包括多个逻辑地址区域,所述装置包括:第一接收模块,用于接收第一IO请求,其中,所述第一IO请求访问第一逻辑地址区域;第一处理模块,用于根据第一逻辑地址区域确定第一线程,使第一线程处理所述第一IO请求。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第二存储系统的IO请求处理装置,所述多个逻辑地址区域的逻辑地址互不交叠,所述第一接收模块还用于接收第二IO请求,其中所述第二IO请求访问第二逻辑地址区域;所述第一处理模块还用于根据第二逻辑地址区域确定第二线程,使第二线程处理所述第二IO请求。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第三存储系统的IO请求处理装置,所述第一处理模块用于根据第一IO请求生成第一IO命令,并根据第一逻辑地址区域,将第一IO命令填充到与第一线程对应的第一队列,第一线程从第一队列中取出并处理第一IO命令,其中第一线程仅处理第一队列的命令。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第四存储系统的IO请求处理装置,所述第一处理模块用于根据第二IO请求生成第二IO命令,并根据第二逻辑地址区域,将第二IO命令填充到与第二线程对应的第二队列,第二线程从第二队列中取出并处理第二IO命令,其中第二线程仅处理第二队列的命令。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第五存储系统的IO请求处理装置,还包括:第一索引计算模块,用于将第一逻辑地址区域的索引对线程的数量取模的结果为第一线程的索引;或者将第二逻辑地址区域的索引对线程的数量取模的结果为第二线程的索引。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第六存储系统的IO请求处理装置,还包括:第二索引计算模块,用于对第一逻辑地址区域的索引计算散列,得到第一线程的索引;或者对第二逻辑地址区域的索引计算散列,得到第二线程的索引。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第七存储系统的IO请求处理装置,还包括:第三索引计算模块,用于将第一逻辑地址区域的索引对线程的数量取模的结果为第一队列的索引;或者将第二逻辑地址区域的索引对线程的数量取模的结果为第二队列的索引。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第八存储系统的IO请求处理装置,还包括:第四索引计算模块,用于对第一逻辑地址区域的索引计算散列,得到第一队列的索引;或者对第二逻辑地址区域的索引计算散列,得到第二队列的索引。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第九存储系统的IO请求处理装置,还包括:第一映射表确定模块,用于根据第一逻辑地址区域确定第一映射表表项;所述第一处理模块还用于通过所述第一线程访问第一映射表表项,根据第一IO请求访问的第一逻辑地址从第一映射表表项中获取第一存储对象,并访问所述第一存储对象来处理所述第一IO请求。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第十存储系统的IO请求处理装置,还包括:第二映射表确定模块,用于根据第二逻辑地址区域确定第二映射表表项;所述第一处理模块还用于通过所述第二线程访问第二映射表表项,根据第二IO请求访问的第二逻辑地址从第二映射表表项中获取第二存储对象,并访问所述第二存储对象来处理所述第二IO请求。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第十一存储系统的IO请求处理装置,还包括:第五索引计算模块,用于将第一逻辑地址区域的索引对映射表表项的数量取模的结果为第一映射表表项的索引;或者对第一逻辑地址区域的索引计算散列,得到第一映射表表项的索引。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第十二存储系统的IO请求处理装置,还包括:第六索引计算模块,用于将第二逻辑地址区域的索引对映射表表项的数量取模的结果为第二映射表表项的索引;或者对第二逻辑地址区域的索引计算散列,得到第二映射表表项的索引。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第十三存储系统的IO请求处理装置,所述第一处理模块还用于在从第一映射表表项中无法获得存储对象时,对于IO请求中的写请求,创建第三存储对象,并在第一映射表项中记录第三存储对象,以及向第三存储对象写入数据。
根据本发明的第三方面的存储系统的IO请求处理装置,提供了根据本发明第三方面的第十四存储系统的IO请求处理装置,所述第一处理模块还用于在从第二映射表表项中无法获得存储对象时,对于IO请求中的写请求,创建第四存储对象,并在第二映射表项中记录第四存储对象,以及向第四存储对象写入数据。
根据本发明的第四方面,提供了根据本发明第四方面的存储系统的IO请求处理装置,所述存储系统包括多个虚拟存储盘,虚拟存储盘包括多个逻辑地址区域,所述装置包括:第二接收模块,用于接收第一IO请求;第二处理模块,用于根据第一IO请求生成第一IO命令与第二IO命令,其中第一IO命令访问第一逻辑地址区域,而第二IO命令访问第二逻辑地址区域,并根据第一逻辑地址区域确定第一线程,使第一线程处理所述第一IO命令;以及根据第二逻辑地址区域确定第二线程,使第二线程处理所述第二IO命令。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第二存储系统的IO请求处理装置,所述第二处理模块用于根据第一逻辑地址区域,将第一IO命令填充到与第一线程对应的第一队列,第一线程从第一队列中取出并处理第一IO命令,其中第一线程仅处理第一队列的命令,以及并根据第二逻辑地址区域,将第二IO命令填充到与第二线程对应的第二队列,第二线程从第二队列中取出并处理第二IO命令,其中第二线程仅处理第二队列的命令。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第三存储系统的IO请求处理装置,还包括:第三映射模块,用于根据第一逻辑地址区域确定第一映射表表项;所述第二处理模块还用于通过所述第一线程访问第一映射表表项,根据第一IO命令访问的第一逻辑地址从第一映射表表项中获取第一存储对象,并访问所述第一存储对象来处理所述第一IO命令。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第四存储系统的IO请求处理装置,还包括:第四映射模块,用于根据第二逻辑地址区域确定第二映射表表项;所述第二处理模块还用于通过所述第二线程访问第二映射表表项,根据第二IO命令访问的第二逻辑地址从第二映射表表项中获取第二存储对象,并访问所述第二存储对象来处理所述第二IO命令。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第五存储系统的IO请求处理装置,还包括:第七索引计算模块,用于将第一逻辑地址区域的索引对映射表表项的数量取模的结果为第一映射表表项的索引;或者对第一逻辑地址区域的索引计算散列,得到第一映射表表项的索引。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第六存储系统的IO请求处理装置,还包括:第八索引计算模块,用于将第二逻辑地址区域的索引对映射表表项的数量取模的结果为第二映射表表项的索引;或者对第二逻辑地址区域的索引计算散列,得到第二映射表表项的索引。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第七存储系统的IO请求处理装置,其中,对于IO请求中的写请求,创建第三存储对象,并在第一映射表项中记录第三存储对象,以及向第三存储对象写入数据。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第八存储系统的IO请求处理装置,其中,对于IO请求中的写请求,创建第四存储对象,并在第二映射表项中记录第四存储对象,以及向第四存储对象写入数据。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第九存储系统的IO请求处理装置,其中,映射表项的数量是处理IO命令的线程的数量的整数倍。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第十存储系统的IO请求处理装置,还包括:所述第二处理模块还用于若从第一映射表表项中无法获得存储对象,对于IO请求中的读请求,返回指示读请求异常的结果。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第十一存储系统的IO请求处理装置,还包括:所述第二处理模块还用于若从第二映射表表项中无法获得存储对象,对于IO请求中的读请求,返回指示读请求异常的结果。
根据本发明的第四方面的存储系统的IO请求处理装置,提供了根据本发明第四方面的第十二存储系统的IO请求处理装置,其中,所述第一线程仅由第一CPU执行,而所述第二线程仅由第二CPU执行。
根据本发明的第五方面,提供一种包含计算机程序代码的计算机程序,当被载入计算机系统并在计算机系统上执行时,所述计算机程序代码使所述计算机系统执行根据本发明第一方面至第二方面提供的存储系统的IO请求处理方法。
根据本发明的第六方面,提供一种包括程序代码的程序,当被载入存储系统并在存储系统上执行时,所述计程序代码使所述存储系统执行根据本发明第一方面至第二方面提供的存储系统的IO请求处理方法。
本发明的实施例,将虚拟存储盘的逻辑地址空间划分为互不交叠的多个区域,对一个区域的IO请求,由相对应的一个线程处理。避免两个线程处理同一个区域的IO请求。本发明的实施例具有以下优势:在保证数据可靠性的前提下,能够让各个CPU完全并发,充分发挥固态硬盘的高性能;确保系统性能的线性可扩展;可以根据性能需求和对CPU、内存等资源的使用要求进行动态配置。
本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:
图1示出了根据本发明实施例的存储系统的架构;
图2示出了根据本发明实施例的存储对象的结构;
图3示出了根据本发明又一实施例的存储对象的结构;
图4是根据本发明实施例的无锁IO请求处理模型的示意图;
图5是根据本发明实施例的虚拟存储盘的逻辑地址空间与存储对象的映射的示意图;
图6是根据本发明另一实施例的虚拟存储盘的逻辑地址空间与存储对象的映射的示意图;
图7是根据本发明实施例的虚拟存储盘的逻辑地址区域示意图;
图8是根据本发明另一个实施例的虚拟存储盘的逻辑地址区域示意图;
图9是根据本发明实施例的存储系统的IO请求处理的流程图;
图10是根据本发明实施例的将IO请求分发到IO处理线程的流程图;以及
图11是根据本发明实施例的IO处理线程处理IO请求的流程图。
具体实施方式
下面详细描述本发明的实施例,实施例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
图1示出了根据本发明实施例的存储系统的架构。根据本发明的存储系统包括计算机或服务器(统称为主机)以及耦合到主机的多个存储设备(例如,驱动器)。优选地,驱动器是固态驱动器(SSD)。可选地,根据本发明的实施例中也可以包括磁盘驱动器。
通过存储资源池来维护各个驱动器提供的存储资源。存储资源池中记录了各个驱动器中的数据块或数据大块(Chunk,简称大块)。作为举例,数据大块是预定大小的驱动器中逻辑空间或物理空间连续的多个数据块。数据大块的大小,作为举例,可以是数百KB(千字节)或MB(兆字节)。可选地,存储资源中记录的是各个驱动器中尚未分配给存储对象的数据块或数据大块,这些数据块或数据大块又被称为空闲数据块或空闲数据大块。存储资源池也是一种虚拟化技术,将来自物理驱动器的存储资源虚拟化为数据块或数据大块以供上层访问或使用。在存储系统中,存储资源池可以有多个,而在图1的例子中,仅展示了单一的存储资源池。
在资源分配层为存储对象层分配存储对象,存储对象包括多个大块。分配器分配存储资源池中的大块来创建存储对象。根据本发明实施例中提供的存储对象,代表存储系统的部分存储空间。存储对象是带有RAID功能的存储单元,后面会结合图2详细描述存储对象结构。在存储对象层提供多个存储对象。存储对象可以被创建和销毁。一个存储对象被创建时,通过分配器从存储资源池中获取所需数量的大块,这些大块组成存储对象。一个大块在同一时刻可以仅属于一个存储对象。已经被分配给存储对象的大块不会再被分配给其他存储对象。存储对象被销毁时,构成该存储对象的大块被释放回存储资源池,并可被再次分配给其他存储对象。
存储系统包括多个虚拟存储盘。虚拟存储盘对应用程序提供访问接口,并对外提供服务。虚拟存储盘由若干个存储对象构成,应用程序可以根据需要创建多个不同属性的虚拟存储盘。虚拟存储盘提供逻辑地址空间,逻辑地址空间包括多个逻辑地址区域。
图2示出了根据本发明实施例的存储对象的结构。存储对象包括多个数据块或数据大块。在图2的例子中,存储对象包括大块220、大块222、大块224以及大块226。构成存储对象的大块来自不同的驱动器。每个驱动器向一个存储对象提供至多一个大块。参看图2,大块220来自驱动器210,大块222来自驱动器212,大块224来自驱动器214以及大块226来自驱动器216。从而,当单一驱动器发生故障时,存储对象中的一个或少数大块无法访问。通过存储对象的其他大块,能够重建存储对象的数据,以满足数据可靠性的要求。
通过RAID技术为存储对象提供数据保护,并提供存储对象的高性能访问。参看图2,存储对象包括多个RAID条带(条带230、条带232……条带238),每个条带由来自不同大块的存储空间组成。同一条带的来自不同大块的存储空间可具有相同或不同的地址范围。条带是存储对象的最小写入单位,从而通过向多驱动器并行写入数据来提升性能。存储对象的读操作没有大小限制。在条带中实现RAID技术。构成条带230的来自4个大块的存储空间中,3个存储空间用于存储用户数据,而另1个存储空间用于存储校验数据,使得在条带230上提供诸如RAID 5级别的数据保护。
可选地,每个大块中还存储元数据。在图2的例子中,大块220-大块226的每个上都保存相同的元数据,从而保证了元数据的可靠性,即使属于同一存储对象的部分大块发生故障,从其他大块中依然能获取元数据。元数据用于记录大块所属的存储对象、大块所在存储对象的数据保护级别(RAID级别)、大块的擦写次数等信息。
图3示出了根据本发明又一实施例的存储对象的结构。多当用户第一次写存储空间的某个逻辑地址时,为这片逻辑地址区域创建存储对象,这时发生一次资源分配以创建存储对象,并将所创建的存储对象与存储空间的逻辑地址区域相关联。存储系统中包括多个驱动器(参见图3,驱动器0、驱动器1、驱动器2与驱动器3),驱动器的存储空间切分成固定大小的存储资源,称为大块。若干大块通过RAID算法组织形成一个数据保护单元,称为存储对象。参看图3,驱动器0提供大块0、大块i……,驱动器1提供大块1、大块j……,驱动器2提供大块2、大块k……,驱动器3提供大块3、大块t……在图3所示的实施例中展示了2个存储对象,由驱动器0、驱动器1、驱动器2的每个提供1个大块(大块0、大块1与大块2)构成存储对象m,而由驱动器1、驱动器2与驱动器3的每个提供1个大块(大块j、大块k与大块t)构成存储对象n。
作为举例,在图3的实施例中,大块的存储容量为MB(Megabyte,兆字节)级别,而驱动器的存储容量为TB(Terabyte,千吉字节)级别。从而在存储系统中存储对象的创建是频繁发生的,通过控制存储对象的创建过程可以有效控制存储资源的使用并实现全局磨损均衡与逆均衡。
在根据本发明的实施例中,在创建存储对象时,可以基于驱动器的权重从多个驱动器中随机挑选为存储对象提供大块的驱动器,从而保证对驱动器资源的均衡使用,来实现全局磨损均衡。
图4是根据本发明实施例的无锁IO请求处理模型的示意图。如图4所示,应用程序访问虚拟存储盘。根据用户的配置为存储资源池创建若干个IO处理线程(IO Handler),这些IO处理线程可以在多个CPU上完全并发地运行。对于来自虚拟存储盘的不同IO请求,根据IO请求的参数,将IO请求分发到特定的IO处理线程进行处理。作为举例,依据IO请求的类型(读请求或写请求)和/或IO请求访问的逻辑地址将IO请求分发到不同的IO处理线程。
IO处理线程负责处理IO请求,例如应用的读写请求和/或存储系统内部的数据重构请求。IO处理线程的主要工作包括:IO请求之间的互斥与同步,RAID编码与解码,将IO请求分发给下层固态驱动器,以及对返回请求的回掉处理。IO处理线程可以是线程、进程或其他在CPU上执行的代码段。在图4的例子中,每个IO处理线程与一个CPU或CPU核绑定。CPU或CPU核专用于执行与其绑定的IO处理线程,减少了因线程切换引入的额外开销。
图5是根据本发明实施例的虚拟存储盘的逻辑地址空间与存储对象的映射的示意图。图5中,“Ct#K”指示编号为K的存储对象。虚拟存储盘0的逻辑地址空间为从“LBA#0”到“LBA#N”。“LBA#0”指示逻辑地址空间的起始地址0,而“LBA#N”指示逻辑地址空间的最大地址N。如图5所示,虚拟存储盘0的逻辑地址空间中,由阴影所指示的是未映射的逻辑地址部分,而非阴影部分是已经映射了存储对象的逻辑地址部分。将虚拟存储盘的逻辑地址部分映射给存储对象,使得对该逻辑地址部分的访问由被映射的存储对象来承载。例如,在图5中,当访问虚拟存储盘0被映射给存储对象Ct#0的逻辑地址部分时,通过访问存储对象Ct#0来完成该访问。因而,最初,虚拟存储盘0的逻辑地址都是未映射区域。当首次向逻辑地址写入数据时,分配存储对象,并将被写入的逻辑地址映射到存储对象。被映射了存储对象的逻辑地址属于已映射区域。在读取逻辑地址时,查找该逻辑地址上被映射的存储对象,通过访问该存储对象来获得要读取的数据。进一步地,每个逻辑地址部分至多被映射给一个存储对象。
图6是根据本发明另一实施例的虚拟存储盘的逻辑地址空间与存储对象的映射的示意图。在图6中,存储对象具有不同的大小,因而不同的存储对象被映射给不同数量的逻辑地址。作为比较,在图5中,存储对象具有相同的大小。
如图6所示,虚拟存储盘1的某些逻辑地址被映射到大小不一的存储对象,而有一些逻辑地址尚未被映射到存储对象。当对虚拟存储盘1的某个逻辑地址进行写操作时,会首先检测该逻辑地址是否已被映射到存储对象。如果该逻辑地址已映射到存储对象(例如存储对象Ct#2),直接对存储对象Ct#2进行写操作;如果没有存储对象被映射到该逻辑地址,会创建一个存储对象,并把该存储对象添加到虚拟存储盘1的地址空间映射管理系统,然后再继续执行写操作。
图7是根据本发明实施例的虚拟存储盘的逻辑地址区域示意图。如图7所示,将虚拟存储盘0的逻辑地址空间划分为连续的大小相等的逻辑地址区域。由“Re#n”指示编号为n的逻辑地址区域。在根据本发明的实施例中,在处理IO请求时,依据IO请求所访问的逻辑地址区域,将IO请求分发给不同的IO处理线程进行处理。在每个逻辑地址区域中,可以对应一个或多个存储对象。各个逻辑地址区域所对应的逻辑地址互不交叠。
虚拟存储盘的多个逻辑地址区域是固定大小的。而存储对象的大小可以是定长的,也可以是变长的。图8是根据本发明另一实施例的虚拟存储盘的逻辑地址区域示意图。如图8所示,存储对象具有不同的大小,虚拟存储盘的地址空间将被划分为若干个大小相等的逻辑地址区域,每个逻辑地址区域对应一个或多个存储对象。例如,参看图8,逻辑地址区域Re#0中包括存储对象Ct#1与Ct#2,逻辑地址区域Re#1对应的逻辑地址尚未被分配存储对象,逻辑地址区域Re#3对应的部分逻辑地址被分配了存储对象Ct#K,而另一部分逻辑地址尚未被分配存储对象。
图9是根据本发明实施例的存储系统的IO请求处理的流程图。通过将访问不同逻辑地址区域的IO请求分配给不同的IO处理线程处理,实现了多个线程同时处理。由于每个线程处理不同逻辑地址区域的IO请求,这些读写请求之间不存在访问相关性,所以这些多个线程互相没有影响,可以并行处理。
参看图9,为对存储系统的IO请求进行处理,接收第一IO请求,其中,第一IO请求访问第一逻辑地址区域(910)。根据第一逻辑地址区域确定第一线程,使第一线程处理第一IO请求(920)。
作为举例,第一逻辑地址区域是图7的由“Re#0”所指示的逻辑地址区域。第一线程可以是例如图4中示出的绑定在CPU 1上的IO处理线程(T1)。
例如:将对区域“Re#0”(参看图7)的IO请求,指派给线程T1处理,而将对区域“Re#2”(参看图7)的IO请求,指派给线程T2处理。线程T2是绑定到CPU2的IO处理线程(参看图4)。从而对于虚拟存储盘的地址空间的不同逻辑区域的读写请求,可由不同的线程同时处理。
所属领域技术人员将意识到,有多种从逻辑地址区域R映射到线程的T的方式。例如利用逻辑地址区域的编号对所创建的IO处理线程的数量取模,所得的结果就是对应IO处理线程的索引,由该索引所指示的IO处理线程来处理对编号的逻辑地址区域的IO请求进行处理。在另一个例子中,对逻辑地址区域R的编号计算散列,得到的散列结果作为对IO处理线程的索引。
提供存储对象映射表来维护虚拟存储盘的地址到存储对象的映射。为每个虚拟存储盘提供存储对象映射表,存储对象映射表是整个虚拟存储盘的共享资源,在根据本发明的实施例中,使多个IO Handler可以并发且无锁地访问存储对象映射表。
存储对象映射表由若干个映射表条目组成,每个映射表条目是一棵红黑树,红黑树的节点存储了存储对象起始逻辑地址与该存储对象的对应关系。因而每个映射表条目中记录了多个“<存储对象起始逻辑地址,存储对象>”。将存储对象放入哪个映射表条目,可由该存储对象所在的逻辑地址区域编号对映射表条目的数量取模得到。
在根据本发明的实施例中,对逻辑地址区域R1的IO请求,由IO处理线程T1处理;而记录逻辑地址区域R1的逻辑地址与存储对象的映射关系的映射表条目(称为,M1)也由IO处理线程T1处理。同时,对逻辑地址区域R2的IO请求,由IO处理线程T2处理;而记录逻辑地址区域R2的逻辑地址与存储对象的映射关系的映射表条目(称为,M2)也由IO处理线程T2处理。从而IO处理线程T1与IO处理线程T2处理访问不同逻辑地址区域的IO请求,并访问不同的映射表条目。以此方式,多个IO处理线程并发地处理各自的任务,也无需使用锁来在多个IO处理线程之间进行同步。
作为一个例子,为存储系统的一个存储资源池,提供io_handler_num个IO处理线程,虚拟存储盘0的存储对象映射表有map_entry_num个映射表表项。对于索引号是region_index的逻辑地址区域:该逻辑地址区域所属IO处理线程由编号ioh_index指示,而ioh_index=region_index%io_handler_num;该逻辑地址区域所属的映射表条目由索引map_entry指示,其中map_index=region_index%map_entry_num;该逻辑地址区域所属的映射表条目,由编号为map_ioh_index的IO处理线程访问,其中map_ioh_index=map_index%io_handler_num。
进一步地,使map_entry_num能够被io_handler_num整除,来确保对于一IO请求,其相对应的ioh_index等于map_ioh_index。
因此,对于一个虚拟存储盘,将与其相对应的映射表条目的数量设置为分配给存储资源池的IO处理线程数量的整数倍,以此来保证每个IO处理线程是某些映射表条目的唯一访问者。在此情况下,多个IO处理线程访问存储对象映射表时,无需使用锁来同步彼此的操作,从而实现无锁设计。
在另一个例子中,将虚拟存储盘1的逻辑地址空间划分为12个区域,由3个IO处理线程服务为虚拟存储盘1提供资源的存储资源池,虚拟存储盘的存储对象映射表包括6个映射表条目。将前4个逻辑地址区域(编号为0/1/2/3)的逻辑地址区域与前2个映射表条目(索引为0/1)分配到线程T0,将中间4个逻辑地址区域(编号为4/5/6/7)与索引为2/3的映射表条目分配到IO处理线程T1,将最后4个逻辑地址区域与索引为5/6的映射表条目分配到IO处理线程T2。从而避免两个或多个IO处理线程访问相同的映射表条目,也避免两个或多个IO处理线程访问相同的逻辑地址区域。
一个存储资源池可支持多个虚拟存储盘。在根据本发明的实施例中,为存储资源池提供IO处理线程。用于同一存储资源池的IO处理线程,可在该存储资源池支持的多个虚拟存储盘间共享。使得一个IO处理线程,处理访问不同虚拟存储盘的IO请求。进一步地,在存储系统中可提供多个存储资源池。
优选地,为存储系统或存储资源池提供的IO处理线程的数量可以调整,但不多于存储系统中的CPU或CPU核的数量。
对虚拟存储盘IO请求的处理可以分为两阶段:第一阶段是接收IO请求并分发到对应的IO处理线程;第二阶段是IO处理线程对IO请求进行处理并发送给存储设备或存储设备的驱动程序。下面将分别进行阐述。图10是根据本发明实施例的将IO请求分发到IO处理线程的流程图,其对应于上述第一阶段;以及图11是根据本发明实施例的IO处理线程处理IO请求的流程图,对应于上述第二阶段。
如图10所示,用户访问虚拟存储盘,从而接收到IO请求(1010),根据IO请求的逻辑地址判断该IO请求是否跨越多个逻辑地址区域(1020)。可通过IO请求访问的起始逻辑地址与访问长度确定是否跨越多个逻辑地址区域。如果该IO请求仅访问一个逻辑地址区域,创建一个IO命令(1030)。对该IO命令的响应能够作为对该IO请求的响应。以及计算该IO命令所访问的逻辑地址区域的编号。例如,依据该IO请求访问的起始逻辑地址确定其所访问的逻辑地址区域的编号。如果该IO请求访问的逻辑地址范围跨越了多个逻辑地址区域,为该IO请求创建多个IO命令,该IO请求访问的每个逻辑地址区域对应一个IO命令(1040)。例如,IO请求访问逻辑地址区域Re#2与逻辑地址区域Re#3(参看图7),为逻辑地址区域Re#2生成IO命令C1,为逻辑地址区域生成IO命令C2,对IO命令C1与IO命令C2的响应能够组合为对IO请求的响应。
根据IO命令对应的逻辑地址区域编号,确定处理IO命令的IO处理线程,将IO命令分发到IO处理线程的命令队列(1050)。在根据本发明的实施例中,为每个IO处理线程提供命令队列。在命令队列的条目中容纳IO命令。IO处理线程从其命令队列中取出IO命令进行处理。在步骤1050,作为举例,对IO命令对应的逻辑地址区域编号进行哈希,或者通过逻辑地址区域编号对IO处理线程数量取模,得到处理该IO命令的IO处理线程的索引,依据索引获取该IO处理线程,并将IO命令填充到该IO处理线程的命令队列中。作为另一个例子,对IO命令对应的逻辑地址区域编号进行哈希,或者通过逻辑地址区域编号对IO处理线程数量取模,得到处理该IO命令的IO处理线程的索引,依据该索引直接获取命令队列,并将该IO命令插入该命令队列。
第二阶段,IO处理线程对IO命令进行处理,并发送给存储设备或存储设备的驱动程序。如图11所示,IO处理线程从其命令队列中取出IO命令(1110)。依据IO命令的逻辑地址,查找存储对象映射表,确定与该逻辑地址相对应的存储对象是否存在(1120)。若存储对象映射表指示被处理的IO命令所访问的逻辑地址已被映射到存储对象,则访问该存储对象,并依据IO命令对存储对象进行读取或写入(1150)。IO处理线程查找存储对象映射表时,依据IO命令所访问的逻辑地址区域编号,确定要访问的映射表表项,并查找IO命令的逻辑地址被映射到的存储对象。在根据本发明的实施例中,两个IO处理线程不会访问相同的映射表表项,从而IO处理线程访问存储对象映射表时,无需对存储对象映射表加锁,提升了处理效率。
若存储对象映射表指示被处理的IO命令所访问的逻辑地址尚未被映射到存储对象,进一步确定IO命令是读命令还是写命令(1130)。若IO命令是读命令,而读取尚未被分配存储对象的逻辑地址是非法的,此时以指定值作为对IO命令的响应(1160)。例如,为该IO命令返回全0的结果,或者在返回值中指示该IO命令访问了非法或尚未被分配的逻辑地址。若IO命令是写命令,而在写入尚未被分配存储对象的逻辑地址时,首先创建存储对象,并将所创建的存储对象插入存储对象映射表,以在存储对象映射表的表项中记录该逻辑地址与所创建的存储对象的映射关系(1140),进而访问存储对象,依据IO命令向所创建的存储对象写入数据(1150)。
显然,所属领域技术人员将意识到,图11中所展示的步骤可按其他顺序执行。例如,IO处理线程从命令队列中取出IO命令后,可首先检查IO命令是读取命令还是写入命令,再检查IO命令的逻辑地址是否被分配存储对象。对于读命令,若IO命令的逻辑地址已被分配存储对象,则从存储对象中取出数据;若IO命令的逻辑地址未分配存储对象,则以预定值作为读取结果,或者指示读取的是非法地址。对于写命令,若IO命令的逻辑地址已被分配存储对象,则向存储对象写入数据;若IO命令的逻辑地址未分配存储对象,则分配新存储对象,将逻辑地址与新分配的存储对象建立映射关系,并向新分配的寸处对象写入数据作为对IO命令的响应。
综上所述,在本发明的实施例中,将虚拟存储盘的逻辑地址空间划分为互不交叠的多个逻辑地址区域,对一个逻辑地址区域的IO请求,由相对应的一个线程处理。避免两个线程处理同一个逻辑地址区域的IO请求。进一步地,避免两个线程同时访问一个映射表条目。从而线程之间的资源访问没有冲突,不必使用锁或其他机制来同步线程之间的临界资源,简化了处理过程,提升了线程间的并行性。
对于包括多块固态驱动器的存储系统,采用本发明所提出的无锁IO处理新方法,可以在保证数据可靠性的同时,利用多CPU核/多CPU并发处理的特性,能够充分发挥多块固态驱动器的高性能。并且可以做到性能相对于CPU核/CPU数量性能线性可扩展,从而达到客户对于数据可靠性和性能的需求。还可以根据性能需求和对CPU、内存等资源的使用要求进行动态配置。
需要注意的是,本发明的实施例不能保证存储对象内部同一个条带上的多个IO请求之间不存在冲突。在存储对象内部同一个条带的读请求与读请求可以并发执行;但写请求与写请求之间、写请求与重构请求之间,需要进行同步或串行执行,以保证数据的正确性。由每个IO处理线程处理对同一存储对象内部的多个IO请求之间的同步。
本发明实施例还提供一种包含程序代码的程序,当被载入CPU并在CPU中执行时,程序使CPU执行上面提供的根据本发明实施例的方法之一。
本发明实施例还提供一种包括程序代码的程序,当被载入主机并在主机上执行时,所述程序使主机的处理器执行上面提供的根据本发明实施例的方法之一。
应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以分别由包括计算机程序指令的各种装置来实施。
这些计算机程序指令可以加载到通用计算机、专用计算机或其他可编程数据控制设备上以产生机器,从而在计算机或其他可编程数据控制设备上执行的指令创建了用于实现一个或多个流程图框中指定的功能的装置。这些计算机程序指令还可以存储在可以引导计算机或其他可编程数据控制设备的计算机可读存储器中从而以特定方式起作用,从而能够利用存储在计算机可读存储器中的指令来制造包括用于实现一个或多个流程图框中所指定功能的计算机可读指令的制品。计算机程序指令还可以加载到计算机或其他可编程数据控制设备上以使得在计算机或其他可编程数据控制设备上执行一系列的操作操作,从而产生计算机实现的过程,进而在计算机或其他可编程数据控制设备上执行的指令提供了用于实现一个或多个流程图框中所指定功能的操作。
因而,框图和流程图的框支持用于执行指定功能的装置的组合、用于执行指定功能的操作的组合和用于执行指定功能的程序指令装置的组合。还应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以由执行指定功能或操作的、基于硬件的专用计算机系统实现,或由专用硬件和计算机指令的组合实现。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
机译: 无锁IO处理方法及其装置
机译: IO带宽控制方法,IO访问请求处理方法,装置和系统
机译: 控制io带宽并处理io访问请求的方法,装置和系统