本申請涉及計算機領域,特別涉及一種存儲系統(tǒng)服務質量qos控制方法和裝置
背景技術:
分布式存儲是由多臺廉價服務器組成的存儲集群,它將集群中每臺服務器直連的存儲設備通過網絡連接在一起,形成資源池,為用戶提供諸如存儲塊、文件或者對象形式的存儲資源。存儲系統(tǒng)將用戶邏輯上的文件、存儲塊或對象的數(shù)據打散存儲到各臺服務器的物理磁盤內,也就是說,同塊物理磁盤會同時被多個用戶使用,從而導致了不同用戶(或業(yè)務)之間對同一個存儲資源的競爭。
不同的業(yè)務的重要性程度是不同的。存儲資源競爭問題,會讓不重要的業(yè)務搶占存儲資源導致重要業(yè)務因為存儲資源不足而無法正常工作。
為解決這一問題,存儲系統(tǒng)引入了服務質量(qualityofservice,簡稱qos)控制來為不同的業(yè)務分配不同的io資源,以期達到重要業(yè)務的存儲資源不被過度搶占,實現(xiàn)存儲資源分配的平衡。dmclock存儲資源qos控制算法是應用到分布式存儲系統(tǒng)中以實現(xiàn)存儲qos的一種非常有效的算法,但是dmclock算法在實現(xiàn)qos時僅能夠從預留、上限、權重三個時間標簽的維度來控制,實踐中對某些特殊或關鍵業(yè)務來說,它們除了iops性能要求外,在某些應用場景下,還需要滿足更低的時延以及最低存儲資源能力保障的需求,但是,現(xiàn)有的dmclock算法無法滿足這些需求。
技術實現(xiàn)要素:
本申請?zhí)峁┝艘环N存儲系統(tǒng)服務質量qos控制方法和裝置,以解決存儲系統(tǒng)服務質量qos控制方案不能為關鍵業(yè)務提供更低的時延以及最低存儲資源能力保障,無法滿足某些關鍵業(yè)務的處理需求的問題。
根據本申請的一個方面,提供了一種存儲系統(tǒng)服務質量qos控制方法,包括:
接收用戶針對存儲系統(tǒng)的輸入/輸出io請求;
對于接收到的用戶io請求,計算各用戶io請求對應的預留時間標簽,并將接收到的io請求存入io請求集合中;
根據預先配置的用戶優(yōu)先級信息,按照對應用戶的優(yōu)先級從高到低的順序篩選所述io請求集合中預留時間標簽不大于當前時間的io請求,將篩選出的io請求從所述io請求集合中輸出以對該io請求進行處理。
根據本申請的另一個方面,提供了一種存儲系統(tǒng)服務質量qos控制裝置,該裝置包括:
接收模塊,適于接收用戶針對存儲系統(tǒng)的輸入/輸出io請求;
計算模塊,適于對于接收到的用戶io請求,計算各用戶io請求對應的預留時間標簽;
存儲模塊,適于將接收到的io請求存入io請求集合中;
排序模塊,適于根據預先配置的用戶優(yōu)先級信息,按照對應用戶的優(yōu)先級從高到低的順序篩選所述io請求集合中預留時間標簽不大于當前時間的io請求;
輸出模塊,適于將篩選出的io請求從所述io請求集合中輸出以對io請求進行處理。
本申請的有益效果是:本申請實施例的存儲系統(tǒng)服務質量qos控制方法和裝置,當接收到用戶針對存儲系統(tǒng)的輸入或輸出io請求時,計算各io請求對應的預留時間標簽,并將的io請求存入io請求集合中;根據預先配置的用戶優(yōu)先級信息,篩選io請求集合中預留時間標簽不大于當前時間的io請求,將篩選出的io請求從io請求集合中輸出以對io請求進行處理,從而能夠保證關鍵的、配置了更高用戶優(yōu)先級的用戶io請求被及時的處理,滿足關鍵用戶低時延的要求以及在存儲系統(tǒng)能力不足的情況下,能夠集中能力處理高優(yōu)先級用戶的io請求,保障這些用戶業(yè)務的正常運行。
附圖說明
圖1是現(xiàn)有技術dmclock算法的預留時間軸的示意圖;
圖2是本申請一個實施例的存儲系統(tǒng)服務質量qos控制方法的流程示意圖;
圖3a是現(xiàn)有技術dmclock算法采用的數(shù)據結構示意圖;
圖3b是本申請一個實施例改進后dmclock算法的數(shù)據結構示意圖;
圖4是本申請一個實施例的存儲節(jié)點的硬件結構示意圖;
圖5是圖4中存儲系統(tǒng)服務質量qos控制裝置的功能框圖。
具體實施方式
為使本申請的目的、技術方案和優(yōu)點更加清楚,下面將結合附圖對本申請實施方式作進一步地詳細描述。
這里將詳細地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本申請相一致的所有實施方式。相反,它們僅是與如所附權利要求書中所詳述的、本申請的一些方面相一致的裝置和方法的例子。
在本申請使用的術語是僅僅出于描述特定實施例的目的,而非旨在限制本申請。在本申請和所附權利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應當理解,本文中使用的術語“和/或”是指并包含一個或多個相關聯(lián)的列出項目的任何或所有可能組合。
應當理解,盡管在本申請可能采用術語第一、第二、第三等來描述各種信息,但這些信息不應限于這些術語。這些術語僅用來將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語境,如在此所使用的詞語“如果”可以被解釋成為“在……時”或“當……時”或“響應于確定”。
本申請所稱的用戶通常是與業(yè)務相關的,指某一類業(yè)務的用戶。本申請所述“用戶的io請求”或“用戶產生或發(fā)送io請求”可以理解為,前端業(yè)務系統(tǒng),例如前端web服務器、網管服務器、erp(企業(yè)資源計劃enterpriseresourceplanning,簡稱erp)服務器等,針對該業(yè)務系統(tǒng)的用戶的訪問請求而產生的對后端存儲資源的訪問請求。在沒有特別說明的情況下,本申請中所述的“io請求”都是指對存儲系統(tǒng)中的存儲資源的輸入或者輸出請求。一般的,對存儲資源而言,除了常見的存儲系統(tǒng)外部業(yè)務用戶外,還包括存儲系統(tǒng)內部用戶。
實踐中,根據用戶的等級和重要性程度的不同,用戶io請求對時延的要求也是不同的。為解決不同用戶(或業(yè)務)對同一個存儲資源存在競爭這個問題,存儲系統(tǒng)引入服務質量(qualityofservice,簡稱qos)控制來為不同的業(yè)務分配不同的io資源來解決網絡延遲和阻塞,從而提供更好的服務能力。目前,存儲資源qos控制算法從預留(reservation)、上限(limit)和權重(proportional)這三個角度來進行存儲資源分配?!邦A留”是指對給定用戶的最低性能保證,其具體含義可以理解為在給定時間周期內的io處理速度的最低門限值,以每秒進行讀寫操作的次數(shù)(input/outputoperationspersecond,簡稱iops)為例,假設存儲系統(tǒng)為某用戶配置了300iops的預留,那么當用戶發(fā)送io請求的速度超過300iops時,存儲系統(tǒng)保證處理該用戶的實際iops不低于300?!吧舷蕖笔侵赶拗平o定用戶的最高性能,其具體含義可以理解為在給定時間周期內的io處理速度的最高門限值,以避免該給定用戶獨占存儲資源影響其它用戶?!皺嘀亍笔侵复鎯ο到y(tǒng)在滿足所有用戶預留的前提下,在上限門限之下,按照一定比例來分配存儲資源。假設存儲系統(tǒng)有兩個用戶a和b,它們的權重比例為3:1,存儲系統(tǒng)iops總處理能力為100,那么這兩個用戶根據它們的權重比例,實際能夠被存儲系統(tǒng)處理的io分別是75iops和25iops。
通過預留、上限和權重基本可以解決非關鍵業(yè)務或異常業(yè)務對關鍵業(yè)務服務質量的影響。但是,在一些應用場景中還需要提供對不同類型業(yè)務或對某些關鍵業(yè)務的優(yōu)先級控制。例如,某一聯(lián)機事務處理oltp類型的關鍵業(yè)務除了要求存儲系統(tǒng)能夠保證最低iops性能保證外,還希望獲得更低的時延,也就是說,關鍵業(yè)務的io請求需要被更及時地處理。
再例如,由于存儲qos控制除了能夠限制不同業(yè)務用戶的io請求外,還可以被用來限制源自存儲系統(tǒng)本身的io請求,典型的源自存儲系統(tǒng)本身的io請求是備份和/或恢復類的io請求,以恢復類的io請求為例,當存儲系統(tǒng)的某個存儲節(jié)點離線或故障時,存儲系統(tǒng)會啟動恢復程序,從磁盤陣列中的其它磁盤中讀取數(shù)據向目標磁盤恢復缺失的數(shù)據,此時就會產生恢復類的io請求。如果外部用戶的io請求和恢復類的io請求操作了同一份數(shù)據,那么此時恢復類的io請求就變得很緊急,必須立即處理,否則會影響該故障存儲節(jié)點上外部用戶io請求的時延。
此外,如果存儲系統(tǒng)總處理能力低于所有用戶的預留之和,按照每個用戶級別相等的處理方式也可能導致每個用戶的預留都保證不了。例如,假設存儲系統(tǒng)的總處理能力為100iops,該存儲系統(tǒng)有10個用戶,每個用戶的預留為100iops,那么,按照存儲qos算法,存儲系統(tǒng)會盡力保證這10個用戶每個分配10iops,雖然,這樣做可以保證每個用戶都被分配到存儲資源,但是,由于存儲系統(tǒng)總處理能力是低于所有用戶的預留之和的,實際上這會導致每個用戶的預留都不能全部滿足,從而無法保證某些關鍵業(yè)務的正常運行。
由此可知,需要一種優(yōu)先保證那些關鍵業(yè)務正常運行的方案,尤其是在存儲系統(tǒng)能力不足的情況下,保證關鍵業(yè)務的io請求也能被處理,從而滿足某些關鍵的業(yè)務正常運行需求。
本申請實施例的技術方案是基于存儲服務質量控制算法實現(xiàn)的,這里先對存儲服務質量控制算法進行一些說明。
首先介紹mclock算法,mclock算法是用來實現(xiàn)存儲資源公平調度的,它同時支持服務質量qos控制中的預留、上限和權重三個參數(shù),mclock算法,針對qos中的三個參數(shù):預留、上限和權重,給到達的每個io請求計算三個時間標簽,時間標簽代表該請求按照qos控制要求正常應該被處理的時刻。時間標簽越小,越早出隊列。對于第一個io請求,這三個時間標簽均是第一個io請求到達的時間,之后每個io請求,它們的時間標簽分別通過相應的標簽計算公式計算得到。
以預留為例,mclock算法利用下述公式(1)為收到的io請求計算預留時間標簽,
上述公式(1)中,
這些時間標簽中,如果對應的時間標簽的值是大于當前時間的,對于預留時間標簽來說,表示這個用戶的io請求到達時,用戶的預留已經滿足,對于上限時間標簽來說,表示這個用戶的io請求到達時,用戶已經達到io請求的上限,不能進行存儲資源分配。如果對應的時間標簽的值是小于等于當前時間,那么對于預留時間標簽來說,表示這個用戶的io請求到達時,用戶的io預留要求還沒有滿足,對于上限時間標簽來說,表示用戶的io請求到達時,用戶的io請求沒有達到上限,還可以繼續(xù)為其io請求分配存儲資源。對于權重時間標簽來說,權重時間標簽不與當前時間做比較。
由此可知,mclock本質上實現(xiàn)了一個排序隊列,用戶的io請求先按照接收請求的順序入隊列,然后按照用戶的qos參數(shù)(預留、上限和權重)配置出隊列。io請求出隊列時,比較當前時間和io請求的時間標簽,如果當前時間大于io請求時間標簽,則io請求出隊列,否則io請求不出隊列。
接著介紹dmclock算法,dmclock算法將mclock算法擴展到了分布式的場景。dmclock算法具體通過如下公式(2)計算收到的用戶的io請求:
其中,i表示第i個用戶,
和上述公式(1)相比,dmclock算法計算io請求的預留時間標簽時加入了分布式存儲系統(tǒng)的其它存儲節(jié)點對該用戶的io請求的處理因素。這是由于分布式存儲系統(tǒng)中有多個存儲節(jié)點,每個存儲節(jié)點都可能處理同一個用戶的io請求,這就要求當前的存儲節(jié)點在計算一個用戶的io請求的預留時間標簽時,考慮分布式存儲系統(tǒng)中其它存儲節(jié)點上處理的該用戶的io請求的處理階段,即,將分布式存儲系統(tǒng)的一個存儲節(jié)點收到該用戶的前一個io請求時起到收到當前io請求時為止的時間段內,該用戶的io請求中那些被分布式存儲系統(tǒng)的其它存儲節(jié)點上,在預留階段(基于約束constraint-based的處理階段)輸出io請求集合的數(shù)目,從而保證即滿足該用戶的預留,又不至于為該用戶分配過多存儲資源影響其它用戶對存儲資源的需求。
另外,前述公式(1)和(2)中計算預留時間標簽時,都考慮了用戶i的前一個io請求的預留時間標簽的影響,這是為了避免用戶i較長一段時間內不活動(即,不發(fā)送io請求),而后重新活動并發(fā)送io請求時新io請求的預留時間標簽遠遠小于當前時間,因此按照dmclock的算法會被優(yōu)先處理導致對其它用戶不公平的問題。注:例如根據前述公式(2)可知,新io請求的預留時間標簽由兩個算式(分別是
正常情況下,用戶i的兩個相鄰io請求的時間標簽的間隔是1/ri,ri表示用戶的預留,這恰好是用戶的預留的平均速度,根據dmclock算法只要保證在任意時刻輸出io請求時只要將當前時間前面的io請求輸出處理,則存儲系統(tǒng)就能夠滿足用戶的預留要求。
舉例而言,存儲系統(tǒng)的一個存儲節(jié)點s在t0時刻開始接收用戶c的請求,t1時刻開始處理用戶c的請求,從t0時刻到t1時刻,時間為1秒鐘,在這1秒鐘內,存儲節(jié)點s收到了用戶c的10個請求,而用戶的c的預留為10iops,那么對于用戶c的第一個請求,在預留時間軸上,其時間標簽就是對應t0時刻的位置,根據上述公式,第二個請求向右偏移1/10,以此類推,第十個請求在該預留時間軸上,其時間標簽就是對應t1時刻的位置。如果存儲節(jié)點s在當前時間t1時刻將這10個請求全部處理掉,則恰好能滿足用戶c的預留,保證了用戶c的最低性能。同理,對于存儲節(jié)點s的每個用戶,如果都按照這樣的處理順序進行處理,則能滿足每個用戶的預留。
另外,需要說明的是,dmclock算法分兩個階段將io請求輸出dmclock隊列。第一個階段稱為基于約束constraint-based的處理階段,這一階段的處理過程是:基于io請求的預留時間標簽所構成的預留時間軸,按照io請求的預留時間標簽從小到大的順序,從隊列中取出預留時間標簽不大于當前時間的io請求,優(yōu)先進行處理。constraint-based階段的目的是為了優(yōu)先保證所有用戶的預留,當存儲系統(tǒng)總能力高于所有用戶的預留和時,存儲系統(tǒng)可以及時處理當前時間前的io請求完成預留目標;當預留時間軸上沒有預留時間標簽不大于當前時間的io請求時,第一個階段完成。當存儲系統(tǒng)的總能力低于所有用戶的預留和時,存儲系統(tǒng)將按照用戶的預留的比例處理用戶的io請求。
如果存儲系統(tǒng)在保證了用戶的預留之后還有多余能力處理用戶io請求,則開始進入第二個階段,第二個階段稱為基于權重weight-based的處理階段。這個階段有兩個目標,一是限制用戶的上限,二是基于用戶權重。同樣地,weight-based階段也是按照時間標簽從小到大的順序從時間軸中取出請求,和前述constraint-based階段不同的是,這一階段是按照io請求的權重時間標簽的大小順序從權重時間軸中選擇io請求,同時排除選擇的io請求中上限時間標簽已經大于上限時間軸上當前時間的io請求,將同時滿足這兩個條件的io請求取出進行處理。
由前述說明可知,mclock算法同時支持預留、上限和權重控制,但mclock只支持單機環(huán)境,dmclock算法是將mclock算法擴展到了分布式環(huán)境。本實施例中以下主要以dmclock算法實現(xiàn)服務質量qos為例進行說明,但是,本實施例的技術方案也可以應用在mclock算法實現(xiàn)qos的場景中,對此不作限制。
現(xiàn)有dmclock算法沒有提供預留階段的優(yōu)先級控制,導致現(xiàn)有的dmclock實現(xiàn)存儲qos時存在如下兩個缺陷:
缺陷一:無法為特別關鍵的用戶(如,恢復類io)的io請求提供更低的時延。
缺陷二:無法為特別關鍵的業(yè)務的io請求提供最低保證,尤其是在存儲系統(tǒng)處理能力不足的情況下,導致不能保證特別關鍵的業(yè)務的正常運行。
例如,參見圖1,假設存儲系統(tǒng)有三個用戶a,b和c,圖1中,三角形表示來自用戶a的io請求,正方形表示來自用戶b的io請求,六邊形表示來自用戶c的io請求。這三個用戶的預留均相同,存儲系統(tǒng)在t0時刻開始接收用戶請求,t1時刻開始處理用戶請求。
注:這里的處理時間t1時刻只是舉例說明,實際上,存儲系統(tǒng)任意時刻都可能會處理請求。另外,這里的用戶數(shù)量也是示意性說明,實踐中用戶數(shù)量遠不止三個。
在從t0到t1的時間段內,存儲系統(tǒng)總共接收到六個用戶請求,兩個來自用戶a,兩個來自用戶b,兩個來自用戶c。按前文所述,dmclock算法在constraint-based階段,是按照預留時間軸上io請求的時間標簽從小到大的順序出隊列,那么,圖1中這六個請求出dmclock隊列的順序即為:a1->b1->c1->a2->b2->c2。因為t1時刻右面的三個請求:a3、a4、a5的時間標簽大于當前時間,所以這三個請求在預留階段不出隊列以保證存儲系統(tǒng)集中能力滿足用戶的預留。再根據前面的描述可知,請求出隊列的順序影響著請求的時延,越早出隊列,時延越低,反之越高。
而實踐中,不同的業(yè)務對時延有不同的要求,例如聯(lián)機事務處理(on-linetransactionprocessing,簡稱oltp)業(yè)務對時延要求高,而聯(lián)機分析處理(onlineanalyticalprocessing,簡稱olap)業(yè)務只對帶寬敏感而對時延沒有要求。如果預留階段只按照請求的時間標簽進行處理,勢必會導致對時延要求高的業(yè)務的io請求和時延要求低的業(yè)務的io處于相同的地位,進而無法為特別關鍵的業(yè)務(如,恢復類io)的io請求提供更低的時延。在存儲系統(tǒng)處理能力不足的情況下,也無法為特別關鍵的業(yè)務的io請求提供最低保證。
為了優(yōu)化存儲系統(tǒng)的服務質量,本實施例中對服務質量控制算法進行了改進,提出了一種存儲系統(tǒng)服務質量qos控制方法,如圖2所示,本實施例的存儲系統(tǒng)服務質量qos控制方法包括如下步驟:
步驟s201:接收用戶針對存儲系統(tǒng)的輸入/輸出io請求;這里的“/”表示或者;
步驟s202:對于接收到的用戶io請求,計算各用戶io請求對應的預留時間標簽,并將接收到的io請求存入io請求集合中;
步驟s203:根據預先配置的用戶優(yōu)先級信息,按照對應用戶的優(yōu)先級從高到低的順序篩選所述io請求集合中預留時間標簽不大于當前時間的io請求,將篩選出的io請求從所述io請求集合中輸出。
由圖2所示可知,本實施例的存儲系統(tǒng)服務質量qos控制方法在接收到用戶的io請求后,計算io請求的預留時間標簽,然后將io請求放入io請求集合中,在constraint-based階段,請求出隊列時,按照預先配置的用戶的優(yōu)先級信息將io請求輸出以對該io請求進行后續(xù)處理,從而不是僅僅比較請求的預留時間標簽和當前時間的大小,而先根據用戶的優(yōu)先級,再根據預留時間標簽來確定io請求輸出的順序,這樣就保證了高優(yōu)先級的用戶的io請求比低優(yōu)先級的用戶的io請求先輸出,滿足了關鍵用戶的低時延的要求,提高了存儲服務質量。
本申請一個實施例通過對dmclock算法進行改進,在預留階段(即constraint-based階段)引入優(yōu)先級機制,從而能夠對延遲要求高的業(yè)務,配置高優(yōu)先級,以及當存儲系統(tǒng)能力不足情況下更需要優(yōu)先保證的業(yè)務,配高優(yōu)先級;或者,對于源自存儲系統(tǒng)自身的io和外部用戶io操作同一份數(shù)據的情況,為源自存儲系統(tǒng)自身的io配置高優(yōu)先級,保證高優(yōu)先級用戶io請求及時處理。即,利用本申請的方案,實現(xiàn)了在多個用戶競爭存儲資源時,保證更緊急的用戶的io被及時處理。
對于源自存儲系統(tǒng)自身的io和外部用戶io操作同一份數(shù)據的情況,為源自存儲系統(tǒng)自身的io配置高優(yōu)先級,保證高優(yōu)先級用戶io請求及時處理,主要是針對下列場景:分布式存儲系統(tǒng)的存儲節(jié)點故障時會進行恢復操作,這就涉及兩種情況,一種是待恢復的數(shù)據沒有外部用戶io請求,另一種是待恢復數(shù)據恰好有外部用戶io請求。例如,外部用戶a發(fā)送io請求讀取data1,而此時,存儲節(jié)點發(fā)生了故障需要進行恢復,當存儲節(jié)點進行恢復時,如果該存儲節(jié)點上有些數(shù)據丟失則需要從另外的存儲節(jié)點獲取數(shù)據,發(fā)生故障的存儲節(jié)點上的恢復程序會生成內部io請求,這些內部io請求需要被發(fā)送到其它存儲節(jié)點上以獲取數(shù)據完成恢復。如果,故障的存儲節(jié)點的恢復程序生成的io請求同樣需要讀取data1(除此之外,可能還需要獲取其它數(shù)據),就會發(fā)生外部用戶io命中存儲節(jié)點的恢復類io的情況,很明顯,恢復類io更緊急,否則會導致外部用戶io請求延遲太高,影響業(yè)務正常運行。
對此,通過本實施例的方案可以為恢復操作配置兩個內部用戶,一個內部用戶處理正常數(shù)據(即,沒有被外部用戶io命中的數(shù)據)恢復,另一個內部用戶處理緊急數(shù)據(被外部用戶io命中的數(shù)據)的恢復,并對處理緊急數(shù)據恢復的用戶配置較高的預留和優(yōu)先級,如此保證了命中用戶io的恢復類io被更及時地處理(即,更早的輸出處理),從而降低用戶io的時延,優(yōu)化了存儲系統(tǒng)的服務質量。
本申請的技術方案改進dmclock算法,并在預留階段引入優(yōu)先級機制,改變了dmclock算法原有數(shù)據結構和預留階段輸出io請求的順序,以下詳述之。
如圖3a所示,dmclock算法采用最小堆數(shù)據結構。最小堆,是一種經過排序的完全二叉樹,其特點是:根結點的鍵值是所有堆結點鍵值中最小的。在預留處理階段即基于約束的處理階段,以io請求的預留時間標簽值作為堆的鍵值,進行排序,每次輸出所有用戶中預留時間標簽值最小的io請求進行處理。堆中的每個節(jié)點元素的數(shù)據結構中至少包括用戶標識、io請求的預留時間標簽。圖3a中示意了c1到c7共7個用戶的io請求構成最小堆,可以看到,當前堆頂(即,根結點)對應的是用戶c1的io請求,則本次輸出處理時就會取出c1用戶的預留時間標簽最小的io請求,實際應用時,堆中可能包括多個用戶的io請求,所以dmclock算法每次取io請求的時候都是按照只取堆頂?shù)膇o請求的原則選擇io請求。當每取出一個io請求后,最小堆會重新以每個io請求的預留時間標簽值進行排序,以確定出堆頂對應的用戶io請求,也就是說,堆頂對應的用戶io請求是變化的。
由此可知,dmclock算法在預留階段是沒有優(yōu)先級機制的,每個用戶的io請求都被同等對待。
如圖3b所示,本申請實施例對dmclock算法進行改進,在預留階段引入優(yōu)先級機制,使高優(yōu)先級的用戶的io請求在預留階段優(yōu)先被輸出,以降低高優(yōu)先級用戶的io請求的處理時延,滿足實際需求。
實際應用過程中,存儲系統(tǒng)提供配置界面接收管理員對用戶優(yōu)先級的配置。優(yōu)選地,管理員根據不同用戶對業(yè)務時延的要求為該用戶配置相應的優(yōu)先級的配置信息。例如,為存儲系統(tǒng)恢復類用戶配置最高優(yōu)先級,一級;為oltp業(yè)務用戶配置較高的優(yōu)先級,二級;再為數(shù)據校驗業(yè)務用戶配置高優(yōu)先級,三級。然后存儲系統(tǒng)將這些配置信息保存起來??梢岳斫?,實踐中,管理員可以根據需求動態(tài)配置存儲系統(tǒng)的用戶優(yōu)先級,以滿足高優(yōu)先級用戶的io請求的低時延要求,保證關鍵業(yè)務的正常運行。
用戶優(yōu)先級配置完成后,接下來,以存儲系統(tǒng)的一個存儲節(jié)點為例說明。
本實施例中,具體的,用戶io請求的處理過程是這樣的:
當存儲節(jié)點接收到用戶針對存儲系統(tǒng)的io請求后,對于接收到的用戶io請求,計算各用戶io請求對應的預留時間標簽,并將接收到的io請求存入io請求集合中。
優(yōu)選地,將相同優(yōu)先級用戶的io請求存入同一子集中,不同優(yōu)先級用戶的io請求存入不同的子集中。
具體實現(xiàn)時,可以針對每個子集構造一個最小堆,以該子集中io請求的預留時間標簽值作為堆的鍵值,進行排序,每次輸出該子集中所有用戶的預留時間標簽值最小的io請求進行處理。堆中的每個節(jié)點元素的數(shù)據結構中至少包括用戶標識、io請求的預留時間標簽。當將相同優(yōu)先級用戶的io請求存入同一子集中之后,由于用戶的優(yōu)先級不同,對應的,每個子集的優(yōu)先級也不同的。
在輸出io請求時,先從最高優(yōu)先級用戶的子集對應的最小堆中輸出符合預留階段處理條件的io請求。以圖3b為例,示例了兩個最小堆302,用戶c1、用戶c2和用戶c3的優(yōu)先級相同,構成第一優(yōu)先級。用戶c4、用戶c5和用戶c6優(yōu)先級相同,構成第二優(yōu)先級。第一優(yōu)先級高于第二優(yōu)先級。用戶c1、用戶c2和用戶c3的io請求構成一個最小堆,用戶c4、用戶c5和用戶c6的io請求構成一個最小堆。在輸出io請求時,首先從第一優(yōu)先級對應的堆中輸出預留時間標簽不大于當前時間的io請求,然后再從第二優(yōu)先級對應的堆中輸出預留時間標簽不大于當前時間的io請求。
如此,根據對應用戶優(yōu)先級信息,先從高優(yōu)先級用戶的子集中篩選出預留時間標簽不大于當前時間的io請求,當高優(yōu)先級用戶的子集篩選完成后,再從低優(yōu)先級用戶的子集中篩選預留時間標簽不大于當前時間的io請求。
實踐中,相同優(yōu)先級的用戶的數(shù)量可能不止一個,如果高優(yōu)先級用戶的子集中包括多個用戶的io請求,那么在篩選io請求時,可以比較各用戶的預留時間標簽不大于當前時間的io請求的預留時間標簽,若高優(yōu)先級用戶的子集中不存在預留時間標簽不大于當前時間的io請求則篩選完成。在對高優(yōu)先級用戶子集中的io請求篩選,得到預留時間標簽不大于當前時間的io請求后,按照預留時間標簽從小到大的順序,將io請求從高優(yōu)先級用戶的子集中輸出,以供后續(xù)處理。在高優(yōu)先級用戶的子集篩選完成后,按照同樣的方式接著篩選低優(yōu)先級用戶的子集。
具體實現(xiàn)時,可以利用一個優(yōu)先級數(shù)組保存每個子集的優(yōu)先級信息。例如,創(chuàng)建一個優(yōu)先級數(shù)組,并配置優(yōu)先級數(shù)組中每個數(shù)組元素指向一個子集,結合圖3b,優(yōu)先級數(shù)組301中的第一個元素1指向一個子集(即,一個最小堆302)優(yōu)先級數(shù)組301中的第二個元素2指向另一個子集(即,一個最小堆302)。需要說明的是,雖然兩個最小堆的附圖標記相同,但是由于每個最小堆對應的優(yōu)先級數(shù)組中的元素不同,所以兩個最小堆的優(yōu)先級是不同的。通過優(yōu)先級數(shù)組,以及優(yōu)先級數(shù)組中的元素與子集的對應關系,方便查找對應優(yōu)先級的子集。
結合圖3b,本實施例中創(chuàng)建一個優(yōu)先級數(shù)組301并建立優(yōu)先級數(shù)組中每個元素和保存io請求的子集之間的一一對應關系。一般的,優(yōu)先級數(shù)組301中包括多個元素(圖3b示意了兩個元素),優(yōu)先級數(shù)組301中每個元素代表預先配置的一個用戶優(yōu)先級級別,并指向該優(yōu)先級級別對應的一個最小堆。通過依次選取優(yōu)先級數(shù)組中的元素,并查找該元素對應的最小堆排序后的用戶io請求輸出,保證了在預留階段為高優(yōu)先級用戶的io請求提供更低的時延。
由上可知,本實施例的方法在dmclock算法預留階段引入優(yōu)先級,改變了預留階段io請求輸出順序,而對dmclock算法的weight-based階段沒有影響,weight-based階段的處理和現(xiàn)有技術相同,這里不再重復贅述。
下面結合圖1,對本實施例的技術方案帶來的技術效果進行說明。
假設存儲系統(tǒng)在t0時刻開始接收用戶請求,t1時刻開始處理用戶請求。在從t0到t1的時間段內,存儲系統(tǒng)總共接收到預留均相同的三個用戶a、b和c的的六個io請求,這六個io中兩個來自用戶a,兩個來自用戶b,兩個來自用戶c。按前文所述,按照現(xiàn)有dmclock算法,則這六個請求輸出順序為:a1->b1->c1->a2->b2->c2。
而按照本實施例的方法,預先為用戶a和c配置相同的優(yōu)先級,并且用戶a和c的優(yōu)先級高于用戶b的優(yōu)先級。存儲系統(tǒng)在t0時刻開始接收用戶請求,t1時刻開始處理請求。在預留階段引入優(yōu)先級后,則這六個請求輸出順序變成:a1->c1->a2->c2->b1->b2。
結合存儲系統(tǒng)的處理能力進行說明,如果存儲系統(tǒng)能滿足這三個用戶的預留和,即,用戶a,用戶c和用戶b的預留都能滿足,如此,雖然用戶a,用戶c和用戶b的預留都得到滿足,但是擁有高優(yōu)先級的用戶a和用戶c同時獲得了比用戶b更低的時延,從而滿足了高優(yōu)先級用戶的低時延要求。如果存儲系統(tǒng)不能滿足這三個用戶的預留和,由于用戶a和用戶c的優(yōu)先級比用戶b的優(yōu)先級高,那么存儲系統(tǒng)也能保證集中能力處理高優(yōu)先級用戶的io請求,而放棄處理低優(yōu)先級用戶的io請求,從而滿足了高優(yōu)先級用戶的低時延要求,以及最低處理能力保障,使得高優(yōu)先級的用戶業(yè)務能正常運行。
由此可知,通過應用本實施例的方法,在dmclock算法的constraint-based階段,如果存儲系統(tǒng)的處理能力高于所有用戶的預留之和,那么,一方面,存儲系統(tǒng)能夠同時滿足所有用戶的預留并且不會導致低優(yōu)先級的用戶被阻塞或延遲。另一方面,高優(yōu)先級的用戶將獲得更低時延。如果存儲系統(tǒng)的處理能力低于所有用戶的預留之和,那么,由于引入了優(yōu)先級,以盡力保證高優(yōu)先級的用戶的io請求被處理,所以可能發(fā)生長時間阻塞低優(yōu)先級的用戶的io請求的情況,但是,這種策略在實際應用中更容易被接受,例如,現(xiàn)在有兩個業(yè)務同時競爭存儲資源,一個為oltp業(yè)務,另一個為數(shù)據備份業(yè)務,如果存儲系統(tǒng)處理能力不足,舍備份業(yè)務,保oltp業(yè)務,更能滿足實際應用場景和需求。另外,由于本實施例的優(yōu)先級只應用在constraint-based階段,所以并不會影響dmclock算法在后一階段(即,weight-based階段)對權重和上限的控制。
與前述方法相對應的,本公開還提供了一種存儲系統(tǒng)服務質量qos控制裝置,該裝置可應用于存儲系統(tǒng)的存儲節(jié)點中。
本申請?zhí)峁┑难b置可以通過軟件實現(xiàn),也可以通過硬件或者軟硬件結合的方式實現(xiàn)。以軟件實現(xiàn)為例,可通過處理器10將非易失性存儲器50中與存儲系統(tǒng)服務質量qos控制裝置60對應的機器可執(zhí)行指令讀取到內存40中運行。從硬件層面而言,如圖4所示,為本申請存儲節(jié)點的一種硬件結構圖,除了圖4所示的處理器10、內部總線20、網絡接口30、內存40、以及非易失性存儲器50之外,根據該存儲節(jié)點的實際功能,還可以包括其他硬件,對此不再贅述。
在不同的實施例中,所述非易失性存儲器50可以是:存儲驅動器(如硬盤驅動器)、固態(tài)硬盤、任何類型的存儲盤(如光盤、dvd等),或者類似的存儲介質,或者它們的組合。所述內存40可以是:ram(radomaccessmemory,隨機存取存儲器)、易失存儲器、閃存。
進一步,非易失性存儲器50和內存40作為機器可讀存儲介質,其上可存儲由處理器10執(zhí)行的存儲系統(tǒng)服務質量qos控制裝置60對應的機器可執(zhí)行指令。
請參考圖5,從功能上劃分,存儲系統(tǒng)服務質量qos控制裝置60可包括:
接收模塊601,適于接收用戶針對存儲系統(tǒng)的輸入/輸出io請求;
計算模塊602,適于對于接收到的用戶io請求,計算各用戶io請求對應的預留時間標簽;
存儲模塊603,適于將接收到的io請求存入io請求集合中;
排序模塊604,適于根據預先配置的用戶優(yōu)先級信息,按照對應用戶的優(yōu)先級從高到低的順序篩選所述io請求集合中預留時間標簽不大于當前時間的io請求;
輸出模塊605,適于將篩選出的io請求從所述io請求集合中輸出以對io請求進行處理。
另外,對于裝置實施例而言,由于其基本對應于方法實施例,所以相關之處參見方法實施例的部分說明即可。以上所描述的裝置實施例僅僅是示意性的,其中所述作為分離部件說明的模塊可以是或者也可以不是物理上分開的,作為模塊顯示的部件可以是或者也可以不是物理模塊,即可以位于一個地方,或者也可以分布到多個網絡模塊上??梢愿鶕嶋H的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領域普通技術人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實施。
需要說明的是,在本文中,諸如第一和第二等之類的關系術語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關系或者順序。術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設備中還存在另外的相同要素。
以上所述僅為本申請的較佳實施例而已,并非用于限定本申請的保護范圍。凡在本申請的精神和原則之內所作的任何修改、等同替換、改進等,均包含在本申請的保護范圍內。