发明内容
本发明实施例提供一种读取数据的方法,用以改善读盘性能,该方法包括:
接收读取数据的请求;
检查所请求的数据是否在文件缓存池中,所述文件缓存池以文件划分的文件块为单位缓存数据,并且缓存的数据为文件的所有用户共享;
若是,则直接从所述文件缓存池读取所请求的数据;
若否,则发起异步输入输出IO读盘请求。
较佳的,接收读取数据的请求,是指:
接收客户端发出的读盘请求。
较佳的,所述文件缓存池中文件块的数量根据用户的数量确定。
较佳的,所述文件缓存池中文件块的大小根据如下因素其中之一或任意组合进行确定:
数据读取过程中随机读和顺序读的比例、所请求的数据大小、服务器的读盘能力、文件缓存池的缓存Cache命中率、读盘的响应速度。
较佳的,文件块的大小为64K~256K。
较佳的,发起异步IO读盘请求之后,进一步包括:
创建后台线程,并将异步IO读盘请求列入等待队列;
后台线程顺序将等待队列中的异步IO读盘请求提交操作系统处理,并在操作系统每处理完成一个异步IO读盘请求后,向发出读取数据的请求端发出读盘通知。
本发明实施例还提供一种读取数据的装置,用以改善读盘性能,该装置包括:
接收模块,用于接收读取数据的请求;
检查模块,用于检查所请求的数据是否在文件缓存池中,所述文件缓存池以文件划分的文件块为单位缓存数据,并且缓存的数据为文件的所有用户共享;
执行模块,用于在检查模块确定所请求的数据在文件缓存池中时,直接从所述文件缓存池读取所请求的数据;在检查模块确定所请求的数据不在文件缓存池中时,发起异步IO读盘请求。
较佳的,所述接收模块进一步用于接收客户端发出的读盘请求。
较佳的,所述文件缓存池中文件块的大小根据如下因素其中之一或任意组合进行确定:
数据读取过程中随机读和顺序读的比例、所请求的数据大小、服务器的读盘能力、文件缓存池的Cache命中率、读盘的响应速度。
较佳的,该装置还包括:
异步处理模块,用于创建后台线程,并将异步IO读盘请求列入等待队列;触发后台线程顺序将等待队列中的异步IO读盘请求提交操作系统处理,并在操作系统每处理完成一个异步IO读盘请求后,向发出读取数据的请求端发出读盘通知。
本发明实施例在进行数据读取处理时,接收读取数据的请求;检查所请求的数据是否在文件缓存池中,所述文件缓存池以文件划分的文件块为单位缓存数据,并且缓存的数据为文件的所有用户共享;若是,则直接从所述文件缓存池读取所请求的数据;若否,则发起异步IO读盘请求,从而通过文件缓存池保存从磁盘读取的数据,让多个用户共享缓存池,可以提高Cache的命中率,同时满足文件顺序读和随机读的需求;并且,通过发起异步IO读盘请求,以一种非堵塞的异步方式实现从磁盘读取数据,可以使服务器对读取数据的请求及时做出响应。利用本发明实施例进行数据读取,无论是文件的顺序读还是随机读,都具有良好的读盘性能。
具体实施方式
下面结合说明书附图对本发明实施例进行详细说明。
如图1所示,本发明实施例中读取数据的方法流程如下:
步骤101、接收读取数据的请求。
步骤102、检查所请求的数据是否在文件缓存池中,所述文件缓存池以文件划分的文件块为单位缓存数据,并且缓存的数据为文件的所有用户共享;若是,则执行步骤103;若否,则执行步骤104。
步骤103、直接从所述文件缓存池读取所请求的数据。
步骤104、发起异步IO(Input Output,输入输出)读盘请求。
本发明实施例中的文件缓存池如图2所示,在文件缓存池中,一个文件被划分为多个“文件块”,多个“文件块”组成该文件的缓存池,这个缓存池内保存的数据为该文件的所有用户共享,文件缓存池以文件块为单位缓存、读取数据。文件缓存池为在内存中划分的一定大小的存储区域。通常在例如多源下载的应用中,可将需下载的文件分为多个文件块,需要下载数据的客户端分别从多个服务器获取数据,而从每个服务器只获取部分文件块对应的数据。
当客户端需要读取文件的数据时,可利用函数“Open()”(Linux函数)或“ReadFile()”(windows函数)打开文件并可添加O_DIRECT选项,而不使用计算机文件系统自带的数据缓存区,以避免从数据缓存区至用户缓存的数据拷贝操作。在文件缓存池中,一个文件可对应一个文件缓存池,所有读取同一个文件的用户共享该缓存池。一个文件对应的缓存池中并不一定存储了该文件的全部文件块,文件缓存池中的文件块数量根据用户的数量确定,较佳的,随着需获取该文件的用户数增加,文件缓存池中包括的文件块数量可以相应增加,例如文件每增加一个用户,将该文件多划分出多个文件块,则该文件有更多的文件块保存在文件缓存池中,服务器直接从文件缓存池中读取数据的概率增加,从而提高服务器的读盘性能。在某些情况下,若请求的所有数据都被保存在文件缓存池中,此时服务器可以直接从文件块中读取数据,大大提高服务器响应客户端的速度。
在文件缓存池中,文件块的大小可配置。文件块大小的配置受很多因素的影响,例如可以根据如下因素其中之一或任意组合进行确定:数据读取过程中随机读和顺序读的比例、所请求的数据大小、服务器的读盘能力、文件缓存池的缓存(Cache)命中率、读盘的响应速度。例如,在配置文件块大小时,文件块的大小直接影响服务器的读盘能力——过大的文件块虽然使服务器的读盘能力增加,但文件缓存池的Cache命中率可能降低,读盘浪费严重,并且读盘的延迟增加;过小的文件块虽然能够提高文件缓存池的Cache命中率,提升读盘的响应速度,但服务器读盘的能力却降低,因此文件块大小的选择要仔细权衡,推荐的文件块大小在64K~256K。
一个实施例中,步骤101的接收读取数据的请求,可以是:接收客户端发出的读盘请求。如图3所示,该实施例的流程示意如下:
步骤301、接收到客户端发出的读盘请求。
步骤302、检查请求的数据是否在文件缓存池中。
步骤303、如果请求的数据在文件缓存池中,则直接读取数据。
步骤304、如果请求的数据不在缓存池中,则创建新的异步IO读盘请求。
步骤305、将创建好的异步IO读盘请求发出。
如果请求的数据不在文件缓存池中,则需要创建新的异步IO读盘请求。在一些情况下,请求的数据跨越多个连续的文件块,则需要创建多个异步IO读盘请求。
本发明实施例采用异步的方式从磁盘读取数据,即当有多个客户端同时请求获取数据时,具体的读盘操作由后台线程完成。则在发起IO读盘请求之后,还包括:创建后台线程,并将异步IO读盘请求列入等待队列;后台线程顺序将等待队列中的异步IO读盘请求提交操作系统处理,并在操作系统每处理完成一个异步IO读盘请求后,向发起读盘请求方发出读盘通知。
一般情况下需要创建多个后台线程,每个后台线程包括一个等待队列,用于保存接收的异步IO读盘请求(每个异步IO读盘请求包含了请求获取数据的客户端信息)。由于后台线程有多个,则需要将创建的异步IO读盘请求放入合适的后台线程等待队列中。后台线程启动后,循环处理如下两件事情:第一、查询等待队列中是否有未处理的异步IO读盘请求,如果有,就提交给操作系统处理;第二、后台线程查询以前提交的异步IO读盘请求是否已经由操作系统完成,如果有异步IO读盘请求处理完成,则发出读盘通知,通知客户端从文件缓存池中读取数据。
如图4所示,对异步IO读盘请求的处理过程如下:
步骤401、创建后台线程,专门处理接收的异步IO读盘请求,其中后台线程包括一个等待队列,用于保存接收的异步IO读盘请求。
步骤402、后台线程检查等待队列中是否有未处理的异步IO读盘请求。如果等待队列中没有未处理的异步IO读盘请求,则直接跳到步骤404处理。如果等待队列中有未处理的异步IO读盘请求,则执行步骤403。
步骤403、后台线程提交顺序在最前的未处理异步IO读盘请求给操作系统处理。
步骤404、后台线程检查以前提交给操作系统处理的异步IO读盘请求是否有已被处理完成的。如果没有异步IO读盘请求被处理完成,则直接返回到步骤402进行循环处理;如果有异步IO读盘请求完成,则执行步骤405。
步骤405、发出读盘通知,通知客户端从文件缓存池读取数据,并返回到步骤402循环处理。
本领域普通技术人员可以理解上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。
基于同一发明构思,本发明实施例还提供一种读取数据的装置,其结构如图5所示,可以包括:
接收模块501,用于接收读取数据的请求;
检查模块502,用于检查所请求的数据是否在文件缓存池中,所述文件缓存池以文件划分的文件块为单位缓存数据,并且缓存的数据为文件的所有用户共享;
执行模块503,用于在检查模块确定所请求的数据在文件缓存池中时,直接从所述文件缓存池读取所请求的数据;在检查模块确定所请求的数据不在文件缓存池中时,发起异步IO读盘请求。
一个实施例中,接收模块501还可以用于接收客户端发出的读盘请求。
一个实施例中,文件缓存池中文件块的大小根据如下因素其中之一或任意组合进行确定:
数据读取过程中随机读和顺序读的比例、所请求的数据大小、服务器的读盘能力、文件缓存池的缓存Cache命中率、读盘的响应速度。
如图6所示,一个实施例中,图5所示的读取数据的装置还可以包括:
异步处理模块504,用于创建后台线程,并将异步IO读盘请求列入等待队列;触发后台线程顺序将等待队列中的异步IO读盘请求提交操作系统处理,并在操作系统每处理完成一个异步IO读盘请求后,向发出读取数据的请求端发出读盘通知。
本发明实施例在进行数据读取处理时,接收读取数据的请求;检查所请求的数据是否在文件缓存池中,所述文件缓存池以文件划分的文件块为单位缓存数据,并且缓存的数据为文件的所有用户共享;若是,则直接从所述文件缓存池读取所请求的数据;若否,则发起异步IO读盘请求,从而通过文件缓存池保存从磁盘读取的数据,让多个用户共享缓存池,可以提高Cache的命中率,同时满足文件顺序读和随机读的需求;并且,通过发起异步IO读盘请求,以一种非堵塞的异步方式实现从磁盘读取数据,可以使服务器对读取数据的请求及时做出响应。利用本发明实施例进行数据读取,无论是文件的顺序读还是随机读,都具有良好的读盘性能。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若对本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。