用于處理輸入輸出操作請(qǐng)求的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明的實(shí)施例一般地涉及存儲(chǔ)領(lǐng)域,并且具體地涉及一種用在包括雙處理器的 存儲(chǔ)設(shè)備中對(duì)輸入輸出操作請(qǐng)求進(jìn)行處理的方法和裝置。
【背景技術(shù)】
[0002] 在存儲(chǔ)領(lǐng)域中,包括雙存儲(chǔ)處理器(SP)的雙活(active-active)架構(gòu)是指能夠在 兩個(gè)SP上對(duì)相同的RAID(獨(dú)立盤冗余陣列)組、或?qū)ο嗤臈l帶(stripe)/邏輯塊地址 (LBA)區(qū)域的并行輸入輸出(10)操作請(qǐng)求進(jìn)行同時(shí)處理的架構(gòu)。這種雙活架構(gòu)使得具有雙 SP的存儲(chǔ)設(shè)備的性能得到了顯著的提高。例如,當(dāng)一個(gè)SP宕機(jī)時(shí),另一個(gè)仍在運(yùn)行的SP可 以立即接管所有的邏輯單元(LUN),從而使得在故障過程中用戶數(shù)據(jù)能夠保持安全、可靠而 且仍然可以被訪問。
[0003] 然而,雙SP雙活架構(gòu)的這種操作方式要求雙SP存儲(chǔ)設(shè)備的存儲(chǔ)陣列必須在共享 的RAID組或RAID條帶上保持同步,以避免并行的10操作攪亂了用戶數(shù)據(jù)。
[0004] 在當(dāng)前的雙SP雙活架構(gòu)中,為了能夠嚴(yán)格控制來自兩個(gè)SP的讀/寫操作請(qǐng)求,提 出了條帶鎖(stripe lock, SL)的概念。所謂的條帶鎖實(shí)質(zhì)上是一種用于一個(gè)RAID條帶的 讀/寫鎖。這種讀/寫鎖的基本目的在于能夠同時(shí)允許對(duì)RAID條帶的同一個(gè)存儲(chǔ)區(qū)域的多 個(gè)讀操作,但是在一個(gè)時(shí)間僅允許對(duì)同一個(gè)存儲(chǔ)區(qū)域的一個(gè)寫操作。每一個(gè)10操作在被處 理之前都必須首先在從本地SP(即,接收到該10操作請(qǐng)求的SP)獲得本地的條帶鎖(即, 獲得本地SP對(duì)執(zhí)行該10操作的許可)、然后從對(duì)端SP獲得對(duì)端的條帶鎖(即,獲得對(duì)端 SP對(duì)執(zhí)行該10操作的許可)。當(dāng)從本地SP和對(duì)端SP二者獲得了條帶鎖后,所請(qǐng)求的10 操作才可以被執(zhí)行。在10操作結(jié)束后,所獲得的對(duì)應(yīng)條帶鎖都將被釋放。在以下描述中所 使用的"獲得條帶鎖"和"獲得對(duì)10操作的許可"以及類似表述具有相同或相似的含義。
[0005] 圖1示出了現(xiàn)有技術(shù)中所使用的條帶鎖的概念圖。在圖1中示出了四個(gè)磁盤陣列, 該四個(gè)磁盤陣列構(gòu)成一個(gè)RAID條帶并且可以被并行的讀取或者寫入。如圖1所示,當(dāng)處理 器SPA接收到針對(duì)所示出的條帶的某個(gè)存儲(chǔ)地址范圍的10操作請(qǐng)求后,將首先從本地SPA 獲得用于該10操作的條帶鎖,即首先從SPA獲得執(zhí)行該10操作的許可,然后從對(duì)端SPA獲 得用于該10操作的條帶鎖,即從對(duì)端SPA獲得執(zhí)行該10操作的許可,隨后方可執(zhí)行所請(qǐng)求 的對(duì)該條帶的10操作。
[0006] 為了保證對(duì)條帶鎖的正確使用,需要遵循三條原則:對(duì)鎖的獲取請(qǐng)求需要遵循10 操作請(qǐng)求的接收順序;對(duì)于寫操作,必須使用一個(gè)獨(dú)占的鎖來保護(hù)將被寫入的存儲(chǔ)地址區(qū) 域不被其他并行的讀操作或?qū)懖僮髡加?;并且?duì)于一個(gè)讀操作,可以使用一個(gè)共享鎖以使 得其他讀操作可以同時(shí)訪問同一個(gè)存儲(chǔ)地址區(qū)域,但是對(duì)該存儲(chǔ)地址區(qū)域的寫操作不能進(jìn) 行。
[0007] 現(xiàn)有的條帶鎖機(jī)制包括兩種重要的數(shù)據(jù)結(jié)構(gòu),一種被稱為條帶鎖鏈表并且另一種 被稱為條帶鎖緩存表(其具體結(jié)構(gòu)和操作將在下文中詳細(xì)描述)。在具有雙SP的存儲(chǔ)設(shè)備 中,在每一個(gè)SP處針對(duì)每一個(gè)存儲(chǔ)陣列組(例如RAID組)都維護(hù)一個(gè)條帶鎖鏈表和一個(gè) 條帶鎖緩存表。該條帶鎖鏈表記錄了關(guān)于本地SP(例如圖1中的SPA)已經(jīng)許可的、對(duì)于存 儲(chǔ)陣列組所包括的特定存儲(chǔ)地址區(qū)域的10操作請(qǐng)求的信息,而條帶鎖緩存表記錄了對(duì)端 SP(例如圖1中的SPB)對(duì)于針對(duì)存儲(chǔ)陣列組所包括的各存儲(chǔ)地址區(qū)域的10操作的當(dāng)前允 許狀態(tài)。
[0008] 如前所述,當(dāng)一個(gè)SP接收到與其關(guān)聯(lián)的RAID組的某個(gè)存儲(chǔ)地址范圍的10操作請(qǐng) 求時(shí),該SP首先查詢針對(duì)該RAID組存儲(chǔ)的本地條帶鎖鏈表以確保對(duì)該存儲(chǔ)地址范圍的10 操作在本地是被允許的。如果該SP不允許對(duì)該存儲(chǔ)地址范圍的10操作,則將該10操作請(qǐng) 求置于本地存儲(chǔ)的條帶鎖鏈表中的等待鏈中;否則,該SP將繼而查詢針對(duì)該RAID組存儲(chǔ)的 條帶鎖緩存表以判斷對(duì)端SP是否允許所請(qǐng)求的對(duì)該存儲(chǔ)地址范圍的10操作。
[0009] 條帶鎖緩存表通常包括多個(gè)緩存格(cache slot),每一個(gè)緩存格對(duì)應(yīng)地表示對(duì)端 SP對(duì)于特定存儲(chǔ)地址范圍的10操作的當(dāng)前允許狀態(tài),其決定了條帶鎖的粒度。如果本地 SP對(duì)條帶鎖緩存表的查詢結(jié)果顯示不允許對(duì)特定存儲(chǔ)地址范圍的10操作,這也就意味著 對(duì)端SP保持了對(duì)該特定存儲(chǔ)地址范圍的條帶鎖,那么本地SP將需要通過CMI信道發(fā)送一 個(gè)CMI消息到對(duì)端SP以請(qǐng)求對(duì)該10操作的許可。CMI信道是嵌入在存儲(chǔ)陣列基板中的并 且建立在PCIe鏈路上的跨SP的信道。該CMI消息需要通過CMI消息收發(fā)棧中的對(duì)應(yīng)協(xié)議 來處理。
[0010] 通常,通過CMI信道傳遞CMI消息的速度遠(yuǎn)遠(yuǎn)低于本地處理器的存儲(chǔ)器內(nèi)操作的 速度、諸如查詢本地存儲(chǔ)的條帶鎖緩存表的速度。因此CMI消息的傳遞成為目前利用條帶 鎖技術(shù)的存儲(chǔ)設(shè)備的瓶頸,而發(fā)送CMI消息的頻率主要由條帶鎖緩存格的粒度決定,諸如 10模式、10負(fù)載等其他因素對(duì)其的影響相比而言較小。
[0011] 目前常用的條帶鎖緩存表通常包括512個(gè)緩存格。這種較粗的粒度一方面降低 了存儲(chǔ)器用于條帶鎖緩存表的存儲(chǔ)預(yù)算,但另一方面卻增加了存儲(chǔ)設(shè)備內(nèi)條帶鎖沖突的幾 率。這里所使用的"條帶鎖沖突"指的是本地SP和對(duì)端SP希望同時(shí)對(duì)同一存儲(chǔ)地址范圍 進(jìn)行10操作的沖突,該10操作至少包括一個(gè)寫操作。如果一個(gè)條帶鎖緩存格對(duì)應(yīng)的存儲(chǔ) 地址范圍越大,那么對(duì)該存儲(chǔ)地址范圍的10操作沖突的幾率就會(huì)越大。這就意味著需要發(fā) 送更多的CMI消息,從而降低了存儲(chǔ)設(shè)備的性能。如果一個(gè)條帶鎖緩存格對(duì)應(yīng)的存儲(chǔ)地址 范圍較小,那么一方面對(duì)該存儲(chǔ)地址范圍的10操作沖突的幾率可能降低,但另一方面卻需 要更多的存儲(chǔ)器空間來保持這些條帶鎖緩存格。
【發(fā)明內(nèi)容】
[0012] 針對(duì)上述問題,本發(fā)明的各示例性實(shí)施例提供了一種能夠在CMI消息的傳輸頻率 以及存儲(chǔ)器占用量之間權(quán)衡的解決方案。
[0013] 根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于處理存儲(chǔ)設(shè)備中的輸入輸出操作請(qǐng)求 的方法,該存儲(chǔ)設(shè)備包括第一處理器和第二處理器并且包括多個(gè)存儲(chǔ)陣列組,該方法包括 在第一處理器處,針對(duì)多個(gè)存儲(chǔ)陣列組中的每一個(gè)存儲(chǔ)陣列組維護(hù)第一鏈表以及第一緩存 表,其中該第一鏈表至少保持關(guān)于第一處理器所允許的、對(duì)相應(yīng)存儲(chǔ)陣列組中的特定存儲(chǔ) 地址范圍的輸入輸出操作請(qǐng)求的信息,并且該第一緩存表包括第一多個(gè)緩存格,其中的每 個(gè)緩存格保持第二處理器對(duì)所述相應(yīng)存儲(chǔ)陣列組中的特定存儲(chǔ)地址范圍的輸入輸出操作 的允許狀態(tài)。該方法還包括針對(duì)第一多個(gè)緩存格中的一個(gè)或多個(gè)下述緩存格中的一個(gè)或多 個(gè)分別生成第二緩存表:針對(duì)該緩存格所對(duì)應(yīng)的特定存儲(chǔ)地址范圍的輸入輸出操作請(qǐng)求的 次數(shù)超過第一預(yù)定閾值,其中所述第二緩存表包括第二多個(gè)緩存格并且該第二多個(gè)緩存格 中的每一個(gè)緩存格的大小小于第一多個(gè)緩存格中的每一個(gè)緩存格的大小。該方法進(jìn)一步包 括至少基于第一鏈表以及第一緩存表和/或第二緩存表對(duì)第一處理器接收到的輸入輸出 操作請(qǐng)求進(jìn)行處理。
[0014] 在一些實(shí)施例中,該方法還可以包括,如果第二緩存表中的第二多個(gè)緩存格所保 持的允許狀態(tài)都是相同狀態(tài),則可以將第一多個(gè)緩存格中的、針對(duì)其生成該第二緩存表的 緩存格設(shè)置為該相同狀態(tài)并刪除該第二緩存表。
[0015] 在另一些實(shí)施中,該方法還可以包括,首先判斷針對(duì)第二緩存表所對(duì)應(yīng)的存儲(chǔ)地 址范圍的輸入輸出操作請(qǐng)求的次數(shù)是否低于第二預(yù)定閾值,如果該次數(shù)低于第二預(yù)定閾 值,則將該第二緩存表收回。
[0016] 根據(jù)本發(fā)明的另一方面,提供了一種用于處理存儲(chǔ)設(shè)備中的輸入輸出操作請(qǐng)求的 裝置,該存儲(chǔ)設(shè)備包括第一處理器和第二處理器并且包括多個(gè)存儲(chǔ)陣列組,該裝置包括表 維護(hù)單元,其被配置為在第一處理器處,針對(duì)多個(gè)存儲(chǔ)陣列組中的每一個(gè)存儲(chǔ)陣列組維護(hù) 第一鏈表以及第一緩存表,其中第一鏈表至少保持關(guān)于第一處理器所允許的、對(duì)相應(yīng)存儲(chǔ) 陣列組中的特定存儲(chǔ)地址范圍的輸入輸出操作請(qǐng)求的信息,并且第一緩存表包括第一多個(gè) 緩存格,其中的每個(gè)緩存格保持第二處理器對(duì)所述相應(yīng)存儲(chǔ)陣列組中的特定存儲(chǔ)地址范圍 的輸入輸出操作的允許狀態(tài)。該裝置還包括子表生成單元,其被配置為針對(duì)第一多個(gè)緩存 格中的一個(gè)或多個(gè)下述緩存格中的一個(gè)或多個(gè)分別生成第二緩存表:針對(duì)該緩存格所對(duì)應(yīng) 的特定存儲(chǔ)地址范圍的輸入輸出操作請(qǐng)求的次數(shù)超過第一預(yù)定閾值,其中第二緩存表包括 第二多個(gè)緩存格并且該第二多個(gè)緩存格中的每一個(gè)緩存格的大小小于第一多個(gè)緩存格中 的每一個(gè)緩存格的大小。該裝置進(jìn)一步包括操作請(qǐng)求處理單元,其被配置為至少基于第一 鏈表以及第一緩存表和/或第二緩存表對(duì)第一處理器接收到的輸入輸出操作請(qǐng)求進(jìn)行處 理。
[0017] 在一些實(shí)施例中,該裝置還可以包括子表收回單元,其被配置為如果第二緩存表 中的第二多個(gè)緩存格所保持的允許狀態(tài)都是相同狀態(tài),則可以將第一多個(gè)緩存格中的、針 對(duì)其生成該第二緩存表的緩存格設(shè)置為該相同狀態(tài)并刪除該第二緩存表。
[0018] 在另一些實(shí)施中,該裝置還可以包括子表收回單元,其被配置為首先判斷針對(duì)第 二緩存表所對(duì)應(yīng)的存儲(chǔ)地址范圍的輸入輸出操作請(qǐng)求的次數(shù)是否低于第二預(yù)定閾值,如果 該次數(shù)低于第二預(yù)定閾值,則將該第二緩存表收回。
【附圖說明】
[0019] 結(jié)合附圖并參考以下詳細(xì)說明,本發(fā)明各實(shí)施方式的特征、優(yōu)點(diǎn)及其他方面將變 得更加明顯,在此以示例性而非限制性的方式示出了本