一种处理并发顺序读io的方法及装置的制造方法

xiaoxiao2021-3-1  214

一种处理并发顺序读io的方法及装置的制造方法
【技术领域】
[0001]本发明属于存储技术领域,尤其涉及一种处理并发顺序读10的方法及装置。
【背景技术】
[0002]随着大数据的发展,人们把越来越多的服务器连接到同一个存储阵列上,并且随着服务器的发展,同一个服务器也会出现多核的CPU,这就出现可能同时几十路甚至上百路的顺序读10( Input/Output)需要同一个存储阵列的处理,这就需要存储阵列的10处理算法能够并发的顺序读10。且每个顺序读10的触发条件,块大小,预读的深度都跟具体的应用相关,如何动态地调整存储的预读算法使之能跟上应用的发展,就成了存储阵列能否跟上大数据发展时代的关键因素了。
[0003]现有技术中,通常针对特定的应用进行优化。但这样对于多应用场景的客户环境来说都有些不便,例如需要分析客户的应用特点,并根据相应的应用进行修改算法,并编译测试等,操作繁琐。并且通常只考虑到单路的读10,并没有相应的方法处理并发的多路顺序读10。

【发明内容】

[0004]本发明提供一种处理并发顺序读10的方法及装置,可通过调整预读10的相关参数,动态调整预读算法,提高存储阵列处理并发顺序读10的效率。
[0005]本发明提供的处理并发顺序读10的方法,包括:
[0006]接收调整顺序读10的第一预读深度参数的指令,并按照所述指令进行参数配置;接收顺序读10的指令,并将所述顺序读10加入到所属的顺序读10队列;判断队列中顺序读10的数量是否大于预置目标数量;若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度;按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0007]本发明提供的处理并发顺序读10的装置,包括:
[0008]接收模块,用于接收调整顺序读10的第一预读深度参数的指令;配置模块,用于按照所述指令进行参数配置;所述接收模块,还用于接收顺序读10的指令;加入模块,用于将所述顺序读10加入到所属的顺序读10队列;判断模块,用于判断队列中顺序读10的数量是否大于预置目标数量;调整模块,用于若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度;读取模块,用于按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0009]从上述本发明实施例可知,本发明通过调整预读深度相关参数,来调整顺序读10的预读深度,提高并发处理多路顺序读10的效率和能力。
【附图说明】
[0010]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0011]图1是本发明实施例中处理并发顺序读10的内部模块结构示意图;
[0012]图2是本发明第一实施例提供的处理并发顺序读10的方法的实现流程示意图;
[0013]图3是本发明第二实施例提供的处理并发顺序读10的方法的实现流程示意图;
[0014]图4是本发明第三实施例提供的处理并发顺序读10的装置的结构示意图;
[0015]图5是本发明第四实施例提供的处理并发顺序读10的装置的结构示意图。
【具体实施方式】
[0016]为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0017]请参阅图1,本发明实施例中,执行处理并发顺序读10的方法的装置内部结构可包括如下软件或硬件模块:
[0018]存储前端101、触发模块102、预读模块103、存储后端104以及存储阵列(可以是磁盘阵列)105。
[0019]其中,存储前端101,是接收主机发出的顺序读10命令并解析其中顺序读10相关的参数。
[0020]触发模块102,用于触发预读与该顺序10命令指示的读取数据的操作。
[0021]预读模块103,用于根据指令执行预读数据的操作,其中内置预读算法。
[0022]存储后端104,用于通过与存储阵列105之间的存储接口从存储阵列105中读取数据。该存储接口不仅提供读10的接口,还提供查询后端读10压力的接口。
[0023]存储阵列105,用于存储数据。
[0024]以上各模块可以单独或集成在该装置中。
[0025]请参阅图2,图2为本发明第一实施例提供的处理并发顺序读10的方法的实现流程示意图,主要包括以下步骤S201至步骤S205:
[0026]S201、接收调整顺序读10的第一预读深度参数的指令,并按照该指令进行参数配置;
[0027]调整顺序读10的第一预读深度参数的指令可以是调试人员或使用人员发出,该指令用于调整顺序读10的第一预读深度参数,按照该指令进行参数配置,使得按照配置后的参数进行预读。
[0028]S202、接收顺序读10的指令,并将该顺序读10加入到所属的顺序读10队列;
[0029]S203、判断队列中顺序读10的数量是否大于预置目标数量;
[0030]一个队列中顺序读10的数量大于预置目标数量,是触发预读线程的触发条件。
[0031]S204、若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度;
[0032]若该顺序读10所在的队列中,顺序读10的数量是否大于该预置目标数量,则触发预读线程,调整预读深度,具体地,根据当前预读状态参数,通过动态调整第二预读深度参数,来调整顺序读10的预读深度。若当前预读状态参数显示预读深度还可以增加,则执行步骤205按照新的预读深度读取数据,若当前预读状态参数显示预读深度已到极限,再增加则影响系统整体运行状况,例如,影响执行主机发出的顺序读10指令的反应速度,则不对当前的预读深度进行调整。
[0033]S205、按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0034]本发明实施例,通过调整预读深度相关参数,来调整顺序读10的预读深度,提高并发处理多路顺序读10的效率和能力。
[0035]请参阅图3,图3为本发明第二实施例提供的处理并发顺序读10的方法的实现流程示意图,主要包括以下步骤S301至步骤S307:
[0036]S301、接收调整顺序读10的第一预读深度参数的指令,并按照该指令进行参数配置;
[0037]该顺序读10的第一预读深度参数至少包括以下一种参数:
[0038]顺序读10的最佳的预读长度化6忖6(:1:_口;^8丨26)、睡眠的预读长度(7丨61(1_?;^8126)、正常的预读长度(1101'1]^1_。;1^_8丨26)、顺序读10线程允许运行数量化;1;'_131187_1:11^3(1)以及顺序读10的触发数量(triger)。
[0039]具体地,通过调整最佳的预读长度、睡眠的预读长度和正常的预读长度可直接调整预读的深度。通过调整顺序读10线程允许运行数量可调整预读线程同时访问后端模块的能力。通过调整顺序读10的目标数量调整顺序读10的同时触发数量。
[0040]按照该指令中的参数进行配置,使得预读模块按照配置后的参数进行预读。
[0041 ] S302、接收顺序读10的指令,判断该顺序读10是否为新的顺序读10;
[0042]存储前端接收到顺序读10的指令,解析该指令中10相关参数,调用PF_CACHEadd_fe函数以触发预读。
[0043]首先检查该顺序读10的合法性,即检查该顺序读10的起始地址和长度是否合法,若合法,则判断该顺序读10是否为新的顺序读10。
[0044]顺序读10的相关信息存放在以下数组中:
[0045]Pf_Result.CacheNstoreThreadData[PF_RESULT_NUM]
[0046]通过如下的操作判断其是否是新的顺序10,如果下面的条件不符合,则是新的顺序10:
[0047]for(pf_rlt_index=0;pf_rlt_index<PF_RESULT_NUM;pf_rlt_index++)
[0048]{
[0049]if((Pf_Result.CacheNstoreThreadData[pf_rlt_index].1o_start+
[0050]Pf_Result.CacheNstoreThreadData[pf_rlt_index]. 1o_len)= =start)
[0051]{
[0052]..................................................................[0053]............相关预读操作...............................
[0054]...................................................................
[0055]}
[0056]若是,则执行步骤S303;若否,则执行步骤304。
[0057]S303、为该顺序读10创建新的顺序读10队列;
[0058]如果是新的顺序读10,则为其创建一个新的队列,在创建的新的队列中,只有该顺序读10。
[0059]S304、将该顺序读10加入其所属顺序读10队列;
[0060]如果不是新的顺序读10,则将其加入其所属顺序读10队列。
[0061]S305、判断队列中顺序读10的数量是否大于预置目标数量;
[0062]当本次顺序读I0加入到所属的顺序I 0队列时,P f _Result.CacheNstoreThreadData[pf_rlt_index]数组中的 nseq 值相应地增加。
[0063]判断队列中顺序读10的数量是否大于预置目标数量,若是,则预读触发条件成立,该触发条件即:
[0064]if(Pf_Result.CacheNstoreThreadData[pf_rlt_index].nseq>Pf_Result.triger)
[0065]S306、若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度;
[0066]当队列中顺序读10的数量是否大于预置目标数量时,根据当前预读状态参数,通过动态调整第二预读深度参数,来调整顺序读10的预读深度。其中,该当前预读状态参数包括:当前预读进度、预读线程数量、后端存储压力以及空闲内存大小。
[0067]具体地,当一个顺序读10的队列第一次被触发时,其预读深度会加上一个可调整的值以保证预读能满足主机10的速度。当一个顺序读10的队列非首次被触发时,其预读深度主要根据CacheNstoreResult_t Pf_Result中的参数进行调整。
[0068]CacheNstoreResult_t Pf_Result的数据结构如下:
[0069]struct CacheNstoreThread
[0070]{
[0071]int running;/*预读线程是否运行*/
[0072]int nseq;/*顺序 10个数*/
[0073]int active;/*是否激活状态*/
[0074]Cachefford_t 口;1^_8七&1'1:;/*预读开始的地址*/
[0075]Cachefford_t pf_len;/*需要预读的长度*/
[0076]Cachefford_t pf_actual_len;/*实际预读的长度*/
[0077]Cachefford_t pf_end;/*预读结束的地址*/
[0078]Cachefford_t 1_start;/*该顺序 10开始的地址*/
[0079]Cachefford_t 1_len;/*该顺序 10的长度*/
[0080]K9timeval_t ltime;/*该顺序10最后一次触发的时间*/
[0081]Cachefford_t stripe_size_blks;/*后端的条带大小*/
[0082]Cachefford_t align_perfect_pf_size;/*与后端对齐最佳的预读长度*/
[0083]s_crange_t*rng_v;/*存储后端的数据结构*/
[0084]int pid;/*预读线程pid号*/
[0085]K9semaphore_t wakeup;/*触发用的信号量*/
[0086] };
[0087]typedef struct CacheNstoreThread CacheNstoreThread_t;
[0088]struct CacheNstoreResult
[0089]{
[0090]K9semaphore_t SemThread;/*顺序 10线程的保护信号量*/
[0091]K9timeval_t expire;/*顺序 10的超时时间*/
[0092]int triger;/*顺序 10的触发个数*/
[0093]int pf_busy_thread;/*顺序10线程允许运行个数*/
[0094]int pf_debug;/*预读算法的调试开关*/
[0095]Cachefford_t perfect_pf_size;/*最佳的预读长度*/
[0096]Cachefford_t yield_pf_size;/*睡眠的预读长度*/
[0097]Cachefford_t normal_pf_size;/*正常的预读长度*/
[0098]CacheNstoreThread_t CacheNstoreThreadData[PF_RESULT_NUM] ;/*顺序 10队列*/
[0099]};
[0100]进一步地,该第二预读深度参数至少包括以下一种参数:
[0101]顺序读10的预读开始的地址(pf_start)、需要预读的长度(pf_len)、顺序10开始的地址(1_start)以及顺序10的长度(1_len)。这四个参数均属于CacheNstoreResult_tPf_Result中的参数。
[0102]S307、按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0103]按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0104]进一步地,读取10数据后,根据该当前预读状态参数,S卩,根据当前预读进度、预读线程数量、后端存储压力以及空闲内存大小,判断是否继续预读,若是,则通过调整该第二预读参数,即调整顺序读10的预读开始的地址,需要预读的长度、顺序10开始的地址以及顺序10的长度等参数中的一个或多个,最优方案是同时调整这四个参数,以调整预读深度,根据调整后的预读深度进行预读。
[0105]本发明实施例,通过调整预读深度相关参数,来调整顺序读10的预读深度,提高并发处理多路顺序读10的效率和能力。
[0106]请参阅图4,图4是本发明第三实施例提供的处理并发顺序读10的装置的结构示意图,为了便于说明,仅示出了与本发明实施例相关的部分。图4示例的装置可以是前述图2所示实施例提供的处理并发顺序读10的方法的执行主体。图4示例的处理并发顺序读10的装置,主要包括:
[0107]接收模块401、配置模块402、加入模块403、判断模块404、调整模块405以及读取模块406。
[0108]以上各功能模块详细说明如下:
[0109]其中,接收模块401,用于接收调整顺序读10的第一预读深度参数的指令;
[0110]配置模块402,用于按照该指令进行参数配置;
[0111]接收模块401,还用于接收顺序读10的指令;
[0112]加入模块403,用于将该顺序读10加入到所属的顺序读10队列;
[0113]判断模块404,用于判断队列中顺序读10的数量是否大于预置目标数量;
[0114]调整模块405,用于若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度;
[0115]读取模块406,用于按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0116]本实施例未尽之细节,请参阅前述图1至图3所示实施例的描述,此处不再赘述。
[0117]需要说明的是,以上图4示例的处理并发顺序读10的装置的实施方式中,各功能模块的划分仅是举例说明,实际应用中可以根据需要,例如相应硬件的配置要求或者软件的实现的便利考虑,而将上述功能分配由不同的功能模块完成,即将处理并发顺序读10的装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。而且,实际应用中,本实施例中的相应的功能模块可以是由相应的硬件实现,也可以由相应的硬件执行相应的软件完成;本说明书提供的各个实施例都可应用上述描述原则。
[0118]本发明实施例,本发明实施例,通过调整预读深度相关参数,来调整顺序读10的预读深度,提高并发处理多路顺序读10的效率和能力。
[0119]请参阅图 5,图5是本发明第四实施例提供的处理并发顺序读10的装置的结构示意图,该装置主要包括:
[0120]接收模块501、配置模块502、加入模块503、判断模块504、调整模块505、读取模块506以及创建模块507。
[0121]以上各功能模块详细说明如下:
[0122]其中,接收模块501,用于接收调整顺序读10的第一预读深度参数的指令;
[0123]该第一预读深度参数至少包括以下一种参数:
[0124]顺序读10的最佳的预读长度、睡眠的预读长度、正常的预读长度、顺序读10线程允许运行数量以及顺序读10的触发数量。
[0125]配置模块502,用于按照该指令进行参数配置;
[0126]接收模块501,还用于接收顺序读10的指令;
[0127]加入模块503,用于将该顺序读10加入到所属的顺序读10队列;
[0128]判断模块504,用于判断队列中顺序读10的数量是否大于预置目标数量;
[0129]调整模块505,用于若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度;
[0130]该当前预读状态参数包括:当前预读进度、预读线程数量、后端存储压力以及空闲内存大小。
[0131]该第二预读深度参数至少包括以下一种参数:
[0132]顺序读10的预读开始的地址、需要预读的长度、顺序10开始的地址以及顺序10的长度。
[0133]读取模块506,用于按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。
[0134]进一步地,判断模块504,还用于判断该顺序读10是否为新的顺序读10;
[0135]该装置还可以进一步包括:
[0136]创建模块507,用于若判断模块504判断该顺序读10是新的顺序读10,则为该顺序读10创建新的顺序读10队列;
[0137]加入模块503,还用于若判断模块504判断该顺序读10不是新的顺序读10,则将该顺序读10加入其所属顺序读10队列。
[0138]本实施例未尽之细节,请参阅前述图1至图4所示实施例的描述,此处不再赘述。
[0139]本发明实施例,本发明实施例,通过调整预读深度相关参数,来调整顺序读10的预读深度,提高并发处理多路顺序读10的效率和能力。
[0140]在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0141]所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
[0142]另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
[0143]所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0144]需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。
[0145]在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
[0146]以上为对本发明所提供的一种处理并发顺序读10的方法及装置的描述,对于本领域的一般技术人员,依据本发明实施例的思想,在【具体实施方式】及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。
【主权项】
1.一种处理并发顺序读10的方法,其特征在于,所述方法包括: 接收调整顺序读10的第一预读深度参数的指令,并按照所述指令进行参数配置; 接收顺序读10的指令,并将所述顺序读10加入到所属的顺序读10队列; 判断队列中顺序读10的数量是否大于预置目标数量; 若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度; 按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。2.根据权利要求1所述的方法,其特征在于,所述第一预读深度参数至少包括以下一种参数: 顺序读10的最佳的预读长度、睡眠的预读长度、正常的预读长度、顺序读10线程允许运行数量以及顺序读10的触发数量。3.根据权利要求1或2所述的方法,其特征在于,所述第二预读深度参数至少包括以下一种参数: 顺序读10的预读开始的地址、需要预读的长度、顺序10开始的地址以及顺序10的长度。4.根据权利要求3所述的方法,其特征在于,所述当前预读状态参数包括:当前预读进度、预读线程数量、后端存储压力以及空闲内存大小。5.根据权利要求4所述的方法,其特征在于,所述将顺序读10加入到对应的顺序读10队列包括: 判断所述顺序读10是否为新的顺序读10; 若是,则为所述顺序读10创建新的顺序读10队列,若否,则将所述顺序读10加入其所属顺序读10队列。6.一种处理并发顺序读10的装置,其特征在于,所述装置包括: 接收模块,用于接收调整顺序读10的第一预读深度参数的指令; 配置模块,用于按照所述指令进行参数配置; 所述接收模块,还用于接收顺序读10的指令; 加入模块,用于将所述顺序读10加入到所属的顺序读10队列; 判断模块,用于判断队列中顺序读10的数量是否大于预置目标数量; 调整模块,用于若是,则根据当前预读状态参数,通过动态调整第二预读深度参数以调整顺序读10的预读深度; 读取模块,用于按照调整后的顺序读10的预读深度,调用后端存储接口从存储阵列中读取10数据。7.根据权利要求6所述的装置,其特征在于,所述第一预读深度参数至少包括以下一种参数: 顺序读10的最佳的预读长度、睡眠的预读长度、正常的预读长度、顺序读10线程允许运行数量以及顺序读10的触发数量。8.根据权利要求6或7所述的装置,其特征在于,所述第二预读深度参数至少包括以下一种参数: 顺序读10的预读开始的地址、需要预读的长度、顺序10开始的地址以及顺序10的长度。9.根据权利要求8所述的装置,其特征在于,所述当前预读状态参数包括:当前预读进度、预读线程数量、后端存储压力以及空闲内存大小。10.根据权利要求9所述的装置,其特征在于, 所述判断模块,还用于判断所述顺序读10是否为新的顺序读10; 所述装置还包括: 创建模块,用于若所述判断模块判断所述顺序读10是新的顺序读10,则为所述顺序读10创建新的顺序读10队列; 所述加入模块,还用于若所述判断模块判断所述顺序读10不是新的顺序读10,则将所述顺序读10加入其所属顺序读10队列。
【专利摘要】本发明公开了一种处理并发顺序读IO的方法及装置,该方法包括:接收调整顺序读IO的第一预读深度参数的指令,并按照所述指令进行配置,接收顺序读IO的指令,并将该顺序读IO加入到所属的顺序读IO队列,判断队列中顺序读IO的数量是否大于预置目标数量,若是,则根据当前预读状态参数,通过动态调整第二预读深度参数、来调整顺序读IO的预读深度,按照调整后的顺序读IO的预读深度,调用后端存储接口从存储阵列中读取IO数据。本发明通过调整预读IO的相关参数,动态调整预读算法,提高存储阵列处理并发顺序读IO的效率。
【IPC分类】G06F12/0862
【公开号】CN105487987
【申请号】CN201510816137
【发明人】林运生
【申请人】深圳市迪菲特科技股份有限公司
【公开日】2016年4月13日
【申请日】2015年11月20日

最新回复(0)