專利名稱:用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信領(lǐng)域,尤其涉及用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法和裝置。
技術(shù)背景
目前,磁盤依然是計算機系統(tǒng)的主要存儲介質(zhì)。然而,隨著技術(shù)的日新月異,磁盤面臨著其輸入/輸出anput/Output,I/O)帶寬比不上中央處理器(Central Processing Unit,CPU) /內(nèi)存的發(fā)展速度和磁盤的訪問延遲與CPU/內(nèi)存的讀寫速度差距日益擴大的兩大挑戰(zhàn)。在CPU速度、磁盤傳輸速度和磁盤I/O訪問速度三者中,磁盤I/O訪問速度的提高最緩慢,特別地,磁盤I/O訪問速度與CPU的速度差距越來越大,磁盤I/O訪問時延已經(jīng)成為制約系統(tǒng)I/O性能的一個最主要的瓶頸。在操作系統(tǒng)層面,異步化是一種非常有效的I/ 0性能優(yōu)化策略,數(shù)據(jù)預(yù)取則是實現(xiàn)I/O的異步化的常用方法。
所謂數(shù)據(jù)預(yù)取,是指系統(tǒng)在后臺提前進行I/O操作,將所需數(shù)據(jù)提前加載到內(nèi)存, 以隱藏應(yīng)用程序的I/O延遲,從而可以有效地提高計算機系統(tǒng)的利用率。與傳統(tǒng)的串行處理相比,數(shù)據(jù)預(yù)取提供的異步操作策略可以消除CPU的等待時間,使CPU與磁盤能并行工作,進而從整體上提高系統(tǒng)的I/O性能。數(shù)據(jù)預(yù)取采用模式匹配的方法,即,通過監(jiān)測應(yīng)用程度對各個文件的訪問序列,維護其歷史訪問記錄,并將其與識別出來的模式逐一進行模式匹配。如果符合某一訪問模式的行為特征,即可依此進行數(shù)據(jù)的預(yù)測和預(yù)取。具體的實現(xiàn)技術(shù)包括啟發(fā)式預(yù)取和知情式預(yù)取,其中,啟發(fā)式預(yù)取對上層應(yīng)用是透明的,通過自動觀測程序的歷史訪問記錄,分析其I/O特征,獨立自主地預(yù)測并預(yù)取即將被訪問的數(shù)據(jù)塊。
Linux內(nèi)核2. 6. 23之后的版本提供了一種基于啟發(fā)式的按需預(yù)取算法,它工作在虛擬文件系統(tǒng)(Virtual File System, VFS)層,對上統(tǒng)一地服務(wù)于各種文件讀取操作(通過系統(tǒng)調(diào)用API),對下獨立于具體的文件系統(tǒng)。按需預(yù)取算法引入了頁面狀態(tài)和頁面緩存狀態(tài),采用寬松的順序性判決條件,對順序性I/O操作提供有效的支持,包括異步/非阻塞 I/O、多線程交織I/O、順序隨機混合I/O、大規(guī)模并發(fā)I/O等多種操作。當(dāng)應(yīng)用程序要進行數(shù)據(jù)的訪問時,通過系統(tǒng)調(diào)用接口,經(jīng)由頁面緩存訪問一個磁盤文件。內(nèi)核對這一標(biāo)準(zhǔn)文件訪問路徑調(diào)用預(yù)取算法,跟蹤應(yīng)用程序的訪問序列,并進行恰當(dāng)?shù)念A(yù)取。具體地,Linux提供的基于啟發(fā)式的按需預(yù)取算法主要通過監(jiān)控應(yīng)用程序的讀請求和頁面緩存來判定應(yīng)用程序的訪問模式,再根據(jù)訪問模式來決定預(yù)取的位置和大小等。預(yù)取框架大致可分為兩大部分監(jiān)控部分和判斷處理部分,其中,監(jiān)控部分嵌入在d0_generiC_file_read()函數(shù)等讀請求響應(yīng)歷程中,檢測請求中的每一個頁面是否已經(jīng)在文件緩存地址空間中,如果沒有,則申請一個新的頁面,同時應(yīng)用程序被臨時掛起而等待I/O加載該頁面,進行同步預(yù)讀。如果該新頁面的偏移量正好是預(yù)讀參數(shù)async_size指向的位置,則為該頁面置預(yù)取標(biāo)記(PG_ readahead)。在后續(xù)的數(shù)據(jù)預(yù)取過程中,當(dāng)檢測到預(yù)取標(biāo)記頁面(PGjeadahead page), 則意味著下一個預(yù)取I/O的時機已經(jīng)到來,系統(tǒng)進行異步預(yù)讀。匹配部分位于ondemancL readahead()函數(shù),在邏輯上由一組獨立的判決模塊組成,判斷是否是文件開始讀、小文件讀、順序讀和隨機讀。按需預(yù)取框架支持順序讀和隨機讀兩種訪問模式,對小文件讀則采取簡單的拋棄,不進行數(shù)據(jù)預(yù)取。
無論是Linux內(nèi)核2. 6. 23之后版本提供的基于啟發(fā)式的按需預(yù)取算法還是其他數(shù)據(jù)預(yù)取技術(shù),在設(shè)計之初,都是面向單處理器系統(tǒng)的。由于單處理器系統(tǒng)本身受到處理器的計算能力、存儲器容量和帶寬等因素的限制,因此,對應(yīng)的數(shù)據(jù)預(yù)取設(shè)計得相對比較保守,尤其是預(yù)取量管理部分以初次讀請求的頁面大小為基準(zhǔn),采取以2為因子的倍增策略并設(shè)定上限窗口。
隨著科學(xué)計算、事務(wù)處理對計算機性能要求的不斷提高,對稱多處理器 (Symmetrical Multi-Processing, SMP)系統(tǒng)的應(yīng)用越來越廣泛,規(guī)模也越來越大。非一致性內(nèi)存訪問(Non-Uniform Memory Access, NUMA)的多處理器系統(tǒng)是由若干通過高速專用網(wǎng)絡(luò)連接起來的獨立節(jié)點構(gòu)成的系統(tǒng),各個節(jié)點可以是單個的CPU或是SMP系統(tǒng)。NUMA系統(tǒng)作為分布式共享存儲器結(jié)構(gòu)一類,同時結(jié)合了 SMP系統(tǒng)易編程性和分布式存儲系統(tǒng)高可擴展性的優(yōu)點,已成為當(dāng)今高性能服務(wù)器的主流體系結(jié)構(gòu)之一。
基于分布式共享內(nèi)存的NUMA架構(gòu)的多處理器系統(tǒng)在CPU訪問隊列控制、內(nèi)存訪問控制和節(jié)點負(fù)載平衡等體系架構(gòu)上與單處理器系統(tǒng)有很大的區(qū)別,針對單處理器系統(tǒng)的數(shù)據(jù)預(yù)取已經(jīng)不能滿足NUMA架構(gòu)的多處理器系統(tǒng)環(huán)境。如果將Linux系統(tǒng)部署在分布式共享內(nèi)存的NUMA架構(gòu)服務(wù)器上,由于Linux系統(tǒng)提供的預(yù)取量管理方法沒有綜合考慮NUMA 架構(gòu)服務(wù)器特有的性質(zhì),例如,CPU負(fù)載、節(jié)點剩余內(nèi)存大小和全局剩余內(nèi)存大小等影響因素,因此,這種針對單處理器系統(tǒng)的數(shù)據(jù)預(yù)取的實際運行效果不能達(dá)到最優(yōu)。例如,多個處理器同時訪問文件時,如果仍然按照針對單處理器系統(tǒng)設(shè)計的預(yù)取數(shù)據(jù)量去預(yù)取數(shù)據(jù),則可能導(dǎo)致磁盤系統(tǒng)負(fù)載過重;又如,當(dāng)NUMA架構(gòu)的節(jié)點本地剩余內(nèi)存較少時,如果仍然按照針對單處理器系統(tǒng)設(shè)計的預(yù)取數(shù)據(jù)量去預(yù)取數(shù)據(jù),由于NUMA架構(gòu)分布式內(nèi)存的特性導(dǎo)致訪問遠(yuǎn)端內(nèi)存延遲較大,很有可能在節(jié)點本地內(nèi)存中的數(shù)據(jù)尚未取走(沒有被訪問遠(yuǎn)端內(nèi)存的節(jié)點取走)時,預(yù)取回的數(shù)據(jù)進一步加劇了對節(jié)點本地剩余內(nèi)存的占用。發(fā)明內(nèi)容
本發(fā)明實施例提供用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法和裝置,以提高NUMA 架構(gòu)下文件預(yù)取的可靠性和準(zhǔn)確率。
本發(fā)明實施例提供一種用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法,所述方法包括
根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r ;
求取前一次預(yù)取窗口的大小Iiprev size、預(yù)取量最大倍增倍數(shù)Ts。-以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積;
比較設(shè)定的最大預(yù)取量MAX_dahead和所述的大小,以所述MAXreadahead和所述中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
本發(fā)明實施例提供一種用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置,所述裝置包括
數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊,用于根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取數(shù)據(jù)預(yù)取量參數(shù)因子r ;
預(yù)取量窗口倍增模塊,用于求取前一次預(yù)取窗口的大小Rpra size、預(yù)取量每次最大倍增倍數(shù)Tsrale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積;
預(yù)取量窗口獲取模塊,用于比較設(shè)定的最大預(yù)取量MAX—d和所述的大小, 以所述MAX_datead和所述中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
從上述本發(fā)明實施例可知,在根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取了數(shù)據(jù)預(yù)取量參數(shù)因子r后,即可由前一次預(yù)取窗口的大小size、預(yù)取量最大倍增倍數(shù)Ts。-和所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積與設(shè)定的最大預(yù)取量MAXreadatead的大小關(guān)系確定本次預(yù)取窗口的大小,最終按照確定出的預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。由于表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)與當(dāng)前操作系統(tǒng)的輸入/輸出I/O隊列相關(guān),并且,是數(shù)據(jù)預(yù)取量參數(shù)因子r根據(jù)進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取,因此,與現(xiàn)有技術(shù)提供的針對單處理器的數(shù)據(jù)預(yù)取算法相比,本發(fā)明實施例提供的數(shù)據(jù)預(yù)取方法綜合考慮了磁盤I/O負(fù)載和節(jié)點內(nèi)存剩余大小等影響系統(tǒng)性能的因素,即,在磁盤I/O負(fù)載較輕、節(jié)點剩余內(nèi)存較多時,適當(dāng)?shù)財U大數(shù)據(jù)預(yù)取量,有利于隱藏數(shù)據(jù)1/0,當(dāng)磁盤I/O負(fù)載較重、節(jié)點剩余內(nèi)存較少時,適當(dāng)?shù)販p小數(shù)據(jù)預(yù)取量,有利于節(jié)省系統(tǒng)資源。
為了更清楚地說明本發(fā)明實施例的技術(shù)方案,下面將對現(xiàn)有技術(shù)或?qū)嵤├枋鲋兴枰褂玫母綀D作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域技術(shù)人員來講,還可以如這些附圖獲得其他的附圖。
圖1是本發(fā)明實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法流程示意圖2是數(shù)據(jù)預(yù)取算法的一般設(shè)計原理示意圖3是數(shù)據(jù)預(yù)取算法的工作層次示意圖4是數(shù)據(jù)預(yù)取算法中預(yù)取窗口示意圖5是本發(fā)明實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置結(jié)構(gòu)示意圖6是本發(fā)明另一實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置結(jié)構(gòu)示意圖7是本發(fā)明另一實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置結(jié)構(gòu)示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域技術(shù)人員所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
請參閱附圖1,是本發(fā)明實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法流程示意圖,主要包括步驟
S101,根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r。
需要說明的是,NUMA系統(tǒng)雖然包含多個節(jié)點,但只運行一個操作系統(tǒng),因此,數(shù)據(jù)預(yù)取是針對整個操作系統(tǒng)而言。在本發(fā)明實施例中,所述表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)與當(dāng)前操作系統(tǒng)的輸入/輸出I/O隊列相關(guān)。所謂“當(dāng)前操作系統(tǒng)的I/O隊列”,是指由I/0隊列由操作系統(tǒng)管理且當(dāng)前對磁盤訪問的I/O隊列,即,當(dāng)前NUMA系統(tǒng)中有多少個讀寫隊列正在對磁盤進行訪問。
為了便于說明節(jié)點的空閑預(yù)取緩沖區(qū)容量,此處以Linux系統(tǒng)為例,就數(shù)據(jù)預(yù)取算法的設(shè)計原理以及工作層次,對數(shù)據(jù)預(yù)取算法進行簡單介紹。Linux內(nèi)核在完成對數(shù)據(jù)的讀取之后,會將它最近訪問過的文件頁面緩存到內(nèi)存中一段時間,這段緩存文件頁面的內(nèi)存被稱為頁面緩存(page cache)。通常情況下所說到的數(shù)據(jù)讀取(通過系統(tǒng)的“read() ”這個API)發(fā)生在應(yīng)用程序緩沖區(qū)(Application Buffer)與頁面緩存(page cache)之間,如附圖2所示,而數(shù)據(jù)預(yù)取算法則負(fù)責(zé)從磁盤中讀取數(shù)據(jù)填充頁面緩存(page cache) 0應(yīng)用程序從頁面緩存讀取到應(yīng)用程序緩沖區(qū)時,其讀取顆粒一般都比較小,例如,文件拷貝命令的讀寫粒度一般是4KByte (千字節(jié)),內(nèi)核的數(shù)據(jù)預(yù)取則會以它認(rèn)為更合適的大小,例如, 16KByte (千字節(jié))至U8KByte (千字節(jié))將數(shù)據(jù)從磁盤中填充至頁面緩存(page cache)。 至于數(shù)據(jù)預(yù)取算法的工作層次,可以參閱附圖3。數(shù)據(jù)預(yù)取算法工作于VFS層,對上統(tǒng)一地服務(wù)于各種文件讀取操作(系統(tǒng)調(diào)用API),對下獨立于具體的文件系統(tǒng)。當(dāng)應(yīng)用程序通過 read (), pread (), readv (), al/0_read ()、sendfileO 和 splice ()等不同的系統(tǒng) API 請求讀取文件數(shù)據(jù)時,都會進入統(tǒng)一的讀請求處理函數(shù)d0_generiC_file_read()。這個函數(shù)從頁面緩存中取出數(shù)據(jù)來滿足應(yīng)用程序的請求,并在適當(dāng)?shù)臅r候調(diào)用預(yù)讀例程進行必要的預(yù)讀I/O。預(yù)讀算法發(fā)出的預(yù)讀I/O請求交由_d0_page_cache_readahead()進行預(yù)處理,該函數(shù)檢查請求中的每一個頁面是否已經(jīng)在文件緩存地址空間中,如果沒有的話就申請一個新頁面。如果該新頁面的偏移量正好是預(yù)讀參數(shù)aSynC_SiZe指向的位置,則為該頁面置 PG_readahead標(biāo)記。最后,所有的新頁面被傳給reacLpages (),它們在這里被逐個加入內(nèi)存中radix tree和inactive_list,并調(diào)用所在文件系統(tǒng)的readpage (),將頁面交付I/O。
在本發(fā)明實施例中,節(jié)點的預(yù)取緩沖區(qū)就是系統(tǒng)分配給節(jié)點的、一段用于緩存節(jié)點內(nèi)核最近訪問過的文件頁面的內(nèi)存,即頁面緩存(page cache),而節(jié)點的空閑預(yù)取緩沖區(qū)也就是除去頁面緩存(page cache)中被已經(jīng)預(yù)取到的數(shù)據(jù)占用的內(nèi)存之后剩余的內(nèi)存。 節(jié)點的空閑預(yù)取緩沖區(qū)容量也是影響數(shù)據(jù)預(yù)取量大小的因素之一。
S102,求取前一次預(yù)取窗口的大小size、預(yù)取量最大倍增倍數(shù)Tseale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積&ize。
在數(shù)據(jù)預(yù)取算法中,當(dāng)某個進程所屬的一個運行在節(jié)點上的線程讀取文件時,每當(dāng)發(fā)出一個數(shù)據(jù)預(yù)取請求,數(shù)據(jù)預(yù)取算法都會以一個稱為“預(yù)取窗口”的數(shù)據(jù)結(jié)構(gòu)來記錄該數(shù)據(jù)預(yù)取請求以表明請求預(yù)取的數(shù)據(jù)長度,如附圖4所示。起點(start)和大小(size)構(gòu)成一個預(yù)取窗口,記錄了最近一次預(yù)取請求的位置和大小,aSynC_SiZe指示了異步預(yù)取的位置提前量。PG_readahead page是在上一次預(yù)取I/O中設(shè)置的,指示應(yīng)用程序已經(jīng)用盡了足夠的提前讀窗口,進行下一個預(yù)取I/O的時機已經(jīng)到來,啟動異步預(yù)讀以讀取更多的文件頁面。因此,通過記錄的數(shù)據(jù)預(yù)取請求,很容易獲取前一次預(yù)取窗口的大小size。
需要說明的是,若進程是初次對文件訪問,即不存在之前記錄的預(yù)取窗口,因此, 在這種情形下,可以將預(yù)取窗口大小設(shè)置為比初次請求預(yù)取的數(shù)據(jù)長度大,例如,可以將預(yù)取窗口大小設(shè)置為初次請求預(yù)取的數(shù)據(jù)長度的2倍。當(dāng)然,也可以設(shè)置為其他倍數(shù),原則上只要比初次請求預(yù)取的數(shù)據(jù)長度大即可,本發(fā)明對此不做特別限制。
在本發(fā)明實施例中,預(yù)取量最大倍增倍數(shù)Tsrale用來限制每一次預(yù)取量倍增倍數(shù),可以由用戶根據(jù)實際情況設(shè)定。與前一次預(yù)取窗口的大小size、預(yù)取量每次最大倍增倍數(shù)Tscale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的關(guān)系為Size = Rprev_sizeXTscaleXr0
S103,比較設(shè)定的最大預(yù)取量MAXreadahead和所述Size的大小,以所述MAX—ad和所述中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
由于受預(yù)取緩沖區(qū)容量等各方面的限制,預(yù)取窗口的大小不可能無限地增大,例如,預(yù)取窗口的大小不可能按照sizeXTs。aleXr這一關(guān)系無限地增大,即,應(yīng)該對預(yù)取窗口的大小進行某種限制。
在本發(fā)明實施例中,可以由用戶設(shè)置一個最大預(yù)取量MAX_datead,然后,將 MAXreahahead與步驟S102中求取的Ssize ( Rprev_sizeXTscaleXr)進行比較,最終,以MAXreadahead和中的較小值作為預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
從上述本發(fā)明實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法可知,在根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取了數(shù)據(jù)預(yù)取量參數(shù)因子r后,即可由前一次預(yù)取窗口的大小Rpra size、預(yù)取量最大倍增倍數(shù)Ts。ale和所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積與設(shè)定的最大預(yù)取量MAX_datead 的大小關(guān)系確定本次預(yù)取窗口的大小,最終按照確定出的本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。由于表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)與當(dāng)前操作系統(tǒng)的輸入/輸出I/O隊列相關(guān),并且,是數(shù)據(jù)預(yù)取量參數(shù)因子r根據(jù)進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取,因此,與現(xiàn)有技術(shù)提供的針對單處理器的數(shù)據(jù)預(yù)取算法相比,本發(fā)明實施例提供的數(shù)據(jù)預(yù)取方法綜合考慮了磁盤I/O負(fù)載和節(jié)點內(nèi)存剩余大小等影響系統(tǒng)性能的因素,即,在磁盤I/O負(fù)載較輕、 節(jié)點剩余內(nèi)存較多時,適當(dāng)?shù)財U大數(shù)據(jù)預(yù)取量,有利于隱藏數(shù)據(jù)1/0,當(dāng)磁盤I/O負(fù)載較重、 節(jié)點剩余內(nèi)存較少時,適當(dāng)?shù)販p小數(shù)據(jù)預(yù)取量,有利于節(jié)省系統(tǒng)資源。
在本發(fā)明提供的一個實施例中,由表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取數(shù)據(jù)預(yù)取量參數(shù)因子r,可以通過以下方式實現(xiàn)
首先,根據(jù)表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重和進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重;然后,求取所述磁盤負(fù)載對預(yù)取量增長的權(quán)重與所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的差值,該差值即為數(shù)據(jù)預(yù)取量參數(shù)因子r。
在上述根據(jù)表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重的實施例中,可以通過調(diào)用I/O隊列獲取模塊獲取操作系統(tǒng)當(dāng)前I/O隊列的長度來實現(xiàn)。具體地,可以使用jprobe技術(shù)探測do_generic_make_request()函數(shù),從此函數(shù)中獲取系統(tǒng)當(dāng)前I/O隊列的長度,即正在使用的操作系統(tǒng)I/O隊列長度(通過探測d0_generiC_make_ request ()函數(shù)的參數(shù)count),也可以獲取操作系統(tǒng)限定的最大I/O隊列長度(通過探測 do_generic_make_request ()函數(shù)的參數(shù)max_io_length);然后,將所述操作系統(tǒng)當(dāng)前I/O 隊列的長度(記為QcotmJ與操作系統(tǒng)限定的最大I/O隊列長度(記為Qmax)的比值乘以第一可調(diào)因子(記為a)以獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重,即,磁盤負(fù)載對預(yù)取量增長的1aQcurrent/Qimx。
而在上述根據(jù)進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的實施例中,可以通過調(diào)用內(nèi)存獲取模塊獲取進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量來實現(xiàn)。具體地,將進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量(記為Ms)與所述進程所在節(jié)點總預(yù)取緩沖區(qū)容量(記為Mt。tal)的比值乘以第二可調(diào)因子(記為b) 以獲取所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重,即,進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重為bMs/Mt。tal。
此時,數(shù)據(jù)預(yù)取量參數(shù)因子r為磁盤負(fù)載對預(yù)取量增長的權(quán)重與進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的差值,即,r = aQ—zU^bMyMt^。
需要說明的是,在本發(fā)明實施例中,第一可調(diào)因子a和第二可調(diào)因子b可由用戶根據(jù)硬件環(huán)境和自身需求確定,其取值范圍在(0,1]。如果用戶不對第一可調(diào)因子a和第二可調(diào)因子b進行調(diào)整,則第一可調(diào)因子a和第二可調(diào)因子b可取缺省值1。從數(shù)據(jù)預(yù)取量參數(shù)因子r的表達(dá)式可知,第一可調(diào)因子a和第二可調(diào)因子b用于調(diào)節(jié)進程所在節(jié)點總預(yù)取緩沖區(qū)容量占用情況(即Ms/Mt。tal)和磁盤負(fù)載情況(即Q。umnt/Qmax)對預(yù)取量的影響權(quán)重,具體地,當(dāng)?shù)谝豢烧{(diào)因子a相對較大而第二可調(diào)因子b相對較小時,進程所在節(jié)點預(yù)取緩沖區(qū)空閑比例(即Ms/Mt。tal)對預(yù)取量影響相對較大;反之,當(dāng)?shù)谝豢烧{(diào)因子a相對較小而第二可調(diào)因子b相對較大時,磁盤負(fù)載情況(即Q。umnt/Qmax)對預(yù)取量影響相對較大。
為了實現(xiàn)資源的高效利用,服務(wù)器系統(tǒng)(可以是NUMA系統(tǒng)中的一個節(jié)點)中常常運行多個虛擬機,每個虛擬機中運行獨立的操作系統(tǒng)。在虛擬化系統(tǒng)中,前述實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法基本不變,不同之處在于,由于虛擬化I/O子系統(tǒng)的作用,每個虛擬機中運行獨立的操作系統(tǒng)可以擁有獨立的文件系統(tǒng),并獨立地進行I/O 隊列管理,因此,操作系統(tǒng)內(nèi)部的I/O隊列長度不能反映整個系統(tǒng)的磁盤I/O負(fù)載情況。此時,如果虛擬化系統(tǒng)提供獲取整個NUMA系統(tǒng)I/O隊列長度的調(diào)用接口,則I/O隊列獲取模塊就利用該調(diào)用接口獲取當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度,而不是從虛擬機中運行的獨立操作系統(tǒng)獲取當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度;如果虛擬化系統(tǒng)不提供此種調(diào)用接口,則從虛擬機中運行的操作系統(tǒng)中獲取當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度。具體地,對于虛擬化系統(tǒng)不提供調(diào)用接口的情形,可以調(diào)用虛擬化系統(tǒng)管理工具(例如,Hypervisor) 來獲得相關(guān)參數(shù)。Hypervisor等管理工具對運行于各個節(jié)點的虛擬化系統(tǒng)在內(nèi)存管理、通信等方面進行統(tǒng)一協(xié)調(diào),對內(nèi)存的分配和調(diào)度所采用的策略是公開的,具體實現(xiàn)如下,如果某一個節(jié)點上的虛擬化系統(tǒng)在運行預(yù)取軟件,可以首先獲取該節(jié)點的I/O隊列長度,根據(jù)管理工具(Hypervisor)的內(nèi)存調(diào)度策略推算出當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度(也即整個NUMA系統(tǒng)正在使用的I/O隊列長度)。
需要進一步說明的是,對于預(yù)取量最大倍增倍數(shù)Ts。ale,可由用戶根據(jù)進程所在節(jié)點總預(yù)取緩沖區(qū)容量大小和本系統(tǒng)主要應(yīng)用的特點來確定,即,如果進程所在節(jié)點分配的總預(yù)取緩沖區(qū)容量較大,主要的應(yīng)用具有連續(xù)順序讀文件的特征,則預(yù)取量最大倍增倍數(shù) Ts。ale可以設(shè)置為較大的值,以使得在允許的情況下,預(yù)取窗口能夠快速增長,提高數(shù)據(jù)預(yù)取命中率。
作為本發(fā)明一個實施例,預(yù)取量最大倍增倍數(shù)Ts。-的取值范圍可以為W,8],其中,符號“ □”表示閉區(qū)間;在
內(nèi),同樣遵循預(yù)取量最大倍增倍數(shù)Ts。-越大,所述預(yù)取量最大倍增倍數(shù)Ts。-的取值越大的原則。
綜合上述本發(fā)明提供的實施例可知,與現(xiàn)有技術(shù)提供的用于單處理器的數(shù)據(jù)預(yù)取算法相比,本發(fā)明提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法至少能夠帶來如下效果
第一,本發(fā)明沒有改變Linux內(nèi)核既有文件預(yù)取的基本框架,而是在其基礎(chǔ)上提出一種新的預(yù)取量管理策略,是對傳統(tǒng)數(shù)據(jù)預(yù)取算法的補強和專屬環(huán)境下的預(yù)取量管理的一種優(yōu)化,不會對系統(tǒng)的穩(wěn)定性造成影響;
第二,本發(fā)明綜合考慮了 NUMA系統(tǒng)在磁盤負(fù)載、內(nèi)存管理等影響文件預(yù)取效果的多個體系結(jié)構(gòu)特點,解決了 Linux內(nèi)核數(shù)據(jù)預(yù)取算法與之不匹配的問題,提高了數(shù)據(jù)預(yù)取的可靠性和準(zhǔn)確率;
第三,提出了主動性預(yù)測算法的數(shù)據(jù)預(yù)取量參數(shù)因子r,根據(jù)數(shù)據(jù)預(yù)取量與進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量的正相關(guān)關(guān)系,與NUMA系統(tǒng)磁盤負(fù)載的反相關(guān)關(guān)系,每次確定的數(shù)據(jù)預(yù)取量由NUMA系統(tǒng)當(dāng)前的磁盤負(fù)載、進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量大小和全局內(nèi)存大小共同確定,而不是簡單地以某個數(shù)字(例如,2或4)為系數(shù)進行倍增,實現(xiàn)了動態(tài)確定數(shù)據(jù)預(yù)取量參數(shù)因子r大小,科學(xué)有效低管理預(yù)取窗口大??;
第四,實現(xiàn)了動態(tài)和自適應(yīng)地預(yù)取數(shù)據(jù)大小及提前量,保證程序在任意時刻終止其順序、逆序訪問,預(yù)取命中率都在一個可接受的水平。
請參閱附圖5,是本發(fā)明實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置05 結(jié)構(gòu)示意圖。為了便于說明,僅僅示出了與本發(fā)明實施例相關(guān)的部分。附圖5示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置05包括數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊501、預(yù)取量窗口倍增模塊502和預(yù)取量窗口獲取模塊503,其中
數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊501,用于根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r,所述表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)與當(dāng)前操作系統(tǒng)輸入/輸出I/O隊列相關(guān)。
需要說明的是,NUMA系統(tǒng)雖然包含多個節(jié)點,但只運行一個操作系統(tǒng),因此,數(shù)據(jù)預(yù)取是針對整個操作系統(tǒng)而言。在附圖5所示實施例中,所述表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)與當(dāng)前操作系統(tǒng)的輸入/輸出I/O隊列相關(guān)。所謂“當(dāng)前操作系統(tǒng)的I/O隊列”,是指由I/O隊列由操作系統(tǒng)管理且當(dāng)前對磁盤訪問的I/O隊列,S卩,當(dāng)前NUMA系統(tǒng)中有多少個讀寫隊列正在對磁盤進行訪問。
為了便于說明節(jié)點的空閑預(yù)取緩沖區(qū)容量,此處以Linux系統(tǒng)為例,就數(shù)據(jù)預(yù)取算法的設(shè)計原理以及工作層次,對數(shù)據(jù)預(yù)取算法進行簡單介紹。Linux內(nèi)核在完成對數(shù)據(jù)的讀取之后,會將它最近訪問過的文件頁面緩存到內(nèi)存中一段時間,這段緩存文件頁面的內(nèi)存被稱為頁面緩存(page cache)。通常情況下所說到的數(shù)據(jù)讀取(通過系統(tǒng)的“read() ”這個API)發(fā)生在應(yīng)用程序緩沖區(qū)(Application Buffer)與頁面緩存(page cache)之間,如附圖2所示,而數(shù)據(jù)預(yù)取算法則負(fù)責(zé)從磁盤中讀取數(shù)據(jù)填充頁面緩存(page cache) 0應(yīng)用程序從頁面緩存讀取到應(yīng)用程序緩沖區(qū)時,其讀取顆粒一般都比較小,例如,文件拷貝命令的讀寫粒度一般是4KByte (千字節(jié)),內(nèi)核的數(shù)據(jù)預(yù)取則會以它認(rèn)為更合適的大小,例如, 16KByte (千字節(jié))至U8KByte (千字節(jié))將數(shù)據(jù)從磁盤中填充至頁面緩存(page cache)。 至于數(shù)據(jù)預(yù)取算法的工作層次,可以參閱附圖3。數(shù)據(jù)預(yù)取算法工作于VFS層,對上統(tǒng)一地服務(wù)于各種文件讀取操作(系統(tǒng)調(diào)用API),對下獨立于具體的文件系統(tǒng)。當(dāng)應(yīng)用程序通過 read (), pread (), readv (), al/0_read ()、sendfileO 和 splice ()等不同的系統(tǒng) API 請求讀取文件數(shù)據(jù)時,都會進入統(tǒng)一的讀請求處理函數(shù)d0_generiC_file_read()。這個函數(shù)從頁面緩存中取出數(shù)據(jù)來滿足應(yīng)用程序的請求,并在適當(dāng)?shù)臅r候調(diào)用預(yù)讀例程進行必要的預(yù)讀I/O。預(yù)讀算法發(fā)出的預(yù)讀I/O請求交由d0_page_cache_readahead()進行預(yù)處理,該函數(shù)檢查請求中的每一個頁面是否已經(jīng)在文件緩存地址空間中,如果沒有的話就申請一個新頁面。如果該新頁面的偏移量正好是預(yù)讀參數(shù)aSynC_SiZe指向的位置,則為該頁面置PG_ readahead標(biāo)記。最后,所有的新頁面被傳給reacLpages (),它們在這里被逐個加入內(nèi)存中 radix tree和inactive_list,并調(diào)用所在文件系統(tǒng)的readpage 0,將頁面交付I/O。
在附圖5所示實施例中,節(jié)點的預(yù)取緩沖區(qū)就是系統(tǒng)分配給節(jié)點的、一段用于緩存節(jié)點內(nèi)核最近訪問過的文件頁面的內(nèi)存,即頁面緩存(page cache),而節(jié)點的空閑預(yù)取緩沖區(qū)也就是除去頁面緩存(page cache)中被已經(jīng)預(yù)取到的數(shù)據(jù)占用的內(nèi)存之后剩余的內(nèi)存。節(jié)點的空閑預(yù)取緩沖區(qū)容量也是影響數(shù)據(jù)預(yù)取量大小的因素之一。
預(yù)取量窗口倍增模塊502,用于求取前一次預(yù)取窗口的大小I p,ev size、預(yù)取量最大倍增倍數(shù)Tsrale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊501獲取的數(shù)據(jù)預(yù)取量參數(shù)因子r 三者的乘積Size。
在數(shù)據(jù)預(yù)取算法中,當(dāng)某個進程所屬的一個運行在節(jié)點上的線程讀取文件時,每當(dāng)發(fā)出一個數(shù)據(jù)預(yù)取請求,數(shù)據(jù)預(yù)取算法都會以一個稱為“預(yù)取窗口”的數(shù)據(jù)結(jié)構(gòu)來記錄該數(shù)據(jù)預(yù)取請求以表明請求預(yù)取的數(shù)據(jù)長度,如附圖4所示。起點(start)和大小(size)構(gòu)成一個預(yù)取窗口,記錄了最近一次預(yù)取請求的位置和大小,aSynC_SiZe指示了異步預(yù)取的位置提前量。PG_readahead page是在上一次預(yù)取I/O中設(shè)置的,指示應(yīng)用程序已經(jīng)用盡了足夠的提前讀窗口,進行下一個預(yù)取I/O的時機已經(jīng)到來,啟動異步預(yù)讀以讀取更多的文件頁面。因此,通過記錄的數(shù)據(jù)預(yù)取請求,很容易獲取上一次預(yù)取窗口的大小size。
需要說明的是,若進程是初次對文件訪問,即不存在之前記錄的預(yù)取窗口,因此, 在這種情形下,可以將預(yù)取窗口大小設(shè)置為比初次請求預(yù)取的數(shù)據(jù)長度大,例如,可以將預(yù)取窗口大小設(shè)置為初次請求預(yù)取的數(shù)據(jù)長度的2倍。當(dāng)然,也可以設(shè)置為其他倍數(shù),原則上只要比初次請求預(yù)取的數(shù)據(jù)長度大即可,本發(fā)明對此不做特別限制。
在附圖5所示實施例中,預(yù)取量最大倍增倍數(shù)Ts。-用來限制每一次預(yù)取量倍增倍數(shù),可以由用戶根據(jù)實際情況設(shè)定。Ssize與上一次預(yù)取窗口的大小size、預(yù)取量每次最大倍增倍數(shù)Tscale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的關(guān)系為= Rprev_sizeXTscaleXr0
預(yù)取量窗口獲取模塊503,用于比較設(shè)定的最大預(yù)取量MAXreadahead和所述預(yù)取量窗口倍增模塊502獲取的的大小,以所述MAX_datead和所述中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
由于受預(yù)取緩沖區(qū)容量等各方面的限制,預(yù)取窗口的大小不可能無限地增大,例如,預(yù)取窗口的大小不可能按照sizeXTs。aleXr這一關(guān)系無限地增大,即,應(yīng)該對預(yù)取窗口的大小進行某種限制。
在附圖5所示實施例中,可以由用戶設(shè)置一個最大預(yù)取量MAXreadatead,然后,預(yù)取量窗口獲取模塊503將MAX,eadahead與預(yù)取量窗口倍增模塊502求取的( = Rprev_ size X Tscale X r)進行比較,最終,以MAXreadatead和中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
從上述附圖5所示實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置05可知, 在數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊501根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取了數(shù)據(jù)預(yù)取量參數(shù)因子r后,預(yù)取量窗口獲取模塊503即可由上一次預(yù)取窗口的大小RPMV—size、預(yù)取量每次最大倍增倍數(shù)Tsrale和所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積與設(shè)定的最大預(yù)取量MAXreadatead的大小關(guān)系確定預(yù)取窗口的大小,最終按照確定出的預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。由于表征NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)與當(dāng)前操作系統(tǒng)的輸入/輸出I/O隊列相關(guān),并且,是數(shù)據(jù)預(yù)取量參數(shù)因子 r根據(jù)進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取,因此,與現(xiàn)有技術(shù)提供的針對單處理器的數(shù)據(jù)預(yù)取算法相比,本發(fā)明實施例提供的數(shù)據(jù)預(yù)取裝置綜合考慮了磁盤I/O負(fù)載和節(jié)點內(nèi)存剩余大小等影響系統(tǒng)性能的因素,即,在磁盤I/O負(fù)載較輕、節(jié)點剩余內(nèi)存較多時,適當(dāng)?shù)財U大數(shù)據(jù)預(yù)取量,有利于隱藏數(shù)據(jù)1/0,當(dāng)磁盤I/O負(fù)載較重、節(jié)點剩余內(nèi)存較少時,適當(dāng)?shù)販p小數(shù)據(jù)預(yù)取量,有利于節(jié)省系統(tǒng)資源。
需要說明的是,以上用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置的實施方式中,各功能模塊的劃分僅是舉例說明,實際應(yīng)用中可以根據(jù)需要,例如相應(yīng)硬件的配置要求或者軟件的實現(xiàn)的便利考慮,而將上述功能分配由不同的功能模塊完成,即將所述用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。而且,實際應(yīng)用中,本實施例中的相應(yīng)的功能模塊可以是由相應(yīng)的硬件實現(xiàn),也可以由相應(yīng)的硬件執(zhí)行相應(yīng)的軟件完成,例如,前述的數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊,可以是具有執(zhí)行前述由表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量獲取數(shù)據(jù)預(yù)取量參數(shù)因子r的硬件,例如數(shù)據(jù)預(yù)取量參數(shù)因子獲取器,也可以是能夠執(zhí)行相應(yīng)計算機程序從而完成前述功能的一般處理器或者其他硬件設(shè)備;再如前述的預(yù)取量窗口倍增模塊,可以是具有執(zhí)行前述求取上一次預(yù)取窗口的大小size、預(yù)取量每次最大倍增倍數(shù)Ts。&以及所述數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊(或數(shù)據(jù)預(yù)取量參數(shù)因子獲取器)獲取的數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積功能的硬件,例如預(yù)取量窗口倍增器,也可以是能夠執(zhí)行相應(yīng)計算機程序從而完成前述功能的一般處理器或者其他硬件設(shè)備(本說明書提供的各個實施例都可應(yīng)用上述描述原則)。
附圖5示例的數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊501進一步包括權(quán)重獲取子模塊601 和求差子模塊602,如附圖6示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置06,其中
權(quán)重獲取子模塊601,用于根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重和所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重;
求差子模塊602,用于求取所述磁盤負(fù)載對預(yù)取量增長的權(quán)重與所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的差值,得到所述數(shù)據(jù)預(yù)取量參數(shù)因子r。
附圖6示例的權(quán)重獲取子模塊601進一步包括內(nèi)存獲取單元701和求預(yù)取量權(quán)重獲取單元702,如附圖7示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置07,其中
內(nèi)存獲取單元701,用于調(diào)用I/O隊列獲取模塊和內(nèi)存獲取模塊以分別獲取操作系統(tǒng)當(dāng)前I/O隊列的長度和所述進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量;
預(yù)取量權(quán)重獲取單元702,用于將所述操作系統(tǒng)當(dāng)前I/O隊列的長度與操作系統(tǒng)限定的最大I/O隊列長度的比值乘以第一可調(diào)因子以獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重, 將所述進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量與所述進程所在節(jié)點總預(yù)取緩沖區(qū)容量的比值乘以第二可調(diào)因子以獲取所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重,所述操作系統(tǒng)當(dāng)前I/O隊列的長度與操作系統(tǒng)限定的最大I/O隊列長度的比值為表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)。
在上述附圖7示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置07中,內(nèi)存獲取單元701可以通過調(diào)用I/O隊列獲取模塊獲取操作系統(tǒng)當(dāng)前I/O隊列的長度,結(jié)合預(yù)取量權(quán)重獲取單元702,獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重。具體地,可以使用jprobe技術(shù)探測 do_generic_make_request()函數(shù),從此函數(shù)中獲取系統(tǒng)當(dāng)前I/O隊列的長度,即正在使用的操作系統(tǒng)I/O隊列長度(通過探測do_generic_make_request ()函數(shù)的參數(shù)count),也可以獲取操作系統(tǒng)限定的最大I/O隊列長度(通過探測d0_generiC_make_requeSt()函數(shù)的參數(shù)max_io_length);然后,預(yù)取量權(quán)重獲取單元702將所述操作系統(tǒng)當(dāng)前I/O隊列的長度(記為QcotmJ與操作系統(tǒng)限定的最大I/O隊列長度(記為Qmax)的比值乘以第一可調(diào)因子(記為a)以獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重,即,磁盤負(fù)載對預(yù)取量增長的權(quán)重為aQcurrent/Qmax °
在上述附圖7示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置07中,內(nèi)存獲取單元 701也可以通過調(diào)用內(nèi)存獲取模塊獲取進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,結(jié)合預(yù)取量權(quán)重獲取單元702,從而獲取進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重。具體地,預(yù)取量權(quán)重獲取單元702將進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量(記為Ms)與所述進程所在節(jié)點總預(yù)取緩沖區(qū)容量(記為Mt。tal)的比值乘以第二可調(diào)因子(記為b)以獲取所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重,即,進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重為bMs/Mt。tal。
此時,數(shù)據(jù)預(yù)取量參數(shù)因子r為磁盤負(fù)載對預(yù)取量增長的權(quán)重與進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的差值,即,r = aQ—zU^bMyMt^。
需要說明的是,在附圖6或附圖7示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置 06或07中,第一可調(diào)因子a和第二可調(diào)因子b可由用戶根據(jù)硬件環(huán)境和自身需求確定,其取值范圍在(0,1]。如果用戶不對第一可調(diào)因子a和第二可調(diào)因子b進行調(diào)整,則第一可調(diào)因子a和第二可調(diào)因子b可取缺省值1。從數(shù)據(jù)預(yù)取量參數(shù)因子r的表達(dá)式可知,第一可調(diào)因子a和第二可調(diào)因子b用于調(diào)節(jié)進程所在節(jié)點總預(yù)取緩沖區(qū)容量占用情況(即MsZMtotal) 和磁盤負(fù)載情況(即Q。umnt/Qmax)對預(yù)取量的影響權(quán)重,具體地,當(dāng)?shù)谝豢烧{(diào)因子a相對較大而第二可調(diào)因子b相對較小時,進程所在節(jié)點預(yù)取緩沖區(qū)空閑比例(即Ms/Mt。tal)對預(yù)取量影響相對較大;反之,當(dāng)?shù)谝豢烧{(diào)因子a相對較小而第二可調(diào)因子b相對較大時,磁盤負(fù)載情況(即Q。u mt/Qmax)對預(yù)取量影響相對較大。
為了實現(xiàn)資源的高效利用,服務(wù)器系統(tǒng)(可以是NUMA系統(tǒng)中的一個節(jié)點)中常常運行多個虛擬機,每個虛擬機中運行獨立的操作系統(tǒng)。在虛擬化系統(tǒng)中,前述實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法基本不變,不同之處在于,由于虛擬化I/O子系統(tǒng)的作用,每個虛擬機中運行獨立的操作系統(tǒng)可以擁有獨立的文件系統(tǒng),并獨立地進行 I/O隊列管理,因此,操作系統(tǒng)內(nèi)部的I/O隊列長度不能反映整個系統(tǒng)的磁盤I/O負(fù)載情況。此時,如果虛擬化系統(tǒng)提供獲取整個NUMA系統(tǒng)I/O隊列長度的調(diào)用接口,則I/O隊列獲取模塊就利用該調(diào)用接口獲取當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度,而不是從虛擬機中運行的獨立操作系統(tǒng)獲取當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度;如果虛擬化系統(tǒng)不提供此種調(diào)用接口,則從虛擬機中運行的操作系統(tǒng)中獲取當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度。具體地,對于虛擬化系統(tǒng)不提供調(diào)用接口的情形,可以調(diào)用虛擬化管理工具(例如, Hypervisor), Hypervisor等管理工具對運行于各個節(jié)點的虛擬化系統(tǒng)在內(nèi)存管理、通信等方面進行統(tǒng)一協(xié)調(diào),對內(nèi)存的分配和調(diào)度所采用的策略是公開的,具體實現(xiàn)如下,如果某一個節(jié)點上的虛擬化系統(tǒng)在運行預(yù)取軟件,可以首先獲取該節(jié)點的I/O隊列長度,根據(jù)管理工具(Hypervisor)的內(nèi)存調(diào)度策略推算出當(dāng)前整個NUMA系統(tǒng)的I/O隊列長度(也即整個 NUMA系統(tǒng)正在使用的I/O隊列長度)。
需要進一步說明的是,對于預(yù)取量最大倍增倍數(shù)Tsrale用來限制每一次預(yù)取量倍增倍數(shù),可由用戶根據(jù)進程所在節(jié)點總預(yù)取緩沖區(qū)容量大小和本系統(tǒng)主要應(yīng)用的特點來確定,即,如果進程所在節(jié)點分配的總預(yù)取緩沖區(qū)容量較大,主要的應(yīng)用具有連續(xù)順序讀文件的特征,則預(yù)取量每次最大倍增倍數(shù)??;。-可以設(shè)置為較大的值,以使得在允許的情況下,預(yù)取窗口能夠快速增長,提高數(shù)據(jù)預(yù)取命中率。
作為附圖7示例的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置07中的一個實施例,預(yù)取量最大倍增倍數(shù)Ts。-的取值范圍可以為W,8],其中,符號“[]”表示閉區(qū)間;在
內(nèi),同樣遵循預(yù)取量最大倍增倍數(shù)Ts。-越大,所述預(yù)取量最大倍增倍數(shù)Ts。-的取值越大的原則。
需要說明的是,上述裝置各模塊/單元之間的信息交互、執(zhí)行過程等內(nèi)容,由于與本發(fā)明方法實施例基于同一構(gòu)思,其帶來的技術(shù)效果與本發(fā)明方法實施例相同,具體內(nèi)容可參見本發(fā)明方法實施例中的敘述,此處不再贅述。
本領(lǐng)域普通技術(shù)人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,比如以下各種方法的一種或多種或全部
根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r ;
求取前一次預(yù)取窗口的大小I^prev size、預(yù)取量最大倍增倍數(shù)Ts。-以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積;
比較設(shè)定的最大預(yù)取量MAX_dahead和所述的大小,以所述MAXreadahead和所述中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
該程序可以存儲于一計算機可讀存儲介質(zhì)中,存儲介質(zhì)可以包括只讀存儲器 (ROM, Read Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、磁盤或光盤等。
以上對本發(fā)明實施例提供的用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法和裝置進行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員, 依據(jù)本發(fā)明的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
權(quán)利要求
1.一種用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法,其特征在于,所述方法包括根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r ;求取前一次預(yù)取窗口的大小size、預(yù)取量最大倍增倍數(shù)Ts。-以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積比較設(shè)定的最大預(yù)取量MAXreadahead和所述Size的大小,以所述MAXreadahead和所述Size中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
2.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和線程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r包括根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重和所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重;求取所述磁盤負(fù)載對預(yù)取量增長的權(quán)重與所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的差值,得到所述數(shù)據(jù)預(yù)取量參數(shù)因子r。
3.如權(quán)利要求2所述的方法,其特征在于,所述根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重和所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重包括調(diào)用輸入輸出I/O隊列獲取模塊和內(nèi)存獲取模塊以分別獲取操作系統(tǒng)當(dāng)前I/O隊列的長度和所述進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量;將所述操作系統(tǒng)當(dāng)前I/O隊列的長度與操作系統(tǒng)限定的最大I/O隊列長度的比值乘以第一可調(diào)因子以獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重,將所述進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量與所述線程所在節(jié)點總預(yù)取緩沖區(qū)容量的比值乘以第二可調(diào)因子以獲取所述線程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重,所述操作系統(tǒng)當(dāng)前I/O隊列的長度與操作系統(tǒng)限定的最大I/O隊列長度的比值為所述表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)。
4.如權(quán)利要求1所述的方法,其特征在于,所述預(yù)取量最大倍增倍數(shù)Ts。-的取值范圍為
,其中符號“ □”表示閉區(qū)間。
5.如權(quán)利要求1所述的方法,其特征在于,所述空閑預(yù)取緩沖區(qū)容量越大,則所述預(yù)取量最大倍增倍數(shù)Ts。-的取值越大。
6.一種用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取裝置,其特征在于,所述裝置包括數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊,用于根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r;預(yù)取量窗口倍增模塊,用于求取前一次預(yù)取窗口的大小size、預(yù)取量最大倍增倍數(shù) Tscale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積;預(yù)取量窗口獲取模塊,用于比較設(shè)定的最大預(yù)取量MAX_datead和所述的大小,以所述MAX_datead和所述中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。
7.如權(quán)利要求6所述的裝置,其特征在于,所述數(shù)據(jù)預(yù)取量參數(shù)因子獲取模塊包括權(quán)重獲取子模塊,用于根據(jù)所述表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重和所述進程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重;求差子模塊,用于求取所述磁盤負(fù)載對預(yù)取量增長的權(quán)重與所述線程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重的差值,得到所述數(shù)據(jù)預(yù)取量參數(shù)因子r。
8.如權(quán)利要求7所述的裝置,其特征在于,所述權(quán)重獲取子模塊包括內(nèi)存獲取單元,用于調(diào)用輸入輸出I/O隊列獲取模塊和內(nèi)存獲取模塊以分別獲取操作系統(tǒng)當(dāng)前I/O隊列的長度和所述線程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量;預(yù)取量權(quán)重獲取單元,用于將所述操作系統(tǒng)當(dāng)前I/O隊列的長度與操作系統(tǒng)限定的最大I/O隊列長度的比值乘以第一可調(diào)因子以獲取磁盤負(fù)載對預(yù)取量增長的權(quán)重,將所述線程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量與所述線程所在節(jié)點總預(yù)取緩沖區(qū)容量的比值乘以第二可調(diào)因子以獲取所述線程所在節(jié)點的預(yù)取緩沖區(qū)容量對預(yù)取量增長的權(quán)重,所述操作系統(tǒng)當(dāng)前I/O隊列的長度與操作系統(tǒng)限定的最大I/O隊列長度的比值為所述表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)。
9.如權(quán)利要求6所述的裝置,其特征在于,所述預(yù)取量最大倍增倍數(shù)Ts。-的取值范圍為
,其中符號“ □”表示閉區(qū)間。
10.如權(quán)利要求6或9所述的裝置,其特征在于,所述空閑預(yù)取緩沖區(qū)容量越大,則所述預(yù)取量最大倍增倍數(shù)Ts。-的取值越大。
全文摘要
本發(fā)明實施例提供用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法和裝置,以提高NUMA架構(gòu)下文件預(yù)取的可靠性和準(zhǔn)確率。本發(fā)明實施例提供一種用于非一致性內(nèi)存訪問的數(shù)據(jù)預(yù)取方法,所述方法包括根據(jù)表征非一致性內(nèi)存訪問NUMA系統(tǒng)中磁盤負(fù)載的參數(shù)和進程所在節(jié)點的空閑預(yù)取緩沖區(qū)容量,獲取數(shù)據(jù)預(yù)取量參數(shù)因子r;求取前一次預(yù)取窗口的大小Rprev_size、預(yù)取量最大倍增倍數(shù)Tscale以及所述數(shù)據(jù)預(yù)取量參數(shù)因子r三者的乘積Ssize;比較設(shè)定的最大預(yù)取量MAXreadahead和所述Ssize的大小,以所述MAXreadahead和所述Ssize中的較小值作為本次預(yù)取窗口的大小去預(yù)取數(shù)據(jù)。本發(fā)明提供的方法綜合考慮了磁盤I/O負(fù)載和節(jié)點內(nèi)存剩余大小等影響系統(tǒng)性能的因素,有利于隱藏數(shù)據(jù)I/O和節(jié)省系統(tǒng)資源。
文檔編號G06F12/02GK102508638SQ20111029654
公開日2012年6月20日 申請日期2011年9月27日 優(yōu)先權(quán)日2011年9月27日
發(fā)明者劉軼, 樸明鉉, 譚璽, 韋竹林 申請人:華為技術(shù)有限公司