本发明涉及一种基于linux内核的i/o调度器,更特别地说,是指一种通过软硬件协同支持读写性能隔离的i/o调度器。
背景技术:
i/o调度器是操作系统内核中的部件,其通过合并,重排等操作改变i/o请求在队列中的顺序,从而改变i/o请求提交到存储设备的顺序。i,input,输入;o,output,输出。
队列:队列是一种特殊的线性表,其只允许在表的前端(front)进行元素的删除操作(出队),在表的后端(rear)进行元素的插入操作(入队)。
i/o请求队列:i/o队列是linux内核中的结构,存在于通用块层(blocklayer),上层应用提交的i/o请求顺序地从队列尾端被提交至队列,而请求队列依次将队列前端的i/o请求提交至存储设备进行处理。
i/o软件队列:i/o软件队列是linux内核3.19中的概念,其作用与i/o请求队列相同,与之不同的是,i/o请求队列只有一个,而i/o软件队列针对每一个cpu逻辑核都会创建一个,其用于缓存对应cpu逻辑核提交的i/o请求。
i/o硬件队列:i/o硬件队列也是linux内核3.19中的概念,其是一个新的队列结构。i/o硬件队列的个数与存储硬件提供的队列数目相等,并与之对应。i/o软件队列将i/o请求提交到指定的i/o硬件队列,i/o硬件队列再将i/o请求提交至存储设备。
nvme(non-volatilememoryexpress):非易失性内存主机控制器接口规范,是一个逻辑设备接口规范。此规范充分利用pci-e接口,处理器以及操作系统的并行性,极大的提升固态硬盘的读写性能。nvme硬件队列,即为存在于nvme接口驱动中的,用于将i/o请求提交至存储设备的硬件队列。
技术实现要素:
为了解决针对数据处理系统中的在线读负载和批量写负载两类应用的混部,在不修改上层应用的前提下,降低应用业务混部带来的干扰,即最大程度的做到混部应用的资源隔离;因此,本发明设计了一种通过软硬件协同支持读写性能隔离的i/o调度器。本发明技术手段是改进已有i/o调度器,通过调整不同类型i/o的队列深度对i/o进行流量控制,并优先保证读i/o请求的完成时间,此为软件层面的i/o隔离方案;同时本发明将4类i/o调度器中的优先级与nvme硬件队列中的4类优先级进行对接,当读i/o请求的优先级高于写i/o请求的优先级时,nvmessd会优先获取并处理读i/o请求,此为硬件层面的i/o隔离方案。采用本发明设计的i/o调度器处理后能够在数据处理系统中的在线读负载和批量写负载混部,即读写i/o混部的情况下,保持写i/o性能不变的同时,将读i/o的性能提升48.3%。
本发明设计的一种通过软硬件协同支持读写性能隔离的i/o调度器,是在基于linux内核的现有i/o调度器中增加了四个单元,即队列分配单元(10)、优先级设置单元(20)、队列延迟时间对比单元(30)和队列深度调节单元(40);
队列分配单元(10)中存在有队列包括有读请求队列(101)、同步写请求队列(102)和异步写请求队列(103);
读请求队列(101)用于归类经读i/o请求单元(12)从数据处理系统中的在线读负载(11)请求得到的多个读请求read,则有,在所有观测周期ot={0,t,2t,…,(n-1)t,nt}里采集到的读请求read采用集合形式表达为rq={readt,read2t,…,readnt};
同步写请求队列(102)用于归类经写i/o请求单元(22)从数据处理系统中的批量写负载(21)请求得到的多个同步写请求write,则有,在所有观测周期ot={0,t,2t,…,(n-1)t,nt}里采集到的同步写请求write采用集合形式表达为wq={writet,write2t,…,writent};
异步写请求队列(103)用于归类写i/o请求单元(22)从数据处理系统中的批量写负载(21)请求得到的多个异步写请求asynchronous_write,则有,在所有观测周期ot={0,t,2t,…,(n-1)t,nt}里采集到的异步写请求asynchronous_write采用集合形式表达为
优先级设置单元(20)用于对队列分配单元(10)中的多个请求队列进行优先级的设置;
队列延迟时间对比单元(30)先进行读请求的时间比对,然后进行同步写请求的时间比对,进而是异步写请求的时间比对,最后将比对后的各自服务质量输出给队列深度调节单元(40);队列延迟时间对比单元(30)输出的服务质量有
队列深度调节单元(40)在观测时间集ot={0,t,2t,…,(n-1)t,nt}中同一个观测周期进行循环调节;
步骤a,在观测周期t时刻里,队列深度调节单元(40)接收队列延迟时间对比单元(30)输出的服务质量
步骤b,对
步骤c,将读队列深度
步骤d,将读队列深度
步骤e,对
步骤f,将同步写队列深度
步骤g,将同步写队列深度
步骤h,对
步骤i,将异步写队列深度
步骤j,将异步写队列深度
i/o软件队列(50),经队列深度调节单元(40)调整后的rq、wq和awq中的每个请求根据自身的优先级信息进入到对应的i/o软件队列(50)中,其中rq进入real-time优先级的软件队列,wq和awq进入idle优先级的软件队列;
i/o硬件队列(60),将i/o软件队列(50)中的优先级与i/o硬件队列(60)的优先级进行映射,则real-time优先级的软件队列会和urgent优先级的硬件队列对接,则rq队列中的i/o请求最终会进入到urgent优先级的硬件队列中;而idle优先级的软件队列会和low优先级的硬件队列对接,则wq和awq队列中的i/o请求最终会进入到low优先级的硬件队列中;
存储设备(70)通过wrr的方式扫描各硬件队列获取并处理i/o请求,则读i/o请求在urgent队列会优先被处理,写i/o则会被放缓处理,由此在硬件层面降低了写i/o对读i/o的干扰。
本发明设计了基于linux内核的通过软硬件协同支持读写性能隔离的i/o调度器的优点在于:
软件层面改进,使其在软件队列上层通过动态队列调整的方式对不同类型的i/o请求进行流量控制,并优先保证读i/o请求的完成时间。当读i/o请求的完成时间不满足阈值要求时,本发明i/o调度器会增加rq队列的深度,减小wsq队列和wq队列的深度,控制写i/o请求向软件队列的提交流量,以此在软件层面保证读i/o请求的完成时间。
硬件层面改进,在软件层进行流量控制的同时,为每个核建立4个软件队列对应4类i/o调度器中的优先级,并将其与nvme硬件队列中的4类优先级进行对应,设置读i/o请求的优先级高于写i/o请求,优先级标签会被nvmessd(硬盘)识别,优先获取并处理高优先级的读i/o请求,在硬件层面保证了读i/o请求的完成时间。软硬件方案的结合使用叠加了读写i/o的隔离效果。
与已有技术相比,本发明i/o调度器在读写i/o带宽较低时也可以体现出隔离效果
与已有技术相比,本发明i/o调度器可以直接部置在已有ssd产品中,并适用于任何支持wrr轮询方式的ssd产品。
与已有技术相比,本发明i/o调度器允许用户通过简单更改在软件层提供的配置接口来调整读写i/o请求的优先级和完成阈值,降低使用难度。
附图说明
图1是本发明通过软硬件协同支持读写性能隔离的i/o调度器的结构框图;
图2是本发明队列深度调节单元在同一观测周期里的队列深度调节流程图。
具体实施方式
下面将结合附图和实施例对本发明做进一步的详细说明。
观测周期记为t,则观测时间集ot={0,t,2t,…,(n-1)t,nt},t为第一个观测周期,2t为第二个观测周期,(n-1)t为倒数最后一个观测周期,nt为最后一个观测周期,n为观测周期的总期数。
读请求队列集记为rq,在所有观测周期里采集到的读请求read采用集合形式表达为rq={readt,read2t,…,readnt};所述读请求队列rq的i/o延迟时间集合记为,读请求-延迟时间集
readt表示在0至t时间段出现的第一组读请求,所述readt的i/o平均延迟时间记为
read2t表示在t至2t时间段出现的第二组读请求,所述read2t的i/o延迟时间记为
readnt表示在(n-1)t至nt时间段出现的最后一组读请求,所述readnt的i/o延迟时间记为
同步写请求队列集记为wq,在所有观测周期里采集到的同步写请求write采用集合形式表达为wq={writet,write2t,…,writent};所述同步写请求队列wq的i/o延迟时间集合记为,同步写请求-延迟时间集
writet表示在0至t时间段出现的第一组同步写请求,所述writet的i/o延迟时间记为
write2t表示在t至2t时间段出现的第二组同步写请求;所述write2t的i/o延迟时间记为
writent表示在(n-1)t至nt时间段出现的最后一组同步写请求,所述writent的i/o延迟时间记为
异步写请求队列集记为awq,在所有观测周期里采集到的异步写请求asynchronous_write采用集合形式表达为:
所述异步写请求队列awq的i/o延迟时间集合记为,异步写请求-延迟时间集:
asynchronous_writet表示在0至t时间段出现的第一组异步写请求,所述asynchronous_writet的i/o延迟时间记为
asynchronous_write2t表示在t至2t时间段出现的第二组异步写请求,所述asynchronous_write2t的i/o延迟时间记为
asynchronous_writent表示在(n-1)t至nt时间段出现的最后一组异步写请求,所述asynchronous_writent的i/o延迟时间记为
在本发明中,i/o延迟时间是指一个i/o请求从提交进入软件队列排队,直到存储设备完成i/o请求返回至完成队列,此过程需要经历一段时间,将此等待时间称为i/o延迟时间。
参见图1所示,本发明设计了一种基于linux内核的通过软硬件协同支持读写性能隔离的i/o调度器,该i/o调度器包括有队列分配单元10、优先级设置单元20、队列延迟时间对比单元30、队列深度调节单元40;在本发明中,数据处理系统中的在线读负载11和数据处理系统中的批量写负载21为i/o请求中的两个进程。数据处理系统中的在线读负载11经读i/o请求单元12来获得读请求队列集记为rq={readt,read2t,…,readnt};数据处理系统中的批量写负载21经写i/o请求单元22来获得同步写请求队列集wq={writet,write2t,…,writent}和异步写请求队列集:
在本发明中,是在基于linux内核的现有i/o调度器中增加了四个单元,即队列分配单元10、优先级设置单元20、队列延迟时间对比单元30和队列深度调节单元40。
队列分配单元10
在本发明中,队列分配单元10中存在有队列包括有读请求队列101、同步写请求队列102和异步写请求队列103。
读请求队列101用于归类经读i/o请求单元12从数据处理系统中的在线读负载11请求得到的多个读请求read,则有,在所有观测周期里采集到的读请求read采用集合形式表达为rq={readt,read2t,…,readnt}。
同步写请求队列102用于归类经写i/o请求单元22从数据处理系统中的批量写负载21请求得到的多个同步写请求write,则有,在所有观测周期里采集到的同步写请求write采用集合形式表达为wq={writet,write2t,…,writent}。
异步写请求队列103用于归类写i/o请求单元22从数据处理系统中的批量写负载21请求得到的多个异步写请求asynchronous_write,则有,在所有观测周期里采集到的异步写请求asynchronous_write采用集合形式表达为:
在本发明中,队列分配单元10用于将接收到的读请求、同步写请求和异步写请求进行分配到不同的队列中去。
优先级设置单元20
在本发明中,优先级设置单元20用于对队列分配单元10中的多个请求队列进行优先级的设置。一般地,读请求队列集rq的优先级高于同步写请求队列集wq和异步写请求队列集awq的优先级。
在本发明中,对读请求队列集rq、同步写请求队列集wq和异步写请求队列集awq的优先级进行设置是为了降低优先级低的磁盘操作对优先级高的磁盘操作性能上造成的干扰。
一个进程一般存在有4类i/o调度优先级,分别是real-time(最高优先级)、best-effort(高优先级)、none(中优先级)和idle(低优先级)。
idle:空闲磁盘调度,在当前系统没有其他进程需要进行磁盘读写操作时,本进程才能进行磁盘读写操作。在本发明中,将其定义为低优先级。
real-time:实时调度,立即访问磁盘,不管系统中其他进程是否有磁盘读写。在本发明中,将其定义为最高优先级。
best-effort:可以指定优先级参数(范围是0~7,数值越小,优先级越高)。在本发明中,将其定义为高优先级。
none:不属于idle、real-time或best-effort优先级时,且需要进行磁盘读写操作的。在本发明中,将其定义为中优先级。
队列延迟时间对比单元30
在本发明中,队列延迟时间对比单元30先进行读请求的时间比对,然后进行同步写请求的时间比对,进而是异步写请求的时间比对,最后将比对后的各自服务质量输出给队列深度调节单元40。
在本发明中,设置了读请求队列集rq的完成时间,记为读请求阈值时间
在本发明中,设置了同步写请求队列集wq的完成时间,记为同步写请求阈值时间
在本发明中,设置了异步写请求队列集awq的完成时间,记为异步写请求阈值时间
队列延迟时间对比单元30第一方面进行读请求的时间比对;即:
若
若
若
队列延迟时间对比单元30第二方面进行同步写请求的时间比对;即:
若
若
若
队列延迟时间对比单元30第三方面进行异步写请求的时间比对;即:
若
若
若
队列深度调节单元40
在本发明中,对于队列深度调节单元40的调节是以rq的延迟不满足阈值要求时,rq、wq和awq的深度就根据rq的服务质量来变化的;当rq的延迟满足阈值要求时,则wq和awq的深度可以根据各自的服务质量来变化。
在本发明中,调度器根据每个类型i/o的完成时间动态调整队列深度,以优先保证读i/o请求的读请求阈值时间
参见图2所示,本发明的队列深度调节单元40在同一观测周期里的队列深度调节,包括有下列步骤:
队列深度调节单元40在观测周期t的处理为:
步骤a,在观测周期t时刻里,队列深度调节单元40接收队列延迟时间对比单元30输出的服务质量
步骤b,对
步骤c,将读队列深度
步骤d,将读队列深度
步骤e,对
步骤f,将同步写队列深度
步骤g,将同步写队列深度
步骤h,对
步骤i,将异步写队列深度
步骤j,将异步写队列深度
在本发明中,队列深度调节单元40在观测时间集ot={0,t,2t,…,(n-1)t,nt}中的其余观测周期与观测周期t是相同的深度调节,即队列深度调节以一个观测周期进行循环调节。下面分别列出第二个观测周期2t和最后一个观测周期nt的队列深度调节。
队列深度调节单元40在观测周期2t的处理为:
步骤1,在观测周期2t时刻里,队列深度调节单元40接收队列延迟时间对比单元30输出的服务质量
步骤2,对
步骤3,将读队列深度
步骤4,将读队列深度
步骤5,对
步骤6,将同步写队列深度
步骤7,将同步写队列深度
步骤8,对
步骤9,将异步写队列深度
步骤10,将异步写队列深度
队列深度调节单元40在观测周期nt的处理为:
步骤a,在观测周期nt时刻里,队列深度调节单元40接收队列延迟时间对比单元30输出的服务质量
步骤b,对
步骤c,将读队列深度
步骤d,将读队列深度
步骤e,对
步骤f,将同步写队列深度
步骤g,将同步写队列深度
步骤h,对
步骤i,将异步写队列深度
步骤j,将异步写队列深度
i/o软件队列50:
在本发明中,经队列深度调节单元40调整后的rq、wq和awq中的每个请求根据自身的优先级信息进入到对应的i/o软件队列50中,其中rq进入real-time优先级的软件队列,wq和awq进入idle优先级的软件队列。
i/o硬件队列60:
将i/o软件队列50中的优先级与i/o硬件队列60的优先级进行映射,则real-time优先级的软件队列会和urgent优先级的硬件队列对接,则rq队列中的i/o请求最终会进入到urgent优先级的硬件队列中;而idle优先级的软件队列会和low优先级的硬件队列对接,则wq和awq队列中的i/o请求最终会进入到low优先级的硬件队列中。
存储设备70:
存储设备70通过wrr的方式扫描各硬件队列获取并处理i/o请求,则读i/o请求在urgent队列会优先被处理,写i/o则会被放缓处理,由此在硬件层面降低了写i/o对读i/o的干扰。
实施例1:
本发明是一种读写i/o性能隔离技术,所要解决的是如何降低读写应用混部造成的i/o性能干扰。由于读i/o通常产生于数据处理系统中的在线读负载,使得i/o调度器需要保证此类负载的平均延迟和尾延迟指标。
经过大量实际观测,在线读负载的i/o行为可以简化为平均i/o块大小为4kb,带宽为100mb/s的读操作,批量写负载的i/o行为可以简化为平均i/o块大小为128kb,带宽为300mb/s的写操作。取观测周期t=100ms,观测周期总数n=1200,读请求阈值时间
当读和同步写i/o混部时,读i/o的平均延迟99%分位尾延迟和99.9%分位尾延迟,分别为403μs、3312μs和4704μs,而应用本发明设计的i/o调度器方案后,则分别下降为257μs、2128μs和2544μs,即每个性能指标分别提升36.2%、35.7%和45.9%。
当读和异步写i/o混部时,读i/o的平均延迟99%分位尾延迟和99.9%分位尾延迟,分别为266μs、4512μs和8512μs,而应用本发明设计的i/o调度器方案后,则分别下降为141μs、1912μs和2768μs,即每个性能指标分别提升47.0%、57.6%和67.5%。
综合来看,通过应用本发明设计的i/o调度器方案后,在读写i/o混部的情况下,保持写i/o性能不变的同时,可以将读i/o的性能提升48.3%。