本發(fā)明涉及I/O調(diào)度技術(shù)領(lǐng)域,尤其涉及一種I/O請求調(diào)度方法及調(diào)度器。
背景技術(shù):
通常,在數(shù)據(jù)中心尤其是虛擬化數(shù)據(jù)中心中,存儲器由多個I/O請求對象共享使用,在這種共享使用的場景下,對于服務(wù)質(zhì)量QoS有一定的要求,即:要求能夠公平地為多個I/O請求對象分配存儲器的資源,并且高效地利用所分配的資源。I/O調(diào)度器在服務(wù)質(zhì)量的保障方面起著決定性作用。
目前,已有的基于時間片且滿足一定服務(wù)質(zhì)量保障公平性的I/O調(diào)度器包括:CFQ(Completely Fair Queuing)調(diào)度器、Argon調(diào)度器和FIOS(Flash I/O Scheduler)調(diào)度器:CFQ在正在服務(wù)的I/O請求對象的時間片尚未用完且目前沒有I/O請求時,會空閑等待一段時間,等待同一I/O請求對象的下一個I/O請求的達(dá)到。Argon與CFQ的工作原理類似。FIOS將CPU時間劃分為調(diào)度時段,在單個調(diào)度時段內(nèi)部,為每個I/O請求對象分配時間片;在單個調(diào)度時段內(nèi),當(dāng)I/O請求對象的I/O請求隊列非空且時間片尚未用完時,連續(xù)服務(wù)此I/O請求對象的I/O請求;當(dāng)I/O請求對象的時間片用完后,在本調(diào)度時段內(nèi)不再服務(wù)此I/O請求對象的I/O請求。
但是,CFQ與Argon在一個時間片內(nèi)連續(xù)服務(wù)或空閑等待同一個I/O請求對象的I/O請求,會導(dǎo)致其它I/O請求對象的I/O請求長時間得不到服務(wù),從而響應(yīng)I/O請求對象的I/O請求的時間過長。而FIOS在一個I/O請求對象的時間片尚未用完且具有I/O請求時,則連續(xù)服務(wù)此I/O請求對象的I/O請求,不服務(wù)其它I/O請求對象的I/O請求,也會導(dǎo)致其它I/O請求對象的I/O請求長時間得不到服務(wù),因此還是存在響應(yīng)I/O請求對象的I/O請求的時間過長的問題。
因此,已有的基于時間片且滿足一定服務(wù)質(zhì)量保障公平性的I/O調(diào)度器,均存在響應(yīng)I/O請求對象的I/O請求的時間過長的問題。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供了一種I/O請求調(diào)度方法及調(diào)度器,用于解決現(xiàn)有的I/O調(diào)度器響應(yīng)I/O請求對象的I/O請求的時間過長的問題。
為解決上述技術(shù)問題,本發(fā)明實施例提供以下技術(shù)方案:
本申請的第一方面提供了一種I/O請求調(diào)度方法,包括:
在進入當(dāng)前調(diào)度時段時,偵測在所述當(dāng)前時段訪問存儲設(shè)備的I/O請求對象,為偵測到的每個I/O請求對象分配一個時間片,并為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值;其中,為偵測到的每個I/O請求對象分配的時間片之和小于或等于所述當(dāng)前調(diào)度時段;
在當(dāng)前調(diào)度時段內(nèi),輪流對時間片尚未用完且具有I/O請求的I/O請求對象執(zhí)行如下步驟,直到所述當(dāng)前調(diào)度時段內(nèi)不存在時間片尚未用完且具有I/O請求的I/O請求對象:
從所述時間片尚未用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,直到所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在本申請的第一方面的第一種實現(xiàn)方式中,還包括:
在所述當(dāng)前調(diào)度時段內(nèi),當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時,啟動預(yù)期計時;
在啟動所述預(yù)期計時后,當(dāng)所述預(yù)期計時的時長尚未達(dá)到預(yù)設(shè)的計時閾值,且偵測到時間片尚未用完的I/O請求對象產(chǎn)生新的I/O請求時,結(jié)束所述預(yù)期計時,并調(diào)度所述新的I/O請求。
在本申請的第一方面的第二種實現(xiàn)方式中,還包括:
在所述當(dāng)前調(diào)度時段內(nèi),當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時,啟動預(yù)期計時;
在啟動所述預(yù)期計時后,輪流對時間片已經(jīng)用完且具有I/O請求的I/O請求對象執(zhí)行如下步驟:
從所述時間片已經(jīng)用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,直到所述調(diào) 度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在本申請的第一方面的第三種實現(xiàn)方式中,所述每個I/O請求對象的I/O請求包括:讀請求和寫請求;所述讀請求排在讀請求隊列中,所述寫請求排在寫請求隊列中;
則,所述調(diào)度所選擇的I/O請求對象的I/O請求包括:
在預(yù)設(shè)的讀請求調(diào)度時長內(nèi),調(diào)度所述讀請求隊列中的讀請求;
在預(yù)設(shè)的寫請求調(diào)度時長內(nèi),調(diào)度所述寫請求隊列中的寫請求;
其中,每個I/O請求對象的讀請求調(diào)度時長與寫請求調(diào)度時長之和小于或等于每個I/O請求對象的調(diào)度時間閾值。
在本申請的第一方面的第四種實現(xiàn)方式中,還包括:
在調(diào)度所述讀請求隊列中的讀請求時,如果所述寫請求隊列中的寫請求發(fā)生阻塞,則記錄所述寫請求阻塞時長,并在所述寫請求阻塞時長達(dá)到預(yù)設(shè)的寫請求阻塞時間閾值時,調(diào)度所述寫請求隊列中的寫請求;
在調(diào)度所述寫請求隊列中的寫請求時,如果所述讀請求隊列中的讀請求發(fā)生阻塞,則記錄所述讀請求阻塞時長,并在所述讀請求阻塞時長達(dá)到預(yù)設(shè)的讀請求阻塞時間閾值時,調(diào)度所述讀請求隊列中的讀請求。
在本申請的第一方面的第五種實現(xiàn)方式中,所述為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值,具體為:根據(jù)偵測到的I/O請求對象的個數(shù)和偵測到的每個I/O請求對象的響應(yīng)時間需求,為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值。
本申請的第二方面提供了一種I/O請求調(diào)度器,包括:
分配模塊,用于在進入當(dāng)前調(diào)度時段時,偵測在所述當(dāng)前時段訪問存儲設(shè)備的I/O請求對象,為偵測到的每個I/O請求對象分配一個時間片,并為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值;其中,為偵測到的每個I/O請求對象分配的時間片之和小于或等于所述當(dāng)前調(diào)度時段;
第一調(diào)度模塊,用于在當(dāng)前調(diào)度時段內(nèi),輪流對時間片尚未用完且具有 I/O請求的I/O請求對象執(zhí)行如下步驟,直到所述當(dāng)前調(diào)度時段內(nèi)不存在時間片尚未用完且具有I/O請求的I/O請求對象:
從所述時間片尚未用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,直到所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在本申請的第二方面的第一種實現(xiàn)方式中,還包括:
預(yù)期計時模塊,用于在所述當(dāng)前調(diào)度時段內(nèi),當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時,啟動預(yù)期計時;
第二調(diào)度模塊,用于在啟動所述預(yù)期計時后,當(dāng)所述預(yù)期計時的時長尚未達(dá)到預(yù)設(shè)的計時閾值,且偵測到時間片尚未用完的I/O請求對象產(chǎn)生新的I/O請求時,結(jié)束所述預(yù)期計時,并調(diào)度所述新的I/O請求。
在本申請的第二方面的第二種實現(xiàn)方式中,還包括:
預(yù)期計時模塊,用于在所述當(dāng)前調(diào)度時段內(nèi),當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時,啟動預(yù)期計時;
第三調(diào)度模塊,用于在啟動所述預(yù)期計時后,輪流對時間片已經(jīng)用完且具有I/O請求的I/O請求對象執(zhí)行如下步驟:
從所述時間片已經(jīng)用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,直到所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在本申請的第二方面的第三種實現(xiàn)方式中,所述每個I/O請求對象的I/O請求包括:讀請求和寫請求;所述讀請求排在讀請求隊列中,所述寫請求排在寫請求隊列中;
則,所述第一調(diào)度模塊在調(diào)度所選擇的I/O請求對象的I/O請求時,用于:
在所述讀請求調(diào)度時長內(nèi),調(diào)度所述讀請求隊列中的讀請求;
在所述寫請求調(diào)度時長內(nèi),調(diào)度所述寫請求隊列中的寫請求;
其中,每個I/O請求對象的讀請求調(diào)度時長與寫請求調(diào)度時長之和小于或等于每個I/O請求對象的調(diào)度時間閾值。
在本申請的第二方面的第四種實現(xiàn)方式中,所述第一調(diào)度模塊,還用于:
在調(diào)度所述讀請求隊列中的讀請求時,如果所述寫請求隊列中的寫請求發(fā)生阻塞,則記錄所述寫請求阻塞時長,并在所述寫請求阻塞時長達(dá)到預(yù)設(shè)的寫請求阻塞時間閾值時,調(diào)度所述寫請求隊列中的寫請求;
在調(diào)度所述寫請求隊列中的寫請求時,如果所述讀請求隊列中的讀請求發(fā)生阻塞,則記錄所述讀請求阻塞時長,并在所述讀請求阻塞時長達(dá)到預(yù)設(shè)的讀請求阻塞時間閾值時,調(diào)度所述讀請求隊列中的讀請求。
在本申請的第二方面的第五種實現(xiàn)方式中,在為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值時,所述分配模塊具體用于:根據(jù)偵測到的I/O請求對象的個數(shù)和偵測到的每個I/O請求對象的響應(yīng)時間需求,為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值。
由上可見,本申請?zhí)峁┑募夹g(shù)方案,對每個調(diào)度時段的訪問存儲設(shè)備的I/O請求對象在設(shè)定時間片后設(shè)定調(diào)度時間閾值;并在每個調(diào)度時段內(nèi),根據(jù)為每個I/O請求對象設(shè)定的調(diào)度時間閾值輪流調(diào)度I/O請求對象的I/O請求,而不是等待每個I/O請求對象的時間片用完之后,再進行下一個I/O請求對象的I/O請求的調(diào)度,從而可以盡快響應(yīng)其它I/O請求對象的I/O請求,防止其它I/O請求對象等待的時間過長的問題。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明提供的一種I/O請求調(diào)度方法的一個實施例的流程示意圖;
圖2為本發(fā)明提供的一種I/O請求調(diào)度方法的另一個實施例的流程示意圖;
圖3為本發(fā)明提供的一種I/O請求調(diào)度方法的再一個實施例的流程示意 圖;
圖4為本發(fā)明提供的一種I/O請求調(diào)度器的一個實施例的結(jié)構(gòu)示意圖;
圖5為本發(fā)明提供的一種I/O請求調(diào)度器的另一個實施例的結(jié)構(gòu)示意圖;
圖6為本發(fā)明提供的一種I/O請求調(diào)度器的再一個實施例的結(jié)構(gòu)示意圖。
具體實施方式
為使得本發(fā)明的發(fā)明目的、特征、優(yōu)點能夠更加的明顯和易懂,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而非全部實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
下面結(jié)合附圖對本申請?zhí)峁┑募夹g(shù)方案進行詳細(xì)說明:
在數(shù)據(jù)中心尤其是虛擬化數(shù)據(jù)中心中,存儲器由多個I/O請求對象,例如多個進程、多個終端、或者多個應(yīng)用程序共享使用,在這種共享使用的場景下,對于服務(wù)質(zhì)量QoS有一定的要求,即:要求能夠公平地為多個I/O請求對象分配存儲器的資源,并且高效地利用所分配的資源。I/O請求調(diào)度器在服務(wù)質(zhì)量的保障方面起著決定性作用。
在宏觀上,多個I/O請求對象可以同時運行。但在微觀上,由于只有一個CPU,不能同時處理所有I/O請求對象的I/O請求,而為了保證服務(wù)質(zhì)量QoS,其中的一種方法就是引入“時間片”,使得各個I/O請求對象可以輪流執(zhí)行。
在一種情況下,I/O請求調(diào)度器為各個I/O請求對象分配時間片,所分配的時間片即為該I/O請求對象的I/O請求允許被調(diào)用的最長時間,如果在一個I/O請求對象的時間片用完時該I/O請求對象的I/O請求還沒處理完畢,則I/O請求調(diào)度器會調(diào)度另一個I/O請求對象的I/O請求,由于CPU的處理速度很快,只要各個時間片之間的間隔適當(dāng),就可以使各個I/O請求對象從表面上看是同時進行的。
在另一種情況下,還可以把I/O請求調(diào)度器的調(diào)度過程劃分多個調(diào)度時段,然后為每個調(diào)度時段內(nèi)的各個I/O請求對象分配時間片,在該調(diào)度時段內(nèi),如果在一個I/O請求對象的時間片用完時該I/O請求對象的I/O請求還沒有被 調(diào)度完畢,則I/O請求調(diào)度器會調(diào)用另一個I/O請求對象的I/O請求,由于CPU的處理速度很快,只要各個調(diào)度時段和各個時間片之間的間隔適當(dāng),就可以使各個I/O請求對象從表面上看是同時進行的。
在上述應(yīng)用場景下,本申請?zhí)峁┮环NI/O請求調(diào)度方法及I/O請求調(diào)度器。
圖1為本發(fā)明提供的一種I/O請求調(diào)度方法的一個實施例的流程示意圖。
本申請實施例預(yù)先劃分為了多個調(diào)度時段,并且在進入任意一個調(diào)度時段時,輪流調(diào)度在該調(diào)度時段內(nèi)訪問存儲設(shè)備的I/O請求對象的I/O請求。
需要說明的是:所述多個調(diào)度時段的時間長短并不一定相同。
參照圖1所示,本申請實施例提供的I/O請求調(diào)度方法,應(yīng)用于I/O請求調(diào)度器中,包括如下步驟:
S000:在進入當(dāng)前調(diào)度時段時,偵測在所述當(dāng)前時段訪問存儲設(shè)備的I/O請求對象,為偵測到的每個I/O請求對象分配一個時間片,并為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值;
其中,為偵測到的每個I/O請求對象分配的時間片之和小于或等于所述當(dāng)前調(diào)度時段;
在本申請實施例中,I/O請求調(diào)度器會為每個I/O請求對象預(yù)先設(shè)定連續(xù)調(diào)度該I/O請求對象的I/O請求的最長時間,即調(diào)度時間閾值,各個I/O請求對象的調(diào)度時間閾值可以相同也可以不同,且同一個I/O請求對象的調(diào)度時間閾值在不同的調(diào)度時段內(nèi)可以相同也可以不同。調(diào)度時間閾值可以是I/O調(diào)度器根據(jù)各個I/O請求對象的響應(yīng)時間需求和I/O請求對象的個數(shù)計算并設(shè)置的,比如:若每個I/O請求對象的響應(yīng)時間需求均為10毫秒,而I/O請求對象的個數(shù)為n,則調(diào)度時間閾值可以為10/n毫秒。
在當(dāng)前調(diào)度時段內(nèi),對時間片尚未用完且具有I/O請求的I/O請求對象執(zhí)行如下步驟:
S100:在當(dāng)前調(diào)度時段內(nèi),從時間片尚未用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象;
在本申請實施例中,當(dāng)存在時間片尚未用完且具有I/O請求的I/O請求對象時,從中選擇一個具有I/O請求且時間片沒有用完的I/O請求對象,作為所 選擇的I/O請求對象。
在選擇I/O請求對象時,可以根據(jù)預(yù)設(shè)規(guī)則進行選取,這里的預(yù)設(shè)規(guī)則可以包括按照I/O請求對象已獲得調(diào)度的時長從少到多的順序,或者I/O請求對象的優(yōu)先級從高到低的順序,或者根據(jù)I/O請求對象已獲得調(diào)度的時長占分配的時間片的比例由小到大的順序等。按照預(yù)設(shè)規(guī)則進行選擇可以最大限度的保證對于每個I/O請求對象的服務(wù)質(zhì)量和公平性。
S200:調(diào)度所選擇的I/O請求對象的I/O請求,并記錄連續(xù)調(diào)度所選擇的I/O請求對象的I/O請求所占用的調(diào)度時長;
S300:當(dāng)調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時,或者,當(dāng)調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的所有I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度;
在本申請實施例中,當(dāng)調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時,若所選擇的I/O請求對象的所有I/O請求還未被調(diào)度完成,則繼續(xù)調(diào)度所選擇的I/O請求對象的I/O請求。
在步驟S100到步驟S300中,從所述時間片尚未用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,當(dāng)所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的所有I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在本申請實施例中,調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時,所選擇的I/O請求對象可能還存在未被調(diào)度的I/O請求,或者所選擇的I/O請求對象的I/O請求可能恰好被調(diào)度完成,無論如何,在調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時,均結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度,不再持續(xù)調(diào)度所選擇的I/O請求對象的I/O請求,以盡快響應(yīng)其它I/O請求對象的I/O請求。
在本申請實施例中,在所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的所有I/O請求均被調(diào)度完成時,即調(diào)度 時長沒有達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時所選擇的I/O請求對象的所有I/O請求就已經(jīng)被調(diào)度完成,則立即結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度,不空閑等待所選擇的I/O請求對象發(fā)送新的I/O請求,以盡快響應(yīng)其它I/O請求對象的I/O請求。
在本申請實施例中,其它I/O請求對象是所述時間片尚未用完且具有I/O請求的I/O請求對象中除所選擇的I/O請求對象之外的其它I/O請求對象。
S400:判斷當(dāng)前調(diào)度時段內(nèi)是否還存在時間片尚未用完且具有I/O請求的I/O請求對象;如果存在,返回S100;如果不存在,則執(zhí)行步驟S500。
步驟S500:等待各I/O請求對象的新的I/O請求。
結(jié)束對時間片尚未用完且具有I/O請求的I/O請求對象的I/O請求的調(diào)度。
在本申請實施例中,當(dāng)不存在時間片尚未用完且具有I/O請求的I/O請求對象時,分為兩種情況,一是時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成,二是所有I/O請求對象的時間片全部用完。
本申請實施例中,在所有I/O請求對象的時間片全部用完時,可以從當(dāng)前調(diào)度時段切換進入下一調(diào)度時段。
本申請實施例提供的技術(shù)方案,對每個調(diào)度時段的訪問存儲設(shè)備的I/O請求對象在設(shè)定時間片后設(shè)定調(diào)度時間閾值;并在每個調(diào)度時段內(nèi),根據(jù)為每個I/O請求對象設(shè)定的調(diào)度時間閾值輪流調(diào)度I/O請求對象的I/O請求,而不是等待每個I/O請求對象的時間片用完之后,再進行下一個I/O請求對象的I/O請求的調(diào)度,從而可以盡快響應(yīng)其它I/O請求對象的I/O請求,防止其它I/O請求對象等待的時間過長的問題。
圖2為本發(fā)明提供的一種I/O請求調(diào)度方法的另一個實施例的流程示意圖。
參照圖2所示,本申請實施例提供的I/O請求調(diào)度方法,包括:
S120:在當(dāng)前調(diào)度時段內(nèi),從時間片尚未用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象;
S220:調(diào)度所選擇的I/O請求對象的I/O請求,并記錄連續(xù)調(diào)度所選擇的I/O請求對象的I/O請求所占用的調(diào)度時長;
S320:當(dāng)調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時,或者,當(dāng)調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的所有I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度;
S420:判斷當(dāng)前調(diào)度時段內(nèi)是否還存在時間片尚未用完且具有I/O請求的I/O請求對象;如果存在,返回S120;如果不存在,進入S520;
S520:判斷是否所有時間片尚未用完且具有I/O請求的I/O請求對象的I/O請求均被調(diào)度完成;如果否,進入S920;如果是,進入S620;
在本申請實施例中,當(dāng)不存在時間片尚未用完且具有I/O請求的I/O請求對象時,可能有兩種情況:時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成、或者所有I/O請求對象的時間片均已用完;
S620:啟動預(yù)期計時,并記錄所述預(yù)期計時的時長。
S720:判斷所述預(yù)期計時的時長是否達(dá)到預(yù)設(shè)的計時閾值;如果是,進入S920;如果否,進入S820;
S820:時間片尚未用完的I/O請求對象生成新的I/O請求時,結(jié)束預(yù)期計時,調(diào)度所述新的I/O請求,并在所述新的I/O請求均被調(diào)度完成后,重新啟動預(yù)期計時,并重新記錄所述預(yù)期計時的時長,直到記錄的預(yù)期計時的時長達(dá)到預(yù)設(shè)的計時閾值時,進入S920;
在預(yù)期計時期間,當(dāng)所述預(yù)期計時的時長尚未達(dá)到預(yù)設(shè)的計時閾值且時間片尚未用完的I/O請求對象生成新的I/O請求時,結(jié)束預(yù)期計時,調(diào)度所述新的I/O請求,并在所述新的I/O請求均被調(diào)度完成后,重新啟動預(yù)期計時,并重新記錄所述預(yù)期計時的時長。
可以理解的是,本申請實施例提供的技術(shù)方案,在調(diào)度新的I/O請求時,如果存在多個具有時間片的I/O請求對象生成了新的I/O請求,同樣可以判斷對于單個I/O請求對象的I/O請求的調(diào)度時長是否達(dá)到了調(diào)度時間閾值,如果達(dá)到,則結(jié)束對當(dāng)前正在調(diào)度的I/O請求對象的調(diào)度,切換調(diào)度其余的I/O請求對象的新的I/O請求,具體的方法如上述實施例所述,此處不再贅述。這樣,在預(yù)期計時期間,當(dāng)時間片尚未用完的I/O請求對象生成新的I/O請求時,I/O調(diào)度器會調(diào)度新的I/O請求,可以防止存儲器空閑,提高存儲器的吞吐率。
S920:在所述預(yù)期計時達(dá)到預(yù)設(shè)的計時閾值,或者當(dāng)前調(diào)度時段的所有I/O請求對象的時間片都用完之后,從當(dāng)前調(diào)度時段進入下一調(diào)度時段。
在本申請實施例提供的技術(shù)方案,在所有I/O請求對象的時間片全部用完時,可以結(jié)束當(dāng)前調(diào)度時段的調(diào)度,并從當(dāng)前調(diào)度時段切換進入下一調(diào)度時段。在預(yù)期計時的時長達(dá)到預(yù)設(shè)的計時閾值時,也可以結(jié)束當(dāng)前調(diào)度時段的調(diào)度,并從當(dāng)前調(diào)度時段切換進入下一調(diào)度時段。
在所述當(dāng)前調(diào)度時段內(nèi),當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時,啟動預(yù)期計時;在啟動所述預(yù)期計時后,當(dāng)所述預(yù)期計時的時長尚未達(dá)到預(yù)設(shè)的計時閾值,且偵測到時間片尚未用完的I/O請求對象產(chǎn)生新的I/O請求時,結(jié)束所述預(yù)期計時,并調(diào)度所述新的I/O請求。這樣,可以在啟動預(yù)期計時后偵測時間片尚未用完的I/O請求對象是否產(chǎn)生新的I/O請求,并在偵測到新的I/O請求時調(diào)度新的I/O請求,能夠進一步提升調(diào)度效率。
圖3為本發(fā)明提供的一種I/O請求調(diào)度方法的再一個實施例的流程示意圖。
參照圖3所示,本申請實施例提供的I/O請求調(diào)度方法,在上述實施例的基礎(chǔ)上,在時間片尚未用完且具有I/O請求的I/O請求對象的I/O請求均被調(diào)度完成,啟動預(yù)期計時后,在S620的預(yù)期計時期間,還包括:
S621:在啟動所述預(yù)期計時后,從時間片已經(jīng)用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象;
在本申請實施例中,在啟動所述預(yù)期計時后,當(dāng)存在時間片已經(jīng)用完且具有I/O請求的I/O請求對象時,從中選擇一個具有I/O請求且時間片已經(jīng)用完的I/O請求對象,作為所選擇的I/O請求對象。
S622:調(diào)度所選擇的I/O請求對象的I/O請求,并記錄連續(xù)調(diào)度所選擇的I/O請求對象的I/O請求所占用的調(diào)度時長;
S623:當(dāng)調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值時,或者,當(dāng)調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的所有I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O 請求的調(diào)度;
在預(yù)期計時期間,當(dāng)存在時間片已經(jīng)用完且具有I/O請求的I/O請求對象時,I/O調(diào)度器從時間片已經(jīng)用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,作為所選擇的I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求,并記錄連續(xù)調(diào)度所選擇的I/O請求對象的I/O請求所占用的調(diào)度時長;直到所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
S624:判斷當(dāng)前調(diào)度時段是否存在時間片已經(jīng)用完且具有I/O請求的I/O請求對象;如果存在,返回S621;如果不存在,執(zhí)行步驟S625。
S625:當(dāng)所述預(yù)期計時結(jié)束后,進入下一個調(diào)度時段。
可以理解的是,本申請實施例中,在結(jié)束對所選擇的I/O請求對象的調(diào)度以后,如果仍然處于預(yù)期計時期間,還可以繼續(xù)判斷是否依然存在時間片已經(jīng)用完且具有I/O請求的I/O請求對象,如果存在,則可以繼續(xù)從時間片已經(jīng)用完且具有I/O請求的I/O請求對象的其它I/O請求對象中選擇I/O請求對象,調(diào)度從時間片已經(jīng)用完且具有I/O請求的I/O請求對象的其它I/O請求對象中選擇的I/O請求對象的I/O請求,并記錄調(diào)度時長,直到所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。在預(yù)期計時期間,重復(fù)執(zhí)行以上步驟,直到不再存在時間片已經(jīng)用完且具有I/O請求的時間片已經(jīng)用完且具有I/O請求的I/O請求對象為止。
在本申請實施例中,當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時啟動預(yù)期計時,并且在預(yù)期計時期間,當(dāng)記錄的預(yù)期計時的時間長度尚未達(dá)到預(yù)設(shè)閾值且時間片已經(jīng)用完的I/O請求對象具有I/O請求時,則在預(yù)期計時期間調(diào)度時間片已經(jīng)用完的I/O請求對象的I/O請求。這樣,可以避免存儲設(shè)備在預(yù)期計時期間空閑等待時間片尚未用完的I/O請求對象的新的I/O請求,從而充分利用存儲設(shè)備的資源,提高存儲資源的利用率和存儲 設(shè)備的吞吐率。
在上述實施例的基礎(chǔ)上,由于所述每個I/O請求對象的I/O請求包括:讀請求和寫請求;所述讀請求排在讀請求隊列中,所述寫請求排在寫請求隊列中;當(dāng)I/O請求到達(dá)I/O調(diào)度器時,根據(jù)讀、寫請求的類型,I/O調(diào)度器將其置于相應(yīng)的隊列中。
為了避免調(diào)度讀請求和調(diào)度寫請求時發(fā)生干擾,在調(diào)度所選擇的I/O請求對象的I/O請求時,所述方法還包括:
在預(yù)設(shè)的讀請求調(diào)度時長內(nèi),調(diào)度所述讀請求隊列中的讀請求;
在預(yù)設(shè)的寫請求調(diào)度時長內(nèi),調(diào)度所述寫請求隊列中的寫請求;
本申請實施例中,在調(diào)度所選擇的I/O請求對象的I/O請求時,分別調(diào)度所選擇的I/O請求對象的讀請求和寫請求,并且在預(yù)設(shè)的讀請求調(diào)度時長內(nèi),只調(diào)度所述讀請求隊列中的讀請求,在預(yù)設(shè)的寫請求調(diào)度時長內(nèi),只調(diào)度所述寫請求隊列中的寫請求。
其中,讀請求調(diào)度時長是預(yù)先為每個I/O請求對象設(shè)定的連續(xù)調(diào)度該I/O請求對象的讀請求的最長時間閾值,寫請求調(diào)度時長是預(yù)先為每個I/O請求對象設(shè)定的連續(xù)調(diào)度該I/O請求對象的寫請求的最長時間閾值,每個I/O請求對象的讀請求調(diào)度時長與寫請求調(diào)度時長之和小于或等于每個I/O請求對象的調(diào)度時間閾值。
另外,由于是分別調(diào)度讀請求和寫請求,而為了避免在調(diào)度讀請求時由于寫請求累積而造成寫請求序列中的寫請求阻塞,或者在調(diào)度寫請求時由于讀請求累積而造成讀請求序列中的讀請求阻塞,本申請實施例還可以為每個I/O請求對象設(shè)定讀請求阻塞時間閾值和寫請求阻塞時間閾值;
在調(diào)度所述讀請求隊列中的讀請求時,如果所述寫請求隊列中的寫請求發(fā)生阻塞,則記錄所述寫請求阻塞時長,并在所述寫請求阻塞時長達(dá)到預(yù)設(shè)的寫請求阻塞時間閾值時,調(diào)度所述寫請求隊列中的寫請求;
在調(diào)度所述寫請求隊列中的寫請求時,如果所述讀請求隊列中的讀請求發(fā)生阻塞,則記錄所述讀請求阻塞時長,并在所述讀請求阻塞時長達(dá)到預(yù)設(shè)的讀請求阻塞時間閾值時,調(diào)度所述讀請求隊列中的讀請求。
本申請實施例提供的技術(shù)方案,為每個I/O請求對象維護一個用于緩存讀請求的讀請求隊列和一個用于緩存寫請求的寫請求隊列,并為每個I/O請求對象設(shè)定讀請求調(diào)度時長和寫請求調(diào)度時長。以連續(xù)的時間片(在讀請求調(diào)度時長內(nèi))來批量調(diào)度讀請求,以連續(xù)的時間片(在寫請求調(diào)度時長內(nèi))來批量調(diào)度寫請求,比如:設(shè)置連續(xù)調(diào)度寫請求的寫請求調(diào)度時長為500ms,則在連續(xù)調(diào)度一個I/O請求對象的寫請求500ms后開始調(diào)度該I/O請求對象的讀請求,這樣對于讀、寫請求的調(diào)度交替進行,可以針對存儲器中的讀/寫請求混合負(fù)載進行區(qū)分服務(wù),減少讀寫干擾,提升存儲器的性能和吞吐率。
而且,為了避免造成讀、寫請求的阻塞,還可以設(shè)置讀請求阻塞時間閾值和寫請求阻塞時間閾值,比如設(shè)定寫請求阻塞時間閾值為1s,則在寫阻塞發(fā)生最長1s的時間后,開始調(diào)度寫請求到存儲設(shè)備,可以防止發(fā)生I/O請求的長期阻塞。
同理,在上述實施例中,在調(diào)度從時間片已經(jīng)用完且具有I/O請求的I/O請求對象中選擇的所選擇的I/O請求對象的I/O請求時,也可以采用類似方法,此處不再贅述。
對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進行。
本發(fā)明上述公開了一種I/O請求調(diào)度方法,相應(yīng)的,本發(fā)明還公開了應(yīng)用上述I/O請求調(diào)度方法的I/O請求調(diào)度器。
圖4為本發(fā)明提供的一種I/O請求調(diào)度器的一個實施例的結(jié)構(gòu)示意圖。
本申請實施例提供的一種I/O請求調(diào)度器,包括:
分配模塊1,用于在進入當(dāng)前調(diào)度時段時,偵測在所述當(dāng)前時段訪問存儲設(shè)備的I/O請求對象,為偵測到的每個I/O請求對象分配一個時間片,并為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值;其中,為偵測到的每個I/O請求對象分配的時間片之和小于或等于所述當(dāng)前調(diào)度時段;
第一調(diào)度模塊2,用于在當(dāng)前調(diào)度時段內(nèi),輪流對時間片尚未用完且具有 I/O請求的I/O請求對象執(zhí)行如下步驟,直到所述當(dāng)前調(diào)度時段內(nèi)不存在時間片尚未用完且具有I/O請求的I/O請求對象:
從所述時間片尚未用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,直到所述調(diào)度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值時,所述分配模塊1具體用于:根據(jù)偵測到的I/O請求對象的個數(shù)和偵測到的每個I/O請求對象的響應(yīng)時間需求,為偵測到的每個I/O請求對象設(shè)定調(diào)度時間閾值。
其中,所述調(diào)度時間閾值為預(yù)先為所選擇的I/O請求對象設(shè)定的連續(xù)調(diào)度所選擇的I/O請求對象的I/O請求的最長時間閾值。
圖5為本發(fā)明提供的一種I/O請求調(diào)度器的另一個實施例的結(jié)構(gòu)示意圖。
本申請實施例提供的一種I/O請求調(diào)度器,在上述實施例的基礎(chǔ)上,還包括:
預(yù)期計時模塊3,用于在所述當(dāng)前調(diào)度時段內(nèi),當(dāng)所有時間片尚未用完的I/O請求對象的I/O請求均被調(diào)度完成時,啟動預(yù)期計時;
第二調(diào)度模塊4,用于在啟動所述預(yù)期計時后,當(dāng)所述預(yù)期計時的時長尚未達(dá)到預(yù)設(shè)的計時閾值,且偵測到時間片尚未用完的I/O請求對象產(chǎn)生新的I/O請求時,結(jié)束所述預(yù)期計時,并調(diào)度所述新的I/O請求。
圖6為本發(fā)明提供的一種I/O請求調(diào)度器的再一個實施例的結(jié)構(gòu)示意圖。
本申請實施例提供的一種I/O請求調(diào)度器,在上述實施例的基礎(chǔ)上,還包括:
第三調(diào)度模塊5,用于在啟動所述預(yù)期計時后,輪流對時間片已經(jīng)用完且具有I/O請求的I/O請求對象執(zhí)行如下步驟:
從所述時間片已經(jīng)用完且具有I/O請求的I/O請求對象中選擇一個I/O請求對象,調(diào)度所選擇的I/O請求對象的I/O請求并記錄調(diào)度時長,直到所述調(diào) 度時長達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值,或者,所述調(diào)度時長尚未達(dá)到所選擇的I/O請求對象的調(diào)度時間閾值但所選擇的I/O請求對象的I/O請求均被調(diào)度完成時,結(jié)束對所選擇的I/O請求對象的I/O請求的調(diào)度。
在上述實施例的基礎(chǔ)上,由于所述每個I/O請求對象的I/O請求包括:讀請求和寫請求;所述讀請求排在讀請求隊列中,所述寫請求排在寫請求隊列中;
則,所述第一調(diào)度模塊2在調(diào)度所選擇的I/O請求對象的I/O請求時,用于:
在所述讀請求調(diào)度時長內(nèi),調(diào)度所述讀請求隊列中的讀請求;
在所述寫請求調(diào)度時長內(nèi),調(diào)度所述寫請求隊列中的寫請求;
其中,每個I/O請求對象的讀請求調(diào)度時長與寫請求調(diào)度時長之和小于或等于每個I/O請求對象的調(diào)度時間閾值。
所述第一調(diào)度模塊2,還用于:
在調(diào)度所述讀請求隊列中的讀請求時,如果所述寫請求隊列中的寫請求發(fā)生阻塞,則記錄所述寫請求阻塞時長,并在所述寫請求阻塞時長達(dá)到預(yù)設(shè)的寫請求阻塞時間閾值時,調(diào)度所述寫請求隊列中的寫請求;
在調(diào)度所述寫請求隊列中的寫請求時,如果所述讀請求隊列中的讀請求發(fā)生阻塞,則記錄所述讀請求阻塞時長,并在所述讀請求阻塞時長達(dá)到預(yù)設(shè)的讀請求阻塞時間閾值時,調(diào)度所述讀請求隊列中的讀請求。
需要說明的是,本申請的所有裝置實施例中提供的I/O請求調(diào)度器均可以采用上述方法實施例中的I/O請求調(diào)度方法,可以用于實現(xiàn)上述方法實施例中的全部技術(shù)方案,其各個功能模塊的功能可以根據(jù)上述方法實施例中的方法具體實現(xiàn),其具體實現(xiàn)過程可參照上述實施例中的相關(guān)描述,此處不再贅述。
為了描述的方便,描述以上裝置時以功能分為各種模塊分別描述。當(dāng)然,在實施本申請時可以把各模塊的功能在同一個或多個軟件和/或硬件中實現(xiàn)。
本說明書中的各個實施例均采用遞進的方式描述,各個實施例之間相同 相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于裝置或系統(tǒng)實施例而言,由于其基本相似于方法實施例,所以描述得比較簡單,相關(guān)之處參見方法實施例的部分說明即可。以上所描述的裝置及系統(tǒng)實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。
專業(yè)人員還可以進一步意識到,結(jié)合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬件、計算機軟件或者二者的結(jié)合來實現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計約束條件。專業(yè)技術(shù)人員可以對每個特定的應(yīng)用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。
結(jié)合本文中所公開的實施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來實施。軟件模塊可以置于隨機存儲器(RAM)、內(nèi)存、只讀存儲器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動磁盤、CD-ROM、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲介質(zhì)中。
對所公開的實施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對這些實施例的多種修改對本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實施例中實現(xiàn)。因此,本發(fā)明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。