您好,登錄后才能下訂單哦!
這篇“Linux塊設(shè)備中的IO路徑及調(diào)度策略是什么”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Linux塊設(shè)備中的IO路徑及調(diào)度策略是什么”文章吧。
當(dāng)文件系統(tǒng)通過submit_bio提交IO之后,請求就進(jìn)入了通用塊層。通用塊層會對IO進(jìn)行一些預(yù)處理的動作,其目的是為了保證請求能夠更加合理的發(fā)送到底層的磁盤設(shè)備,盡量保證性能。這里面比較重要的就是IO調(diào)度模塊。大家可能都聽說過CFQ,除此之前還有DeadLine和Noop等,這些都是磁盤的調(diào)度算法。其中CFQ調(diào)度算法用的最多。
如果忽略塊設(shè)備的層疊結(jié)構(gòu)和各種映射,簡化的結(jié)構(gòu)大概有3層,如圖1所示。這里的3層并非都是軟件,還包含硬件。通用塊層就不用多說了,這里主要完成IO的合并和調(diào)度等操作。其下是驅(qū)動層,驅(qū)動層是硬件的驅(qū)動程序,用于將IO請求轉(zhuǎn)換為對硬件寄存器的操作(注:不同的塊設(shè)備又有差異,必然iSCSI設(shè)備是不會有寄存器操作的)。物理設(shè)備不同該驅(qū)動層的程序就不同,比如對于SAS直連的磁盤,該驅(qū)動層的程序就是SAS驅(qū)動,而如果是FC-HBA卡連接的FC-SAN,那么這個驅(qū)動層就是FC驅(qū)動(比如Qlogic的驅(qū)動)。
圖1 塊設(shè)備分層
最下面一層是設(shè)備層,設(shè)備層通常是一個硬件設(shè)備。這里的硬件種類繁多,比如SAS卡、SATA卡、FC-HBA卡或者iSCSI-HBA卡等等。但有的時候又可能并不是硬件設(shè)備,比如對于iSCSI來說,該層可能是通過軟件模擬的一個設(shè)備層,而其請求則是通過網(wǎng)卡發(fā)送到目標(biāo)器端。
主要數(shù)據(jù)結(jié)構(gòu)及流程
絕大多數(shù)程序都是由數(shù)據(jù)結(jié)構(gòu)和算法2部分內(nèi)容組成的,數(shù)據(jù)結(jié)構(gòu)相當(dāng)于程序的骨架,而算法則是程序的筋和肉。通過算法將數(shù)據(jù)結(jié)構(gòu)關(guān)聯(lián)起來,從而形成一個完整的整體。人類認(rèn)識問題的規(guī)律是從具體到抽象,從簡單到復(fù)雜,因此我們先從數(shù)據(jù)結(jié)構(gòu)開始。理解了數(shù)據(jù)關(guān)鍵的數(shù)據(jù)結(jié)構(gòu),那我們就能更加容易的理解塊設(shè)備IO的整個邏輯。
在塊設(shè)備IO中最為關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)是request_queue,也就是請求隊列。該數(shù)據(jù)結(jié)構(gòu)的簡圖如圖2所示,這個數(shù)據(jù)結(jié)構(gòu)本身非常復(fù)雜,我們這里進(jìn)行了簡化,只保留了部分關(guān)鍵的成員。如圖彩色部分是2個函數(shù)指針,分別用于接收請求和處理請求。
圖2 請求隊列數(shù)據(jù)結(jié)構(gòu)
為了便于理解,我們這里舉一個例子。以NBD塊設(shè)備為例,在塊設(shè)備初始化的時候make_request_fn被初始化為blk_queue_bio,request_fn被初始化為do_nbd_request。對于SCSI塊設(shè)備而言,request_fn會被初始化為scsi_request_fn。
有了上面數(shù)據(jù)結(jié)構(gòu)的知識及關(guān)鍵成員初始化的結(jié)果,接下來我們就可以分析一下塊設(shè)備的整個流程的細(xì)節(jié)。塊設(shè)備請求的入口是submit_bio,經(jīng)過簡單的檢查后調(diào)用
由上述代碼可以看出IO處理的入口函數(shù)其實是函數(shù)指針make_request_fn,而我們知道該指針實際上是函數(shù)blk_queue_bio。因此塊設(shè)備的請求會由blk_queue_bio函數(shù)進(jìn)行處理。
磁盤調(diào)度策略
Linux內(nèi)核在設(shè)計磁盤的調(diào)度策略時提供了極大的靈活性。磁盤的調(diào)度策略以插件的注冊到內(nèi)核當(dāng)中,也就是用戶可以自由的選擇磁盤的調(diào)度策略。
調(diào)度算法的思想其實非常簡單,主要是通過對IO的排序、合并和批量處理來優(yōu)化磁盤尋道和請求的處理時間。這里值得說明的目前的調(diào)度算法其實更多的是針對機(jī)械磁盤,因為機(jī)械磁盤磁頭定位耗時占整個IO處理時間的很大比例。當(dāng)然對于SSD磁盤,調(diào)度算法也有一定的幫助,這就需要針對IO的特性具體來看了。
圖3 調(diào)度策略結(jié)構(gòu)體
磁盤調(diào)度策略的結(jié)構(gòu)體定義如圖3所示,各個變量的含義也是比較明確,本文不再贅述。本文主要看一下 其中elevator_ops類型的變量ops,這個變量是調(diào)度策略具體的功能實現(xiàn),任何調(diào)度算法都要實現(xiàn)其中某些函數(shù)。
調(diào)度策略的實現(xiàn)就是通過這些回調(diào)函數(shù)完成的。為了理解調(diào)度策略的函數(shù)集具體做哪些事情,本文整理了一個表格,我們先從整體上看一下每個函數(shù)具體做了哪些事情。對于調(diào)度策略來說,這里的函數(shù)并非每個都要實現(xiàn),下表中只有帶*的才是必須要實現(xiàn)的函數(shù)。
簡而言之,上述回調(diào)函數(shù)的功能就是判斷請求是否可以被合并、執(zhí)行合并和請求下發(fā)等等操作。上述回調(diào)函數(shù)比較多,而且使用場景也比較復(fù)雜,具體使用分散在調(diào)度器的很多流程中。因此,我們很難一下子介紹清楚所有的場景。為了更加直觀的理解上述回調(diào)函數(shù)的作用,我們以Deadline調(diào)度策略為例進(jìn)行簡單的介紹。
如圖4是Deadline初始化的回調(diào)函數(shù),從圖中可以看出這里并沒有初始化所有的回調(diào)函數(shù),而只初始化了16個回調(diào)函數(shù)中的9個。
圖4 Deadline回調(diào)函數(shù)
我們具體分析一下函數(shù)的調(diào)用場景,前文我們介紹到elevator_merge_fn函數(shù)用于查詢可以與bio合并的請求。如圖5所示為整個調(diào)用棧,入口為blk_queue_bio,這個函數(shù)我們之前介紹過,它就是調(diào)度程序的入口。該函數(shù)調(diào)用elv_merge用于查找是否有可以合并的請求,并返回。而elv_merge函數(shù)調(diào)用的正式Deadline調(diào)度器提供的回調(diào)函數(shù)。完成判斷后,該函數(shù)會根據(jù)實際情況返回請求(或者沒有找到,不返回)和可合并的方向(例如向前合并,向后合并等),后續(xù)流程就是進(jìn)行具體的合并操作了。
圖5 函數(shù)調(diào)用棧
以上就是關(guān)于“Linux塊設(shè)備中的IO路徑及調(diào)度策略是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。