linux之 修改磁碟排程演算法
IO排程器的總體目標是希望讓磁頭能夠總是往一個方向移動,移動到底了再往反方向走,這恰恰就是現實生活中的電梯模型,所以IO排程器也被叫做電梯. (elevator)而相應的演算法也就被叫做電梯演算法.而Linux中IO排程的電梯演算法有好幾種,一個叫做as(Anticipatory),一個叫做 cfq(Complete Fairness Queueing),一個叫做deadline,還有一個叫做noop(No Operation).具體使用哪種演算法我們可以在啟動的時候透過核心引數elevator來指定.
一)I/O排程的4種演算法
1)CFQ(完全公平排隊I/O排程程式)
特點:
在最新的核心版本和發行版中,都選擇CFQ做為預設的I/O排程器,對於通用的伺服器也是最好的選擇.
CFQ試圖均勻地分佈對I/O頻寬的訪問,避免程式被餓死並實現較低的延遲,是deadline和as排程器的折中.
CFQ對於多媒體應用(video,audio)和桌面系統是最好的選擇.
CFQ賦予I/O請求一個優先順序,而I/O優先順序請求獨立於程式優先順序,高優先順序的程式的讀寫不能自動地繼承高的I/O優先順序.
工作原理:
CFQ為每個程式/執行緒,單獨建立一個佇列來管理該程式所產生的請求,也就是說每個程式一個佇列,各佇列之間的排程使用時間片來排程,
以此來保證每個程式都能被很好的分配到I/O頻寬.I/O排程器每次執行一個程式的4次請求.
2)NOOP(電梯式排程程式)
特點:
在Linux2.4或更早的版本的排程程式,那時只有這一種I/O排程演算法.
NOOP實現了一個簡單的FIFO佇列,它像電梯的工作主法一樣對I/O請求進行組織,當有一個新的請求到來時,它將請求合併到最近的請求之後,以此來保證請求同一介質.
NOOP傾向餓死讀而利於寫.
NOOP對於快閃記憶體裝置,RAM,嵌入式系統是最好的選擇.
電梯演算法餓死讀請求的解釋:
因為寫請求比讀請求更容易.
寫請求透過檔案系統cache,不需要等一次寫完成,就可以開始下一次寫操作,寫請求透過合併,堆積到I/O佇列中.
讀請求需要等到它前面所有的讀操作完成,才能進行下一次讀操作.在讀操作之間有幾毫秒時間,而寫請求在這之間就到來,餓死了後面的讀請求.
3)Deadline(截止時間排程程式)
特點:
透過時間以及硬碟區域進行分類,這個分類和合並要求類似於noop的排程程式.
Deadline確保了在一個截止時間內服務請求,這個截止時間是可調整的,而預設讀期限短於寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.
Deadline對資料庫環境(ORACLE RAC,MYSQL等)是最好的選擇.
4)AS(預料I/O排程程式)
特點:
本質上與Deadline一樣,但在最後一次讀操作後,要等待6ms,才能繼續進行對其它I/O請求進行排程.
可以從應用程式中預訂一個新的讀請求,改進讀操作的執行,但以一些寫操作為代價.
它會在每個6ms中插入新的I/O操作,而會將一些小寫入流合併成一個大寫入流,用寫入延時換取最大的寫入吞吐量.
AS適合於寫入較多的環境,比如檔案伺服器
AS對資料庫環境表現很差.
檢視當前系統支援的IO排程演算法
dmesg | grep -i scheduler
[root@localhost ~]# dmesg | grep -i scheduler
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
檢視當前系統的I/O排程方法:
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
臨地更改I/O排程方法:
例如:想更改到noop電梯排程演算法:
echo noop > /sys/block/sda/queue/scheduler
想永久的更改I/O排程方法:
修改核心引導引數,加入elevator=排程程式名
CentOS7:
[root@localhost ~]# grubby --update-kernel=ALL --args="elevator=deadline"
[root@localhost ~]# reboot
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
CentOS6:
# vim /boot/grub/menu.lst
更改到如下內容: ## 在 rhgb quiet 前新增 elevator=deadline
kernel /boot/vmlinuz-2。6。32-504.el6 ro root=LABEL=/ elevator=deadline rhgb quiet
重啟之後,檢視排程方法:
cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
已經是deadline了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2213501/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 程式排程演算法之先到先服務演算法
- 作業系統之排程演算法作業系統演算法
- linux程式排程Linux
- MySQL資料庫環境如何調整磁碟IO排程演算法MySql資料庫演算法
- 排程器簡介,以及Linux的排程策略Linux
- Linux IO排程方法Linux
- C語言寫的磁碟排程演算法,歡迎大家來討論C語言演算法
- LVS排程演算法演算法
- Linux之CPU排程策略和CPU親和性Linux
- linux之磁碟管理Linux
- 【作業系統】磁碟的四種基本排程演算法(圖表說明)作業系統演算法
- linux搶佔式排程Linux
- Linux I/O排程器Linux
- Kubernetes之Pod排程
- cpu的排程演算法演算法
- Go語言排程器之排程main goroutine(14)GoAI
- Linux 定時任務排程Linux
- newsql新品TiDB之排程SQLTiDB
- 2.2.5排程演算法:時間片輪轉、優先順序排程、多級反饋排程演算法
- Flink排程之排程器、排程策略、排程模式模式
- Linux程序排程器-CPU負載Linux負載
- Linux Shell指令碼時間排程Linux指令碼
- LInux實驗 : 程式排程模擬Linux
- 磁軌排程演算法介紹演算法
- Linux核心之磁碟和分割槽Linux
- 程式排程的原理和演算法探析演算法
- 任務排程的並行演算法並行演算法
- 如何更改Linux的I/O排程器Linux
- Linux排程器:程序優先順序Linux
- k8s之pod排程K8S
- MySQL 8.0 | CATS排程演算法的效能提升MySql演算法
- MySQL優化--IO排程演算法優化MySql優化演算法
- Linux程式排程邏輯與原始碼分析Linux原始碼
- Linux 中 Laravel 任務排程不執行LinuxLaravel
- 從框架作者角度聊:React排程演算法的迭代過程框架React演算法
- golang 原始碼分析之scheduler排程器Golang原始碼
- 大資料排程元件之Apache DolphinScheduler大資料元件Apache
- IceRPC之排程管道->快樂的RPCRPC