天天看點

IO排程政策之我見

IO排程政策對上面的塊裝置層和下面的磁盤驅動起作用,它實質上切斷了資料從應用程式到磁盤的路徑,進而也就解除了塊裝置和底層驅動程式之間的耦合,這樣的話就可以比對上下兩層之間的不和諧,試想如果磁盤速度很慢,那麼就可以在IO排程政策中加入可以避免過多尋道的操作,比如AS預測排程器,比如合并不同的請求,但是對于Flash-DOM之類的可以随機存儲的存儲器就沒有必要采用複雜的排程算法了。對于linux的實作,IO排程子產品對上層實際上就是一個入隊操作,根據系統管理者的配置或者自适應決斷結果将一系列IO請求配置設定到一系列隊列中,入隊的政策主要在于怎麼排隊,比如一共有哪些隊列,一個請求應該排入哪個隊列,之後的事情就不用管了,而出隊操作是IO排程子產品下層的接口,它主要負責從哪個隊列選擇下一個要服務的請求,它不管塊裝置層是怎麼将請求排入隊列的,然而到此為止了嗎?為了使得一些政策起作用,同時也為了使得“跨層操作”最小化,所謂的隊列中必須積攢了一定數量的IO請求的時候才能激發排程,也就是說塊裝置層不斷的将請求加入到政策化的隊列中,而驅動程式并不是馬上就對隊列中的請求進行服務,而是等到隊列中的請求積攢到一定數量的時候再開始服務過程。我們知道,計算機中,凡是跨層操作,開銷幾乎一定大于層内操作,這是因為分層是為了解耦合,是為了機制和政策分離,層與層之間抽象出了接口,而接口需要確定極大的相容性,是以為了照顧接口的相容性和其本身的安全性穩定性以及正交性,也就必然需要将問題一般化,是以就需要一個環境的切換,是以性能的犧牲也是必然的,我們常常聽說盡量少進行系統調用也就是這個道理,對應到IO排程層也是這個道理,是以我們千萬不要要求磁盤驅動程式不斷的取得請求不斷的服務,讓它休息一會也許會取得更好的性能。linux的實作中,用了一個十分形象的方式實作了這個,plug和unplug,這兩個詞彙從其本意上就能讓人了解linux的實作方式,plug是活塞,unplug是拔下活塞的意思,起初,在隊列的開頭賽上一個活塞(plug),待到隊列中的請求達到一定數量後者塞上活塞已經有一段時間以後,那麼拔下活塞(unplug,每個磁盤的請求隊列都有一個unplug回調函數),這麼解釋就什麼都清楚了。

IO排程有很多政策,起初就是linus電梯,這個算法很直覺同時也必然很簡單,2.6核心之後,添進來很多算法,我總結了一下基本就是兩點,其中cfq是按照網絡負載均衡算法改造的,而其他的算法都是對linus電梯的改進,deadline算法避免了饑餓,避免了磁盤中臨近的區域大量的請求被瞬間送出,進而造成早期送出的一個稍微遠一些的請求饑餓,因為deadline算法中每一個請求都有一個饑餓時間限制值,一個請求同時要插入到兩個隊列,其中一個隊列是linus電梯裡面的隊列,另一個是FIFO的按照到達時間排序的隊列,這個FIFO隊列也按照read和write進行了區分,read隊列的饑餓時間限制要更短一些,因為應用程式對于讀請求一般都是同步意義的,并且對于磁盤檔案來講如果順序讀的話,前面的讀沒有完成後面的讀更是無法進行,而寫操作就不是這樣的,應用程式寫檔案一般都是異步意義上的,更複雜的,如果很多程序都在寫一個檔案的一個區域,那麼隻要最後一個寫操作完成就可以了,前面的幾個都可以直接抛棄,再者,寫入緩存還是寫入磁盤,這都不是應用程式所關心的,是以寫操作的逾時時間要大于讀操作,deadline在linus電梯的基礎上避免了饑餓,那麼引入了另一個問題,試想如果一系列寫操作正在進行,這些寫操作都是經過linus電梯算法合并和排序過的,這時突然有個讀請求饑餓逾時到時間了,那麼不可避免的,磁頭要移動到讀請求的位置,這樣顯然降低了磁盤的吞吐量,然而這個突然的移動還不得不做,讀請求完成以後,按照deadline的邏輯,磁盤的磁頭又傳回剛才被讀請求打斷的寫請求的位置,然後...,這一次又一次的移動,不斷降低着磁盤的吞吐量,并且磁頭頻繁移動,損壞磁盤,AS算法出現了,在不得不服務逾時讀請求後,不是傳回寫請求,而是等待一段時間,因為排程政策認為,在等待的這一段時間内,可能會有另一個讀請求,将讀請求積攢在一起總比來來去去要好,AS排程政策的要點在于到底是否要等待以及等待多久,這些都是按照對程序的統計完成的,算法很複雜,然而思想卻很簡單,一個不得不做的讀請求完成以後,IO排程器在一段時間内等待“相鄰”讀請求的到來,随着預測得到的等待時間的增長,“相鄰”的概念範圍越來越寬,并且也能加進來一些寫請求,最終如果這個相鄰的概念已經擴充到了整個磁盤,那麼AS算法也就退化成了deadline算法。實質上,AS算法就是擺脫了deadline算法的弊端,它的弊端就是磁頭可能來回移動進而降低了吞吐量,而deadline算法是擺脫了linus電梯的弊端,它的弊端就是會引起饑餓,總而言之,吞吐量和磁頭尋道緊密相連,它和饑餓是一對冤家,需要權衡!

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274077

繼續閱讀