一種I/O請求消息的處理方法及控制器【技術領域】本發(fā)明涉及磁盤讀/寫技術,尤其涉及一種I/O請求消息的處理方法及控制器。
背景技術:目前,輸入/輸出(Input/Output,I/O)調度層在將I/O請求消息下發(fā)給磁盤之前,會進行I/O請求消息的排序,用以減少數據處理的時間,在單位時間內可以處理更多的數據,提高磁盤的處理性能,還能夠減少磁盤抖動,降低磁盤損耗,提高磁盤的可靠性。然而,I/O調度層對I/O請求消息的排序會導致先收到的IO請求不一定能被優(yōu)先處理,從而出現I/O請求消息由于無法及時得到處理導致的I/O請求消息被餓死的問題。
技術實現要素:有鑒于此,本發(fā)明提供一種I/O請求消息的處理方法及控制器,以避免I/O請求消息被餓死的問題。第一方面,本發(fā)明實施例提供了一種I/O請求消息的處理方法,應用于存儲系統(tǒng)中,所述存儲系統(tǒng)包括主機和存儲設備,所述存儲設備包括控制器、緩存和磁盤,包括:所述控制器接收所述主機發(fā)送的M個輸入/輸出I/O請求消息,M為大于1的自然數,其中每個所述I/O請求消息中包含起始地址;將所述M個I/O請求消息寫入所述緩存;從所述緩存中獲得N個I/O請求消息,所述N個I/O請求消息是所述M個I/O請求消息中最早接收的I/O請求消息的集合,其中,N為大于1的自然數,并且N小于或等于M;按照每個所述I/O請求消息的起始地址將所述N個I/O請求消息排序,以獲得K個I/O請求消息,其中,K為大于1的自然數;從所述緩存中獲得所述K個I/O請求消息;將所述K個I/O請求消息依次發(fā)送給所述磁盤。在第一方面的第一種可能的實現方式中,所述每個所述I/O請求消息中還包括長度;所述按照每個所述I/O請求消息的起始地址將所述N個I/O請求消息排序,以獲得K個I/O請求消息,包括:按照每個所述I/O請求消息的起始地址,對所述N個I/O請求消息排序,以獲得按照起始地址排序的N個I/O請求消息;依據每個I/O請求消息中包含的起始地址和長度,判斷相鄰的兩個所述I/O請求消息是否連續(xù);若相鄰的兩個所述I/O請求消息連續(xù),將兩個所述I/O請求消息的長度的和作為所述兩個所述I/O請求消息中前一個所述I/O請求消息的長度,并刪除后一個所述I/O請求消息,以合并相鄰的兩個所述I/O請求消息,獲得按照起始地址排序的K個I/O請求消息,K小于或等于N。在第一方面的第二種可能的實現方式中,所述方法還包括:按照接收時間從遠到近的順序,對所述M個I/O請求消息進行排序。第二方面,本發(fā)明實施例提供了一種控制器,所述控制器應用于存儲設備,所述存儲設備還包括緩存和硬盤,所述存儲設備應用于存儲系統(tǒng),所述存儲系統(tǒng)還包括主機;包括:接收單元,用于接收所述主機發(fā)送的M個輸入/輸出I/O請求消息,M為大于1的自然數,其中每個所述I/O請求消息中包含起始地址;寫入單元,用于將所述M個I/O請求消息寫入所述緩存;獲取單元,用于從所述緩存中獲得N個I/O請求消息,所述N個I/O請求消息是所述M個I/O請求消息中最早接收的I/O請求消息的集合,其中,N為大于1的自然數,并且N小于或等于M;處理單元,用于按照每個所述I/O請求消息的起始地址將所述N個I/O請求消息排序,以獲得K個I/O請求消息,其中,K為大于1的自然數;讀取單元,用于從所述緩存中獲得所述K個I/O請求消息;發(fā)送單元,用于將所述K個I/O請求消息依次發(fā)送給所述磁盤。在第二方面的第一種可能的實現方式中,所述每個所述I/O請求消息中還包括長度;所述處理單元具體用于:按照每個所述I/O請求消息的起始地址,對所述N個I/O請求消息排序,以獲得按照起始地址排序的N個I/O請求消息;依據每個I/O請求消息中包含的起始地址和長度,判斷相鄰的兩個所述I/O請求消息是否連續(xù);若相鄰的兩個所述I/O請求消息連續(xù),將兩個所述I/O請求消息的長度的和作為所述兩個所述I/O請求消息中前一個所述I/O請求消息的長度,并刪除后一個所述I/O請求消息,以合并相鄰的兩個所述I/O請求消息,獲得按照起始地址排序的K個I/O請求消息,K小于或等于N。在第二方面的第二種可能的實現方式中,所述處理單元,還用于按照接收時間從遠到近的順序,對所述M個I/O請求消息進行排序。通過上述技術方案,對收到的I/O請求消息中最早收到的部分I/O請求消息按照起始地址進行排序,能夠避免先收到的IO請求不能被優(yōu)先處理,從而出現的I/O請求消息被餓死的問題,能夠提升I/O請求消息在磁盤上的順序度。【附圖說明】為了更清楚地說明本發(fā)明實施例的技術方案,下面將對實施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據這些附圖獲得其它的附圖。圖1是本發(fā)明實施例所提供的I/O請求消息的處理方法的流程示意圖;圖2是本發(fā)明實施例利用請求接收隊列和請求發(fā)送隊列的I/O請求消息的處理方法的示意圖;圖3是本發(fā)明實施例所提供的I/O請求消息的處理方法的應用場景的示意圖;圖4是本發(fā)明實施例所提供的控制器的功能方塊圖;圖5是本發(fā)明實施例所提供的控制器的結構示意圖?!揪唧w實施方式】為了更好的理解本發(fā)明的技術方案,下面結合附圖對本發(fā)明實施例進行詳細描述。應當明確,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領域普通技術人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護的范圍。本發(fā)明實施例給出一種I/O請求消息的處理方法,該方法應用于存儲系統(tǒng)中,該存儲系統(tǒng)包括主機和存儲設備,存儲設備包括控制器、緩存和磁盤。請參考圖1,其為本發(fā)明實施例所提供的I/O請求消息的處理方法的流程示意圖;如圖所示,該方法包括以下步驟:步驟101,控制器接收主機發(fā)送的M個I/O請求消息,M為大于1的自然數,其中每個I/O請求消息中包含起始地址;將M個I/O請求消息寫入所述緩存。具體的,如圖2所示,本發(fā)明實施例中,預先在緩存中創(chuàng)建兩個隊列,即請求接收隊列和請求發(fā)送隊列;其中,請求接收隊列用于緩存控制器接收到的I/O請求消息,請求發(fā)送隊列用于向磁盤發(fā)送I/O請求消息??刂破鹘邮招枰獙/O請求消息進行排序的主機發(fā)送的M個I/O請求消息,所述I/O請求消息中包含起始地址和長度,控制器將M個I/O請求消息寫入緩存??刂破饕罁鹗嫉刂泛烷L度,判斷收到的I/O請求消息能否與預設的請求接收隊列中最后一個I/O請求消息合并;若收到的I/O請求消息中包含的起始地址,不等于最后一個I/O請求消息的起始地址與長度的之和,表示收到的I/O請求消息與請求接收隊列中最后一個I/O請求消息不連續(xù),則判斷出收到的I/O請求消息與請求接收隊列中最后一個I/O請求消息不能合并,將收到的I/O請求消息插入請求接收隊列的隊尾,以獲得按照接收時間從遠到近排序的M個I/O請求消息,即按照接收時間從遠到近的順序,對所述M個I/O請求消息進行排序;對于所述請求接收隊列中包含的M個I/O請求消息,M為大于1的自然數。若收到的I/O請求消息中包含的起始地址,等于當前最后一個I/O請求消息的起始地址與長度的之和,表示收到的I/O請求消息與請求接收隊列中最后一個I/O請求消息連續(xù),則判斷出收到的I/O請求消息與請求接收隊列中最后一個I/O請求消息可以合并,將收到的I/O請求消息與最后一個I/O請求消息合并,即按照接收時間從遠到近的順序,對所述M個I/O請求消息進行排序。其中,若請求接收隊列中最后一個I/O請求消息為第一I/O請求消息,收到的I/O請求消息為第二I/O請求消息,將第一I/O請求消息和第二I/O請求消息合并,獲得第三I/O請求消息的方法可以包括:第一I/O請求消息中包含的起始地址作為第三I/O請求消息中包含的起始地址,依據第一I/O請求消息的長度與第二I/O請求消息的長度的和,獲得第三I/O請求消息的長度,從而獲得第三I/O請求消息;換句話說,將收到的I/O請求消息與當前最后一個I/O請求消息合并,可以利用第一I/O請求消息的長度與第二I/O請求消息的長度之和,更新第一I/O請求消息的長度,即將第二I/O請求消息合并到第一I/O請求消息中,因此,需要刪除第二I/O請求消息。例如,第一I/O請求消息中起始地址為0,長度為10個單位,第二I/O請求消息中起始地址為10,長度為20,則第二I/O請求消息中包含的起始地址10等于第一I/O請求消息的起始地址0與長度10之和,因此第一I/O請求消息和第二I/O請求消息連續(xù),可以合并第一I/O請求消息和第二I/O請求消息,獲得第三I/O請求消息,所述第三I/O請求消息包含的起始地址為0,長度為30;其中,所述起始地址可以為LBA。步驟102,從所述緩存中獲得N個I/O請求消息,所述N個I/O請求消息是所述M個I/O請求消息中最早接收的I/O請求消息的集合,其中,N為大于1的自然數,并且N小于或等于M。具體的,如圖2所示,控制器對緩存中預設的請求發(fā)送隊列進行檢測,若檢測出所述請求發(fā)送隊列中沒有I/O請求消息,則從緩存中按照接收時間排序的M個I/O請求消息中,獲得N個I/O請求消息,所述N個I/O請求消息是所述M個I/O請求消息中最早接收的I/O請求消息的集合,即由于M個I/O請求消息是按照接收時間由遠到近排序的,因此,越早接收的I/O請求消息的排序越靠前,因此可以獲得M個I/O請求消息中的前N個I/O請求消息,其中,N為大于1的自然數,并且N小于或等于M。其中,為了防止I/O請求消息被餓死,即不能因為排序導致某個I/O請求消息的時延超過截止時間T,如目前在Linux的通用塊設備的排序算法中,截止時間(Deadline)T等于500ms;本實施例中,獲得的I/O請求消息的數目N等于截止時間T除以單個請求的處理時間;其中,磁盤的單個請求的處理時間是由磁盤類型D_Type和I/O請求消息的長度共同決定,則利用如下公式可以獲得的I/O請求消息的數目N:N=T/f(D_Type,IO_Size)一般情況下,磁盤類型D_Type和截止時間T的數值大小比較穩(wěn)定,因此,實際應用中,可以根據業(yè)務,對I/O請求消息的長度進行處理,來動態(tài)的調整獲得的I/O請求消息的數目N。需要說明的是,只有當控制器檢測出所述緩存中請求發(fā)送隊列中沒有I/O請求消息時,才需要從所述M個I/O請求消息中獲得前N個I/O請求消息;然后當再次檢測到所述請求發(fā)送隊列中沒有I/O請求消息時,再從M個I/O請求消息中獲得前N個I/O請求消息,本次獲得I/O請求消息時,M個I/O請求消息可以等于上一次M個I/O請求消息與上一次獲得的N個I/O請求消息之差,即M-N個I/O請求消息,或者,M個I/O請求消息可以等于上一次M個I/O請求消息與上一次獲得的N個I/O請求消息之差,再加上兩次獲得的N個I/O請求消息之間的時間段內新收到的I/O請求消息;以此類推,可以循環(huán)地從M個I/O請求消息中獲得前N個I/O請求消息。步驟103,按照每個所述I/O請求消息的起始地址將所述N個I/O請求消息排序,以獲得K個I/O請求消息,其中,K為大于1的自然數。具體的,對于每次從M個I/O請求消息中獲得的前N個I/O請求消息,按照每個I/O請求消息的起始地址,對獲得的N個I/O請求消息進行排序,獲得按照起始地址排序的N個I/O請求消息;例如,起始地址排在前面的I/O請求消息的排序靠前,起始地址排在后面的I/O請求消息的排序靠后。在獲得按照起始地址排序的N個I/O請求消息后,依據每個I/O請求消息中包含的起始地址和長度,依次判斷相鄰的兩個I/O請求消息是否連續(xù),若相鄰的兩個I/O請求消息連續(xù),則將兩個所述I/O請求消息的長度的和作為所述兩個所述I/O請求消息中前一個所述I/O請求消息的長度,并刪除后一個所述I/O請求消息,以合并相鄰的兩個所述I/O請求消息,獲得按照起始地址排序的K個I/O請求消息;若相鄰的兩個I/O請求消息不連續(xù),則這兩個I/O請求消息不合并,繼續(xù)判斷其他相鄰的兩個I/O請求消息,直到所有I/O請求消息都判斷完畢,獲得按照起始地址排序的K個I/O請求消息,K為大于1的自然數,并且K小于或等于N;控制器將獲得的K個I/O請求消息寫入緩存的請求發(fā)送隊列。步驟104,從所述緩存中獲得所述K個I/O請求消息;將所述K個I/O請求消息依次發(fā)送給所述磁盤。具體的,從緩存的請求發(fā)送隊列中獲得所述K個I/O請求消息,然后從第一個I/O請求消息開始,將K個I/O請求消息依次發(fā)送給磁盤驅動設備,以便于磁盤驅動設備向磁盤發(fā)送I/O請求消息。其中,由于磁盤無法識別I/O請求消息,因此,需要先將I/O請求消息發(fā)送給磁盤驅動設備,以便于磁盤驅動設備依據收到的I/O請求消息向磁盤輸入數據或從磁盤讀取數據,即由磁盤驅動設備將I/O請求消息轉化為磁盤能夠識別的I/O請求消息,然后磁盤驅動設備將轉化后得到的I/O請求消息發(fā)送給磁盤,以實現向磁盤輸入數據或從所述磁盤讀取數據。需要說明的是,當請求發(fā)送隊列為空時,才從請求接收隊列中獲得I/O請求消息,并將獲得的I/O請求消息排序后寫入請求發(fā)送隊列;若請求發(fā)送隊列不為空,即請求發(fā)送隊列中還有未發(fā)送給磁盤驅動設備的I/O請求消息,則需要先將請求發(fā)送隊列中的I/O請求消息全都發(fā)送到磁盤驅動設備,直到請求發(fā)送隊列中全部的I/O請求消息都發(fā)送完畢,才寫入新的I/O請求消息。請參考圖3,圖3為本發(fā)明實施例所提供的I/O請求消息的處理方法的應用場景的示意圖;如圖所示,上述存儲設備可以為磁盤陣列系統(tǒng),現有技術中,是由廉價冗余磁盤陣列(RedundantArrayofIndependentDisks,RAID)模塊直接將主機發(fā)送的I/O請求消息下發(fā)給磁盤I/O處理模塊,本發(fā)明實施例中,控制器包括陣列前端、RAID模塊、排序算法模塊和磁盤I/O處理模塊,在RAID模塊和磁盤I/O處理模塊之間增加一個排序算法模塊,對于RAID模塊下發(fā)的I/O請求消息,該排序算法模塊利用本發(fā)明實施例所提供的I/O請求消息的處理方法,對I/O請求消息進行排序,然后將排序后得到的I/O請求消息下發(fā)給磁盤I/O處理模塊,再由磁盤I/O處理模塊發(fā)送給磁盤。本發(fā)明實施例進一步給出實現上述方法實施例中各步驟及方法的裝置實施例。請參考圖4,其為本發(fā)明實施例所提供的控制器的功能方塊圖,所述控制器應用于存儲設備,所述存儲設備還包括緩存和硬盤,所述存儲設備應用于存儲系統(tǒng),所述存儲系統(tǒng)還包括主機;如圖所示,該控制器包括:接收單元401,用于接收所述主機發(fā)送的M個輸入/輸出I/O請求消息,M為大于1的自然數,其中每個所述I/O請求消息中包含起始地址;寫入單元402,用于將所述M個I/O請求消息寫入所述緩存;獲取單元403,用于從所述緩存中獲得N個I/O請求消息,所述N個I/O請求消息是所述M個I/O請求消息中最早接收的I/O請求消息的集合,其中,N為大于1的自然數,并且N小于或等于M;處理單元404,用于按照每個所述I/O請求消息的起始地址將所述N個I/O請求消息排序,以獲得K個I/O請求消息,其中,K為大于1的自然數;讀取單元405,用于從所述緩存中獲得所述K個I/O請求消息;發(fā)送單元406,用于將所述K個I/O請求消息依次發(fā)送給所述磁盤。其中,所述每個所述I/O請求消息中還包括長度;所述處理單元404具體用于:按照每個所述I/O請求消息的起始地址,對所述N個I/O請求消息排序,以獲得按照起始地址排序的N個I/O請求消息;依據每個I/O請求消息中包含的起始地址和長度,判斷相鄰的兩個所述I/O請求消息是否連續(xù);若相鄰的兩個所述I/O請求消息連續(xù),將兩個所述I/O請求消息的長度的和作為所述兩個所述I/O請求消息中前一個所述I/O請求消息的長度,并刪除后一個所述I/O請求消息,以合并相鄰的兩個所述I/O請求消息,獲得按照起始地址排序的K個I/O請求消息,K小于或等于N。其中,所述處理單元404,還用于按照接收時間從遠到近的順序,對所述M個I/O請求消息進行排序。請參考圖5,其為本發(fā)明實施例所提供的一種控制器的結構示意圖。如圖所示,該控制器包括:接收器501,用于接收所述主機發(fā)送的M個輸入/輸出I/O請求消息,M為大于1的自然數,其中每個所述I/O請求消息中包含起始地址;存儲器502,用于存儲包括程序例程的信息;處理器503,與接收器501、存儲器502和發(fā)射器504分別耦合,用于控制所述程序例程的執(zhí)行,具體包括:將所述M個I/O請求消息寫入所述緩存;從所述緩存中獲得N個I/O請求消息,所述N個I/O請求消息是所述M個I/O請求消息中最早接收的I/O請求消息的集合,其中,N為大于1的自然數,并且N小于或等于M;按照每個所述I/O請求消息的起始地址將所述N個I/O請求消息排序,以獲得K個I/O請求消息,其中,K為大于1的自然數;從所述緩存中獲得所述K個I/O請求消息;發(fā)射器504,用于將所述K個I/O請求消息依次發(fā)送給所述磁盤。本發(fā)明實施例提供上述技術方案具有以下有益效果:1、對收到的I/O請求消息中最早收到的部分I/O請求消息按照起始地址進行排序,能夠在一定程度上解決I/O請求消息被餓死的問題,從而提升I/O請求消息在磁盤上的順序度,提高磁盤性能。2、如果在RAID組下創(chuàng)建多個邏輯單元號(LogicUnitNumber,LUN),對LUN上的I/O請求消息,若進行全局排序,I/O請求消息的優(yōu)先級就會不同,因為靠后的LUN上I/O請求消息的優(yōu)先級就會一直比較低,因此,本發(fā)明實施例中對局部的I/O請求消息按照起始地址排序,可以解決上述同一RAID組下不同LUN上I/O請求消息的優(yōu)先級問題。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發(fā)明保護的范圍之內。