專利名稱:讀取數據的方法及裝置的制作方法
技術領域:
本發明涉及計算機技術領域,尤其涉及讀取數據的方法及裝置。
背景技術:
互聯網上廣泛使用的服務器/客戶端架構體系中,服務器要同時為成千上萬 的客戶端提供不同的服務,很多客戶端的請求要求服務器從磁盤讀取數據,這 些讀盤請求可能需要從文件中順序讀取數據,也可能需要從文件中隨機讀取數 據。由于服務器必須同時為眾多客戶端提供讀盤服務,因此服務器的讀盤能力 是限制服務器綜合性能的關鍵因素。
計算機從磁盤讀取數據是一項耗時的操作,這個時間主要為尋道時間,即 將磁頭移動到指定磁道所需時間,而在已經完成磁頭尋道的前提下,讀取一個 扇區的數據和讀取多個連續扇區消耗的時間相差并不大。計算機訪問內存的速 度比訪問磁盤的速度快很多,為了提高讀盤的效率,計算機在上層用戶的讀盤 操作與實際的磁盤操作之間添加了一個"數據緩沖區",利用這個數據緩沖區 來實現磁盤操作性能的優化一一計算機先將磁盤讀取的數據保存在數據緩沖 區,然后再從數據緩沖區復制至用戶緩存。由于計算機的文件系統在將文件寫 入磁盤時盡可能保證該文件所占的扇區序號連續或者靠近,并且很多情況下對 文件的讀取為順序讀,因此從磁盤中讀所需扇區數據的同時,"順便"將屬于 該文件的一些后續扇區數據讀入數據緩沖區能夠顯著提高磁盤讀數據的性能, 此即文件系統的預讀才幾制。
對于文件的順序讀來說,利用文件系統的預讀機制能夠顯著提高讀盤效 率,但對于文件隨機讀取較多的互聯網應用場景,文件系統的預讀機制頻繁失 效,不僅增加了服務器響應客戶端的時間,而且加重了服務器的讀盤負擔,嚴重影響服務器的讀盤性能。
影響服務器讀盤性能的另外一個重要因素是讀盤方式的選擇選擇同步讀 還是異步讀。對于同步讀方式,無論是Linux中使用的讀盤函數read ()還是 Windows中使用的讀盤函數ReadFile (),都是以一種堵塞的方式從磁盤讀取 數據一一堵塞當前線程直至所需數據讀至用戶緩存。由于服務器同時要為成千 上萬的客戶端提供讀盤服務,因此每個讀盤線程中會累積多個讀盤請求,而堵 塞的read ( ) /ReadFile ()操作會導致讀盤線程中其他的讀盤請求也處于等待 狀態,不僅影響服務器的讀盤能力,而且影響服務器響應客戶端請求的速度。 服務器為了提高讀盤能力,必然需要增加讀盤線程的數目,但讀盤線程數目的 增加引起線程上下文頻繁切換,導致大量的線程切換開銷,更嚴重的是讀盤線 程之間的互相干擾一一這是因為一個磁盤上能夠提交的讀盤請求數目是有限 的,當磁盤上的讀盤請求隊列已滿時,則調用read ( ) /ReadFile ()的線程會 被掛起,當讀盤請求隊列有空位時休眠的讀盤線程會被喚醒并對請求隊列的空 位展開資源竟爭,從而消耗大量的CPU資源,因此服務器以同步讀的方式從 磁盤讀取數據來滿足眾多客戶端同時發出的讀盤請求就不是一個好的選擇。
發明內容
本發明實施例4是供一種讀取數據的方法,用以改善讀盤性能,該方法包括 接收讀取數據的請求;
檢查所請求的數據是否在文件緩存池中,所述文件緩存池以文件劃分的文 件塊為單位緩存數據,并且緩存的數據為文件的所有用戶共享; 若是,則直接從所述文件緩存池讀取所請求的數據; 若否,則發起異步輸入輸出IO讀盤請求。 較佳的,接收讀取數據的請求,是指 接收客戶端發出的讀盤請求。
較佳的,所述文件緩存池中文件塊的數量根據用戶的數量確定。較佳的,所述文件緩存池中文件塊的大小根據如下因素其中之一或任意組
合進4于確定
數據讀取過程中隨機讀和順序讀的比例、所請求的數據大小、服務器的讀 盤能力、文件緩存池的緩存Cache命中率、讀盤的響應速度。
較佳的,文件塊的大小為64K 256K。
較佳的,發起異步IO讀盤請求之后,進一步包括
創建后臺線程,并將異步IO讀盤請求列入等待隊列;
后臺線程順序將等待隊列中的異步10讀盤請求提交操作系統處理,并在 操作系統每處理完成一個異步10讀盤請求后,向發出讀取數據的請求端發出 讀盤通知。
本發明實施例還提供一種讀取數據的裝置,用以改善讀盤性能,該裝置包
括
接收模塊,用于接收讀取數據的請求;
檢查模塊,用于檢查所請求的數據是否在文件緩存池中,所述文件緩存池 以文件劃分的文件塊為單位緩存數據,并且緩存的數據為文件的所有用戶共 享;
執行模塊,用于在檢查模塊確定所請求的數據在文件緩存池中時,直接從 所述文件緩存池讀取所請求的數據;在檢查模塊確定所請求的數據不在文件緩 存池中時,發起異步IO讀盤請求。
較佳的,所述接收模塊進一步用于接收客戶端發出的讀盤請求。 較佳的,所述文件緩存池中文件塊的大小根據如下因素其中之一或任意組 合進行確定
數據讀取過程中隨機讀和順序讀的比例、所請求的數據大小、服務器的讀 盤能力、文件緩存池的Cache命中率、讀盤的響應速度。 較佳的,該裝置還包括
異步處理模塊,用于創建后臺線程,并將異步IO讀盤請求列入等待隊列;觸發后臺線程順序將等待隊列中的異步IO讀盤請求提交操作系統處理,并在
操作系統每處理完成一個異步IO讀盤請求后,向發出讀取數據的請求端發出 讀盤通知。
本發明實施例在進行數據讀取處理時,接收讀取數據的請求;檢查所請求 的數據是否在文件緩存池中,所述文件緩存池以文件劃分的文件塊為單位緩存 數據,并且緩存的數據為文件的所有用戶共享;若是,則直接從所述文件緩存 池讀取所請求的數據;若否,則發起異步IO讀盤請求,從而通過文件緩存池 保存從磁盤讀取的數據,讓多個用戶共享緩存池,可以提高Cache的命中率, 同時滿足文件順序讀和隨機讀的需求;并且,通過發起異步10讀盤請求,以 一種非堵塞的異步方式實現從磁盤讀取數據,可以使服務器對讀取數據的請求 及時做出響應。利用本發明實施例進行數據讀取,無論是文件的順序讀還是隨 機讀,都具有良好的讀盤性能。
圖1為本發明實施例中讀取數據的方法流程圖2為本發明實施例中文件緩存池的示意圖3為本發明實施例中讀取數據的一個具體實例的流程圖4為本發明實施例中對異步IO讀盤請求進行處理的流程圖5、圖6為本發明實施例中讀取數據的裝置結構圖。
具體實施例方式
下面結合說明書附圖對本發明實施例進行詳細說明。 如圖l所示,本發明實施例中讀取數據的方法流程如下 步驟IOI、接收讀取數據的請求。
步驟102、 ^r查所請求的數據是否在文件緩存池中,所述文件緩存池以文 件劃分的文件塊為單位緩存數據,并且緩存的數據為文件的所有用戶共享;若是,則執行步驟103;若否,則執行步驟104。
步驟103、直接從所述文件緩存池讀取所請求的數據。 步驟104、發起異步IO (Input Output,輸入輸出)讀盤請求。 本發明實施例中的文件緩存池如圖2所示,在文件緩存池中, 一個文件被 劃分為多個"文件塊",多個"文件塊"組成該文件的緩存池,這個緩存池內 保存的數據為該文件的所有用戶共享,文件緩存池以文件塊為單位緩存、讀取 數據。文件緩存池為在內存中劃分的一定大小的存儲區域。通常在例如多源下 載的應用中,可將需下載的文件分為多個文件塊,需要下載數據的客戶端分別 從多個服務器獲取數據,而從每個服務器只獲取部分文件塊對應的數據。
當客戶端需要讀取文件的數據時,可利用函數"OpenO" ( Linux函數)或 "ReadFile()" ( windows函數)打開文件并可添加O—DIRECT選項,而不使用 計算機文件系統自帶的數據緩存區,以避免從數據緩存區至用戶緩存的數據拷 貝操作。在文件緩存池中, 一個文件可對應一個文件緩存池,所有讀取同一個 文件的用戶共享該緩存池。 一個文件對應的緩存池中并不一定存儲了該文件的 全部文件塊,文件緩存池中的文件塊數量根據用戶的數量確定,較佳的,隨著 需獲取該文件的用戶數增加,文件緩存池中包括的文件塊數量可以相應增加, 例如文件每增加一個用戶,將該文件多劃分出多個文件塊,則該文件有更多的 文件塊保存在文件緩存池中,服務器直接從文件緩存池中讀取數據的概率增 加,從而提高服務器的讀盤性能。在某些情況下,若請求的所有數據都被保存 在文件緩存池中,此時服務器可以直接從文件塊中讀取數據,大大提高服務器 響應客戶端的速度。
在文件緩存池中,文件塊的大小可配置。文件塊大小的配置受很多因素的 影響,例如可以根據如下因素其中之一或任意組合進行確定數據讀取過程中 隨機讀和順序讀的比例、所請求的數據大小、服務器的讀盤能力、文件緩存池 的緩存(Cache)命中率、讀盤的響應速度。例如,在配置文件塊大小時,文 件塊的大小直接影響服務器的讀盤能力一一過大的文件塊雖然使服務器的讀盤能力增加,但文件緩存池的Cache命中率可能降低,讀盤浪費嚴重,并且讀 盤的延遲增加;過小的文件塊雖然能夠提高文件緩存池的Cache命中率,提升 讀盤的響應速度,但服務器讀盤的能力卻降低,因此文件塊大小的選擇要仔細 權衡,推薦的文件塊大小在64K ~ 256K。
一個實施例中,步驟101的接收讀取數據的請求,可以是接收客戶端發 出的讀盤請求。如圖3所示,該實施例的流程示意如下 步驟301、接收到客戶端發出的讀盤請求。 步驟302、檢查請求的數據是否在文件緩存池中。 步驟303、如果請求的數據在文件緩存池中,則直接讀耳又數據。 步驟304、如果請求的數據不在緩存池中,則創建新的異步IO讀盤請求。 步驟305、將創建好的異步IO讀盤請求發出。
如果請求的數據不在文件緩存池中,則需要創建新的異步IO讀盤請求。 在一些情況下,請求的數據跨越多個連續的文件塊,則需要創建多個異步IO 讀盤請求。
本發明實施例采用異步的方式從磁盤讀取數據,即當有多個客戶端同時請 求獲取數據時,具體的讀盤操作由后臺線程完成。則在發起IO讀盤請求之后, 還包括創建后臺線程,并將異步10讀盤請求列入等待隊列;后臺線程順序 將等待隊列中的異步10讀盤請求提交操作系統處理,并在操作系統每處理完 成一個異步IO讀盤請求后,向發起讀盤請求方發出讀盤通知。
一般情況下需要創建多個后臺線程,每個后臺線程包括一個等待隊列,用 于保存接收的異步10讀盤請求(每個異步10讀盤請求包含了請求獲取數據的 客戶端信息)。由于后臺線程有多個,則需要將創建的異步IO讀盤請求放入合 適的后臺線程等待隊列中。后臺線程啟動后,循環處理如下兩件事情第一、 查詢等待隊列中是否有未處理的異步IO讀盤請求,如果有,就提交給操作系 統處理;第二、后臺線程查詢以前提交的異步10讀盤請求是否已經由操作系 統完成,如果有異步IO讀盤請求處理完成,則發出讀盤通知,通知客戶端從文件緩存池中讀取數據。
如圖4所示,對異步IO讀盤請求的處理過程如下
步驟401、創建后臺線程,專門處理接收的異步IO讀盤請求,其中后臺線 程包括一個等待隊列,用于保存接收的異步IO讀盤請求。
步驟402、后臺線程檢查等待隊列中是否有未處理的異步IO讀盤請求。如 果等待隊列中沒有未處理的異步IO讀盤請求,則直接跳到步驟404處理。如 果等待隊列中有未處理的異步10讀盤請求,則執行步驟403。
步驟403 、后臺線程提交順序在最前的未處理異步IO讀盤請求給操作系統 處理。
步驟404、后臺線程檢查以前提交給操作系統處理的異步10讀盤請求是否 有已被處理完成的。如果沒有異步10讀盤請求被處理完成,則直接返回到步 驟402進行循環處理;如果有異步IO讀盤請求完成,則執行步驟405。
步驟405、發出讀盤通知,通知客戶端從文件緩存池讀取數據,并返回到 步驟402循環處理。
本領域普通技術人員可以理解上述實施例方法中的全部或部分步驟是可 以通過程序來指令相關的硬件完成,該程序可以存儲于一計算機可讀存儲介質 中,存儲介質可以包括ROM、 RAM、磁盤或光盤等。
基于同一發明構思,本發明實施例還提供一種讀取數據的裝置,其結構如 圖5所示,可以包括
接收模塊501 ,用于接收讀取數據的請求;
檢查模塊502,用于檢查所請求的數據是否在文件緩存池中,所述文件緩 存池以文件劃分的文件塊為單位緩存數據,并且緩存的數據為文件的所有用戶
共享;
執行模塊503,用于在檢查模塊確定所請求的數據在文件緩存池中時,直 接從所述文件緩存池讀取所請求的數據;在檢查模塊確定所請求的數據不在文 件緩存池中時,發起異步IO讀盤請求。一個實施例中,接收模塊501還可以用于接收客戶端發出的讀盤請求。 一個實施例中,文件緩存池中文件塊的大小根據如下因素其中之一或任意
組合進4于確定
數據讀取過程中隨機讀和順序讀的比例、所請求的數據大小、服務器的讀 盤能力、文件緩存池的緩存Cache命中率、讀盤的響應速度。
如圖6所示, 一個實施例中,圖5所示的讀取數據的裝置還可以包括 異步處理模塊504,用于創建后臺線程,并將異步IO讀盤請求列入等待隊 列;觸發后臺線程順序將等待隊列中的異步IO讀盤請求提交操作系統處理, 并在操作系統每處理完成一個異步10讀盤請求后,向發出讀:f又數據的請求端 發出讀盤通知。
本發明實施例在進行數據讀取處理時,接收讀取數據的請求;檢查所請求 的數據是否在文件緩存池中,所述文件緩存池以文件劃分的文件塊為單位緩存 數據,并且緩存的數據為文件的所有用戶共享;若是,則直接從所述文件緩存 池讀取所請求的數據;若否,則發起異步IO讀盤請求,從而通過文件緩存池 保存從磁盤讀取的數據,讓多個用戶共享緩存池,可以提高Cache的命中率, 同時滿足文件順序讀和隨機讀的需求;并且,通過發起異步IO讀盤請求,以 一種非堵塞的異步方式實現從磁盤讀取數據,可以使服務器對讀取數據的請求 及時做出響應。利用本發明實施例進行數據讀取,無論是文件的順序讀還是隨 機讀,都具有良好的讀盤性能。
顯然,本領域的技術人員可以對本發明進行各種改動和變型而不脫離本發
明的精神和范圍。這樣,倘若對本發明的這些修改和變型屬于本發明權利要求 及其等同技術的范圍之內,則本發明也意圖包含這些改動和變型在內。
權利要求
1、一種讀取數據的方法,其特征在于,該方法包括接收讀取數據的請求;檢查所請求的數據是否在文件緩存池中,所述文件緩存池以文件劃分的文件塊為單位緩存數據,并且緩存的數據為文件的所有用戶共享;若是,則直接從所述文件緩存池讀取所請求的數據;若否,則發起異步輸入輸出IO讀盤請求。
2、 如權利要求l所述的方法,其特征在于,接收讀取數據的請求,是指 接收客戶端發出的讀盤請求。
3、 如權利要求1所述的方法,其特征在于,所述文件緩存池中文件塊的 數量根據用戶的數量確定。
4、 如權利要求1所述的方法,其特征在于,所述文件緩存池中文件塊的 大小根據如下因素其中之一或任意組合進行確定數據讀取過程中隨機讀和順序讀的比例、所請求的數據大小、服務器的讀 盤能力、文件緩存池的緩存Cache命中率、讀盤的響應速度。
5、 如權利要求4所述的方法,其特征在于,文件塊的大小為64K 256K。
6、 如權利要求1至5任一項所述的方法,其特征在于,發起異步IO讀盤 請求之后,進一步包括創建后臺線程,并將異步10讀盤請求列入等待隊列;后臺線程順序將等待隊列中的異步10讀盤請求提交操作系統處理,并在 操作系統每處理完成一個異步IO讀盤請求后,向發出讀取數據的請求端發出 讀盤通知。
7、 一種讀取數據的裝置,其特征在于,包括 接收模塊,用于接收讀取數據的請求;檢查模塊,用于檢查所請求的數據是否在文件緩存池中,所述文件緩存池以文件劃分的文件塊為單位緩存數據,并且緩存的數據為文件的所有用戶共享;執行模塊,用于在檢查模塊確定所請求的數據在文件緩存池中時,直接從 所述文件緩存池讀取所請求的數據;在檢查模塊確定所請求的數據不在文件緩 存池中時,發起異步IO讀盤請求。
8、 如權利要求7所述的裝置,其特征在于,所述接收模塊進一步用于接 收客戶端發出的讀盤請求。
9、 如權利要求7所述的裝置,其特征在于,所述文件緩存池中文件塊的 大小根據如下因素其中之一或任意組合進行確定數據讀取過程中隨機讀和順序讀的比例、所請求的數據大小、服務器的讀 盤能力、文件緩存池的Cache命中率、讀盤的響應速度。
10、 如權利要求7所述的方法,其特征在于,所述文件緩存池中文件塊的 數量根據用戶的數量確定。
11、 如權利要求7至IO任一項所述的裝置,其特征在于,還包括 異步處理模塊,用于創建后臺線程,并將異步IO讀盤請求列入等待隊列;觸發后臺線程順序將等待隊列中的異步10讀盤請求提交操作系統處理,并在 操作系統每處理完成一個異步10讀盤請求后,向發出讀取數據的請求端發出 讀盤通知。
全文摘要
本發明公開了一種讀取數據的方法,該方法包括接收讀取數據的請求;檢查所請求的數據是否在文件緩存池中,所述文件緩存池以文件劃分的文件塊為單位緩存數據,并且緩存的數據為文件的所有用戶共享;若是,則直接從所述文件緩存池讀取所請求的數據;若否,則發起異步輸入輸出IO讀盤請求。本發明同時公開一種讀取數據的裝置。利用本發明實施例進行數據讀取,無論是文件的順序讀還是隨機讀,都具有良好的讀盤性能。
文檔編號G06F17/30GK101441655SQ200810187559
公開日2009年5月27日 申請日期2008年12月24日 優先權日2008年12月24日
發明者王衛華 申請人:深圳市迅雷網絡技術有限公司