Linux下io磁碟排程策略

2021-10-12 03:12:58 字數 3163 閱讀 2652

i/o 排程演算法再各個程序競爭磁碟i/o的時候擔當了裁判的角色。他要求請求的次序和時機做最優化的處理,以求得盡可能最好的整體i/o效能。

在linux下面列出4種排程演算法

cfq (completely fair queuing 完全公平的排隊)(elevator=cfq):

這是預設演算法,對於通用伺服器來說通常是最好的選擇。它試圖均勻地分布對i/o頻寬的訪問。在多**應用, 總能保證audio、video及時從磁碟讀取資料。但對於其他各類應用表現也很好。每個程序乙個queue,每個queue按照上述規則進行merge和sort。程序之間round robin排程,每次執行乙個程序的4個請求。可以調 queued 和 quantum 來優化

deadline (elevator=deadline):

這個演算法試圖把每次請求的延遲降至最低。該演算法重排了請求的順序來提高效能。可以調佇列的過期的讀寫過程,如 read_expire 和 write_expire 二個引數來控制多久內一定要讀到資料,超時就放棄排序。比較合適小檔案。還可以使用開啟 front_merges 來進行合併鄰近檔案。

noop (elevator=noop):

i/o請求被分配到佇列,排程由硬體進行,只有當cpu時鐘頻率比較有限時進行。

noop對於i/o不那麼操心,對所有的i/o請求都用fifo佇列形式處理,預設認為 i/o不會存在效能問題。這也使得cpu也不用那麼操心。當然對於複雜一點的應用型別使用這個排程器,使用者自己就會非常操心。

noop排程演算法指的是當請求被儲存到佇列並交由i/o子系統處理時由磁碟硬體對其進行優化。該演算法一般只對一些特定的硬體(例如ram disk和tcq disk等)。現代磁碟控制器都具備通過tagged command queuing進行優化的功能。tagged command queuing(tcq)可以通過由磁碟控制器對i/o請求進行重新排序來減少磁頭的動作。通常需要進行重組的i/o請求都會帶有乙個識別符號,這樣控制器在接收到這些i/o請求的時候會按照規則進行處理。

有些應用程式需要對佇列長度進行限制,而現代的裝置驅動都具備用於控制佇列長度的tco功能,並且該功能可以作為核心引數在系統啟動的時候新增。例如要控制scsi驅動器lun2的佇列長度為64個請求,可以修改/etc/grub.conf並增加下面的核心引數:aic7***=tag_info:}

anticipatory (elevator=as):

對讀操作優化服務時間,在提供乙個i/o的時候進行短時間等待,使程序能夠提交到另外的i/o。anticipatory scheduler(as) 曾經一度是linux 2.6 kernel的i/o scheduler。anticipatory的中文含義是「預料的,預想的」,這個詞的確揭示了這個演算法的特點,簡單的說有個i/o發生的時候,如果又有程序請求i/o操作,則將產生乙個預設的6毫秒猜測時間,猜測下乙個程序請求i/o是要幹什麼的。這對於隨機讀取會造成比較大的延時,對資料庫應用很糟糕,而對於web server等則會表現的不錯。這個演算法也可以簡單理解為面向低速磁碟的,因為那個「猜測」實際上的目的是為了減少磁頭移動時間。因此這種演算法更加適合順序讀寫的應用程式。這個可以用來調整的核心引數有 antic_expire ,read_expire 和 write_expire.

磁碟佇列長度

/sys/block/sda/queue/nr_requests 預設只有 128 個佇列,可以提高到 512 個。會更加占用記憶體,但能更加多的合併讀寫操作,速度變慢,但能讀寫更加多的量

等待時間

/sys/block/sda/queue/iosched/antic_expire 讀取附近產生的新請時等待多長時間

對讀優化的引數

/sys/block/sda/queue/read_ahead_kb

這個引數對順序讀非常有用,意思是,一次提前讀多少內容,無論實際需要多少。預設一次讀 128kb 遠小於要讀的,設定大些對讀大檔案非常有用,可以有效的減少讀 seek 的次數,這個引數可以使用 blockdev –setra 來設定,setra 設定的是多少個扇區,所以實際的位元組是除以2,比如設定 512 ,實際是讀 256 個位元組。

幾個非常有效的 io 排程調節的核心引數

/proc/sys/vm/dirty_ratio

這個引數控制檔案系統的檔案系統寫緩衝區的大小,單位是百分比,表示系統記憶體的百分比,表示當寫緩衝使用到系統記憶體多少的時候,開始向磁碟寫出數 據。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上預設是 10。下面是增大的方法: echo 』40′> /proc/sys/vm/dirty_ratio

/proc/sys/vm/dirty_background_ratio

這個引數控制檔案系統的pdflush程序,在何時重新整理磁碟。單位是百分比,表示系統記憶體的百分比,意思是當寫緩衝使用到系統記憶體多少的時候, pdflush開始向磁碟寫出資料。增大之會使用更多系統記憶體用於磁碟寫緩衝,也可以極大提高系統的寫效能。但是,當你需要持續、恆定的寫入場合時,應該降低其數值,一般啟動上預設是 5。下面是增大的方法: echo 』20′ > /proc/sys/vm/dirty_background_ratio

/proc/sys/vm/dirty_writeback_centisecs

這個引數控制核心的髒資料重新整理程序pdflush的執行間隔。單位是 1/100 秒。預設數值是500,也就是 5 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操作。設定方法如下: echo 』200′ > /proc/sys/vm/dirty_writeback_centisecs 如果你的系統是短期地尖峰式的寫操作,並且寫入資料不大(幾十m/次)且記憶體有比較多富裕,那麼應該增大此數值: echo 』1000′ > /proc/sys/vm/dirty_writeback_centisecs

/proc/sys/vm/dirty_expire_centisecs

這個引數宣告linux核心寫緩衝區裡面的資料多「舊」了之後,pdflush程序就開始考慮寫到磁碟中去。單位是 1/100秒。預設是 30000,也就是 30 秒的資料就算舊了,將會重新整理磁碟。對於特別過載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致io提高太快。建議設定為 1500,也就是15秒算舊。 echo 』1500′ > /proc/sys/vm/dirty_expire_centisecs 當然,如果你的系統記憶體比較大,並且寫入模式是間歇式的,並且每次寫入的資料不大(比如幾十m),那麼這個值還是大些的好。

原文:

磁碟I O排程

io排程器的總體目標是希望讓磁頭能夠總是往乙個方向移動 移動到底了再往反方向走 這恰恰就是現實生活中的電梯模型,所以 io排程器也被叫做電梯 elevator 而相應的演算法也就被叫做電梯演算法.而 linux中io 排程的電梯演算法有好幾種 乙個叫做 as anticipatory 乙個叫做 cf...

I O管理和磁碟排程

執行i o的三種技術 1 可程式設計i o 處理器代表乙個程序給i o模組傳送乙個i o命令 該程序進入忙等待,直到操作完成才可以繼續執行。2 中斷驅動i o 處理器代表程序向i o模組發出乙個i o命令。有兩種可能性 如果來自程序的i o指令是非阻塞的,那麼處理器繼續執行發出i o命令的程序的後續...

磁碟排程演算法,記憶體排程,記憶體分配策略

磁碟是可供多個程序共享的裝置,當有多個程序都要求訪問磁碟時,應採用一種最佳排程演算法,以使各程序對磁碟的平均訪問時間最小。由於在訪問磁碟的時間中,主要是尋道時間。因此 磁碟排程演算法的目標是使磁碟的平均尋道時間最少 先來先服務 first come first served 根據程序請求訪問磁碟的先...