linux的IO排程演算法和回寫機制

2021-09-21 17:04:55 字數 2777 閱讀 7322

塊裝置i/o子系統最核心的任務也就是提高塊裝置的整體效能,為此linux實現了四種

io排程演算法,演算法基本思想就是通過合併和排序io請求佇列中的請求大大降低所需的磁碟尋道時間,從而提供整體io效能。

2.6核心實現了四種

io排程演算法,分別為預期

(anticipatory)

演算法、最後期限

(deadline)

演算法、完全公平對列

(cfq)

演算法以及

noop

演算法(no operation)

。使用者可在核心引導時指定一種

i/o排程演算法,也可在執行時通過 

sysfs 

檔案系統

/sys/block/sda/queue/scheduler

改變塊裝置的

i/o排程演算法(cat可檢視當前使用

io排程演算法)。預設的io排程程式是cfq  io排程程式。

noop 演算法:

最簡單的 i/o排程演算法。該演算法僅適當合併使用者請求,並不排序請求:新的請求通常被插在排程佇列的開頭或末尾,下乙個要處理的請求總是佇列中的第乙個請求。這種演算法是為不需要尋道的塊裝置設計的,如ssd。

cfq 演算法:

"cfq(完全公平佇列)」演算法的主要目標是在觸發i/o請求的所有程序中確保磁碟i/o頻寬的公平分配。

演算法使用許多個排序佇列——預設為64——它們存放了不同程序發出的請求。

當演算法處理乙個請求時,核心呼叫乙個雜湊函式將當前程序的執行緒組識別符號(pid);然後,演算法將乙個新的請求插人該佇列的末尾。因此,同乙個程序發出的請求通常被插入相同的佇列中。

演算法本質上採用輪詢方式掃瞄i/o輸入佇列,選擇第乙個非空佇列,依次排程不同佇列中特定個數(公平)的請求,

然後將這些請求移動到排程佇列的末尾

deadline 演算法:

除了排程佇列外,「最後期限」演算法還使用了四個佇列。---

兩個排序佇列分別包含讀請求和寫請求(io請求是根據起始扇區號排序)

兩個最後期限佇列包含相同的讀和寫請求(根據它們的「最後期限」排序)

引入原因:為了避免請求餓死,由於電梯策略(曾經的排程演算法)優先處理與上乙個所處理的請求最近的請求,因而就會對某個請求忽略很長一段時間,這時就會發生這種情況。

最後期限的本質:就是乙個超時定時器,當請求被傳給電梯演算法時開始計時。預設情況下,讀請求的超時時間是500ms,寫請求的超時時間是5s——讀請求優先於寫請求,因為讀請求通常阻塞發出請求的程序。最後期限保證了排程程式照顧等待很長一段時間的那個請求,即使它位於排序佇列的末尾。

工作方式:當演算法要補充排程佇列時,首先確定下乙個請求的資料方向。如果同時要排程讀和寫兩個請求,演算法會選擇「讀」方向,除非該「寫」方向已經被放棄很多次了(為了避免寫請求餓死)。 接下來,演算法檢查與被選擇方向相關的最後期限佇列:如果佇列中的第乙個請求的最後期限已用完,那麼演算法將該請求移到排程佇列的末尾。同時,它也會移動該過期的請求後面的一組來自排序佇列的相同扇區號的請求。如果將要移動的請求在磁碟上物理相鄰,那麼這一批佇列的長度會很長,否則就很短。最後,如果沒有請求超時,演算法對來自於排序佇列的最後乙個請求連帶之後的一組相同扇區的請求進行排程。當指標到達排序佇列的末尾時,搜尋又從頭開始(「單方向演算法」)。

anticipatory 預期演算法

基本原理:是「最後期限」演算法的乙個演變,借用了「最後期限」演算法的基本機制:兩個最後期限佇列和兩個排序佇列;i/o排程程式在讀和寫請求之間互動掃瞄排序佇列,不過更傾向於讀請求。

新特性:有些情況下,演算法可能在排序佇列當前位置之後選擇乙個請求,從而強制磁頭從後搜尋。這種情況通常發生在這個請求之後的搜尋距離小於在排序佇列當前位置之後對該請求搜尋距離的一半時。

演算法統計系統中每個程序觸發的i/o操作的種類。當剛剛排程了由某個程序p發出的乙個讀請求之後,演算法馬上檢查排序佇列中的下乙個請求是否來自同乙個程序p。如果是,立即排程下乙個請求。否則,檢視關於該程序p的統計資訊:如果確定程序p可能很快發出另乙個讀請求,那麼就延遲一小段時間(預設大約為7ms)。因此,演算法**程序p發出的讀請求與剛被排程的請求在磁碟上可能是「近鄰」。

linux回寫機制

頁快取記憶體最開始是為記憶體管理而設計的,在2.6核心中,各種基於頁的資料管理都納入頁快取記憶體。因此塊裝置的io緩衝區也屬於頁快取記憶體。需要知道的是:所有檔案的io操作都是「讀寫快取」。

對於讀操作,只有當資料不在快取時才需要io操作。對於寫操作,一定需要io操作,但核心把資料寫到快取記憶體後write系統呼叫立馬返回,核心採用特定的寫程序統一回寫dirty的快取頁。即核心對讀寫是分別對待的:「同步讀,非同步寫」!

linux的寫回由特定程序按照特定演算法來進行回寫。在2.6.32之前的核心,pdflush後台回寫例程負責完成這個工作。啥時回寫呢? 

下面兩種情況下,髒頁會被寫會到磁碟:

1.在空閒記憶體低於乙個特定的閾值時,核心必須將髒頁寫回磁碟,以便釋放記憶體。

2.當髒頁在記憶體中駐留超過一定的閾值時,核心必須將超時的髒頁寫會磁碟,以確保髒頁不會無限期地駐留在記憶體中。

回寫開始後,pdflush會持續寫資料,直到滿足以下兩個條件:

1.已經有指定的最小數目的頁被寫回到磁碟。

2.空閒記憶體頁已經回公升,超過了閾值dirty_background_ration。

可以在/proc/sys/vm中設定回寫相關的引數,也可以通過sysctl系統呼叫來設定它們。下表給出了可以設定的量:

回寫缺陷:

1) 回寫不及時引發丟資料(sync|fsync);2) 回寫期間讀io效能極差,尤其是大資料量時。

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

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

Linux實現了4種I O排程演算法

linux實現了4種i o排程演算法,分別為 noop演算法 no operate 最後期限演算法 deadline 完全公平佇列演算法 cfq 和預期演算法 anticipatory 不對i o請求排序,但會合併請求,除此之外無其他任何優化。它用fifo佇列順序提交i o請求。noop演算法適用於...

如何更改Linux 的I O排程器

linux 的 i o 排程器是乙個以塊式 i o 訪問儲存卷的程序,有時也叫磁碟排程器。linux i o 排程器的工作機制是控制塊裝置的請求佇列 確定佇列中哪些 i o 的優先順序更高以及何時下發 i o 到塊裝置,以此來減少磁碟尋道時間,從而提高系統的吞吐量。目前 linux 上有如下幾種 i...