演算法和noop演算法 Linux的IO排程演算法

2021-10-15 00:23:24 字數 3258 閱讀 2617

一.概念

眾所周知,磁碟讀一直被認為是資料訪問過程中最慢的部分。即使隨著技術的發展出現了固態硬碟,依然無法和ram訪問資料的速度相媲美。而我們平時使用的磁碟都是通過旋轉碟片來使磁頭對資料進行讀寫的,因此在讀寫資料時,這個過程的影響尤其突出。

這是因為,傳統的旋轉式磁碟通過將碟片旋轉到特定的扇區來對資料進行讀寫,這個過程被稱作「尋道」,尋道時間很可能在「尋找資料」時耗費大量的時間。

i/o排程器就是可以極大的優化尋道時間的方法,通過將i/o請求合併到磁碟上類似的位置來實現優化。比如,通過i/o排程器,可以將相鄰扇區的i/o請求分至一組,從而大大縮短尋道時間,提高磁碟i/o的總體響應時間。

幾乎所有在系統上執行的應用程式都會有i/o請求,就算是最普通的瀏覽網頁也會向磁碟中寫入一些小檔案。想象一下,如果沒有i/o排程器,那麼每乙個i/o請求都會向核心傳送乙個中斷(interrupt),並在資料塊上移動磁頭進行讀寫,以便完成自己的i/o操作。那麼隨著時間的推移,磁碟驅動器效能與系統的其他元件之間的差異將迅速增長,進而由於i/o阻塞,導致系統的效能下降。可想而知,當核心必須處理中斷時,任何正在處理中的互動都會暫停,因此系統可能表現為無響應或緩慢。

那麼如何來對i/o請求進行排程,讓它們保持良好的互動性的,同時又確保良好的i/o效能?其實還是取決於工作量。比如,在某些情況下,可以在做其他事情的同時進行i/o處理,但是另外一種情況就需要盡快完成i/o,比如alter system checkpoint;為了平衡兩種情況下的i/o負載,或者為了保證某種情況下的優先順序,因此產生了i/o排程器。知道了i/o排程器的產生之後,我們來了解一下linux的i/o體系。

從上圖可見linux i/o排程器是linux i/o體系的乙個元件,它介於通用塊層和塊裝置驅動程式之間。

linux i/o排程器介於通用塊層和塊裝置驅動程式之間,所以它接收來自通用塊層的請求,試圖合併請求,並找到最合適的請求下發到塊裝置驅動程式中。之後塊裝置驅動程式會呼叫乙個函式來響應這個請求。

linux整體i/o體系可以分為七層,它們分別是:

1. vfs虛擬檔案系統:核心要跟多種檔案系統打交道,核心抽象了這vfs,專門用來適配各種檔案系統,並對外提供統一操作介面。

2. 磁碟快取:磁碟快取是一種將磁碟上的一些資料保留著ram中的軟體機制,這使得對這部分資料的訪問可以得到更快的響應。磁碟快取在linux中有三種型別:dentry cache,page cache,buffer cache。

4. 通用塊層:由於絕大多數情況的i/o操作是跟塊裝置打交道,所以linux在此提供了乙個類似vfs層的塊裝置操作抽象層。下層對接各種不同屬性的塊裝置,對上提供統一的block io請求標準。

5. i/o排程層:大多數的塊裝置都是磁碟裝置,所以有必要根據這類裝置的特點以及應用特點來設定一些不同的排程器。

6. 塊裝置驅動:塊裝置驅動對外提供高階的裝置操作介面。

7. 物理硬碟:這層就是具體的物理裝置。

那麼,在如此複雜的i/o體系以及千變萬化的i/o需求下,i/o排程器將扮演哪些角色呢?

linux 從2.4核心開始支援i/o排程器,到目前為止有5種型別:linux 2.4核心的 linus elevator、linux 2.6核心的 deadline、 anticipatory、 cfq、 noop,其中anticipatory從linux 2.6.33版本後被刪除了。目前主流的linux發行版本使用deadline、 cfq、 noop三種i/o排程器。下面依次簡單介紹:

在2.4 核心中它是第一種i/o排程器。它的主要作用是為每個裝置維護乙個查詢請求,當核心收到乙個新請求時,如果能合併就合併。如果不能合併,就會嘗試排序。如果既不能合併,也沒有合適的位置插入,就放到請求佇列的最後。

anticipatory的中文含義是"預料的,預想的",顧名思義有i/o發生時,如果又有程序請求i/o操作,則將產生乙個預設的6毫秒猜測時間,猜測下乙個程序請求i/o是要幹什麼的。這個i/o排程器對讀操作優化服務時間,在提供乙個i/o的時候進行短時間等待,使程序能夠提交到另外的i/o。anticipatory演算法從linux 2.6.33版本後被刪除了,因為使用cfq通過配置也能達到anticipatory的效果。

deadline翻譯成中文是截止時間排程器,是對linus elevator的一種改進,它避免有些請求太長時間不能被處理。另外可以區分對待讀操作和寫操作。deadline額外分別為讀i/o和寫i/o提供了fifo佇列。

cfq全稱completely fair scheduler ,中文名稱完全公平排程器,它是現在許多 linux 發行版的預設排程器,cfq是核心預設選擇的i/o排程器。它將由程序提交的同步請求放到多個程序佇列中,然後為每個佇列分配時間片以訪問磁碟。對於通用的伺服器是最好的選擇,cfq均勻地分布對i/o頻寬的訪問。cfq為每個程序和執行緒,單獨建立乙個佇列來管理該程序所產生的請求,以此來保證每個程序都能被很好的分配到i/o頻寬,i/o排程器每次執行乙個程序的4次請求。該演算法的特點是按照i/o請求的位址進行排序,而不是按照先來後到的順序來進行響應。簡單來說就是給所有同步程序分配時間片,然後才排隊訪問磁碟。

noop全稱no operation,中文名稱電梯式排程器,該演算法實現了最簡單的fifo佇列,所有i/o請求大致按照先來後到的順序進行操作。noop實現了乙個簡單的fifo佇列,它像電梯的工作方式一樣對i/o請求進行組織。它是基於先入先出(fifo)佇列概念的 linux 核心裡最簡單的i/o 排程器。此排程程式最適合於固態硬碟。

目前主流linux發行版本使用三種i/o排程器:deadline、cfq、noop,通常來說deadline適用於大多數環境,特別是寫入較多的檔案伺服器,從原理上看,deadline是一種以提高機械硬碟吞吐量為思考出發點的排程演算法,盡量保證在有i/o請求達到最終期限的時候進行排程,非常適合業務比較單一並且i/o壓力比較重的業務,比如web伺服器,資料庫應用等。cfq為所有程序分配等量的頻寬,適用於有大量程序的多使用者系統,cfq是一種比較通用的排程演算法,它是一種以程序為出發點考慮的排程演算法,保證大家盡量公平,為所有程序分配等量的頻寬,適合於桌面多工及多**應用。noop 對於快閃儲存器裝置和嵌入式系統是最好的選擇。對於固態硬碟來說使用noop是最好的,deadline次之,而cfq效率最低。

檢視linux系統的i/o排程器一般分成兩個部分,乙個是檢視linux系統整體使用的i/o排程器,另乙個是檢視某磁碟使用的i/o排程器。

linux i/o排程器是 linux 核心中的乙個組成部分,使用者可以通過根據不同的儲存器來設定 linux i/o 排程器從而達到優化系統效能。 一般來說 noop 排程器最適合於固態硬碟,deadline 排程器適用於寫入較多的檔案伺服器,比如web伺服器,資料庫應用等,而cfq 排程器適合於桌面多工及**應用。

Dijkstra演算法和A 演算法的比較

dijkstra演算法和 a 演算法都是 最短路徑問題的常用演算法,下面就對這兩種演算法的特點進行一下比較。1.dijkstra演算法計算源點到其他所有點的最短路徑長度,a 關注點到點的最短路徑 包括具體路徑 2.dijkstra演算法建立在較為抽象的圖論層面,a 演算法可以更輕鬆地用在諸如遊戲地圖...

演算法和演算法分析

一 演算法的基本概述 演算法是為了解決某類問題而規定的乙個有限長的操作序列。乙個演算法必須滿足以下五個重要特性 1 有窮性2 確定性3 可行性 4 有輸入5 有輸出 二 設計演算法的原則 1.正確性 2.可讀性 3 健壯性 4.高效率與低儲存量需求 三 演算法的時間複雜度簡介 語句頻度 語句重複執行...

演算法和演算法分析

演算法是為了解決某類問題而規定的乙個有限長的操作序列。五個特性 1.有窮性2.確定性3.可行性4.輸入5.輸出 1.正確性2.可讀性3.健壯性4.高效性 1.問題規模和語句頻度 不考慮計算機的軟硬體等環境因素,影響演算法時間代價的最主要因素是問題規模。問題規模是演算法求解問題輸入量的多少,是問題大小...