Linux I/O調度器介紹
linux I/O調度器的總體目標是希望讓磁頭能夠順序訪問,在較小的影響響應速度的前提下,提高I/O的吞吐量,類似電梯的原理,所以linux的I/O調度算法也被稱為電梯調度算法。下面就Linux常見的I/O調度程序進行介紹。
Noop(No Operation)
Noop是針對非傳統機械硬盤(例如Dorado V3或內存設備)或自身具備I/O調度算法或較大緩存的環境,提供了最基本的合并和排序(FIFO)功能。NOOP調度器執行的唯一操作是合并,它以后向合并的方式合并了相鄰的請求,除此之外,它是一個真正的無操作調度程序,它僅按FIFO順序維護請求隊列。注意,并不是存儲足夠快就應該選擇Noop調度算法,還應該考慮主機的負載模型,如果系統是計算密集型(CPU-bound)且存儲非??欤ɡ鏒orado V3),Noop算法是一個不錯的選擇。
CFQ(Completely Fair Queuing)
CFQ嘗試提供由發起I/O進程決定的公平的I/O調度,是RHEL5.x(內核版本2.6.18)上默認調度策略。CFQ提供三個不同的調度等級:實時real-time(RT),最佳效果best-effort(BE)和閑置idle。可使用?ionice?命令手動分配調度等級,或者使用ioprio_set系統調用編程分配。默認情況下將進程設定為"最佳效果"調度等級。實時調度等級和最佳效果調度等級又進一步分為八個?I/O?優先級,其中?0?代表最高優先權,7?代表最低優先權。采用實時調度等級的進程比采用最佳效果等級和閑置等級的進程會被更頻繁地調度,因此所有實時等級的I/O都會在最佳效果等級或者閑置等級I/O前得到調度。這意味著實時優先權的I/O可能餓死最佳效果和閑置等級的I/O。最佳效果調度是默認調度等級,默認優先權為?4。閑置調度等級中的進程只有在系統中沒有其他I/O等待時才會被執行。
CFQ通過為每個執行I/O的進程分配時間片段提供公平。在其時間片段中,進程每次最多可有八個請求(默認)。調度程序會嘗試根據歷史數據估計某個程序是否會在近期發出更多?I/O,如果認為該進程即將發出更多的I/O,CFQ會“空轉”,等待即將下發的I/O,即使有其他進程正在等待發出?I/O。由于CFQ執行的“空轉”等待操作,通常CFQ并不適合快速外置存儲陣列或者固態硬盤,例如Dorado V3。如果要求在此類存儲中使用CFQ(例如需要使用?cgroup加權I/O調度程序),則需要調節一些參數以改進CFQ性能。具體見RedHat Performance Tuning Guide.
CFQ是一個非工作保留(non-work-conserving)的I/O調度器,這意味著即使有待處理的請求,它也可以是空閑的。非工作保留調度器的堆棧會在I/O路徑中引入大的延遲。例如,在基于主機的硬件RAID控制器的頂部使用CFQ,RAID控制器可以實現其自己的非工作保留調度器,從而在堆棧中引起兩次延遲。
Deadline
最后期限I/O調度中每個請求是基于最后期限的,即每request會被分配一個time stamp,注意:只有當請求進入I/O調度程序后方開始計算時延(這個區別非常重要,因為可能會讓程序進入睡眠等待模式以便釋放請求描述符)。
讀請求和寫請求被分成了兩個隊列,每個隊列(讀或寫)都采用兩種方式將這些請求管理起來,一種是采用紅黑樹(RB tree)的方式將所有request組織起來,通過request的訪問地址作為索引,即按照LBA順序排序(單向遞增);另一種方式是采用隊列的方式將request管理起來,所有的request采用先來后到的方式進行排序,即FIFO隊列。
默認情況下讀取比寫入的優先權高,因為程序更容易因讀取I/O而被阻斷,除非寫請求即將被餓死的時候,才會去調度處理寫請求。這種處理可以保證讀請求的延遲時間最小化。
最后期限調度以批量的形式處理請求,對那些地址臨近的順序化請求,deadline給予了高優先級處理權,參數fifo_batch可指定一批包含的讀取或寫入個數,默認為16。
處理完一批I/O后,I/O調度程序會檢查是否有寫請求已等待太久,然后決定是否開始新一批讀或者寫操作,這樣保證了每個請求的延遲時間。只在開始新一批I/O處理時才檢查FIFO請求列表的過期請求,因此,如果選擇批寫入,且同時有過期的讀取請求,那么只有在批寫入完成后方可執行讀取請求。
Anticipatory scheduler(AS)
該算法從Linux?2.6.33版本后被移除。Anticipatory基于“假空閑”(Deceptive idleness)的假設,意思是一個進程在剛剛做完一次讀操作后,看似空閑,但可能是在處理這些數據,處理完后還會繼續進行讀操作,這個時候如果IO調度器去處理另外一個進程的請求,那么當原進程的下一個請求到來,磁頭需要重新尋址,這樣大大增加了時延。所以,Anticipatory算法會在一個讀請求完成后,再等待一定時間,通常是6ms,如果6ms內這個進程上還有讀請求過來,則繼續服務,否則,處理下一個進程的讀寫請求。
配置I/O調度
下面示例查看sdc的調度策略,[cfq]表示當前的調度策略為cfq
# cat /sys/block/sdc/queue/scheduler
noop anticipatory deadline [cfq]
下面示例將sdc的調度策略臨時修改為noop,服務器重啟后將恢復默認
# echo noop > /sys/block/sdc/queue/scheduler
在內核啟動參數指定調度策略,例如elevator=noop
kernel /boot/vmlinuz-2.6.32.54-0.3-default root=/dev/disk/by-id/scsi-3600508e00000000099853793bd56b80b-part1 resume=/dev/disk/by-id/scsi-3600508e00000000099853793bd56b80b-part2 splash=silent crashkernel=128M@32M??elevator=noop
參考
switching-sched.txt??https://www.kernel.org/doc/Documentation/block/switching-sched.txt
Veloces: An Efficient I/O Scheduler for Solid State Devices??https://www.kernel.org/doc/ols/2014/ols2014-rangnekar.pdf
Enhancements to Linux I/O Scheduling???https://www.kernel.org/doc/ols/2005/ols2005v2-pages-183-200.pdf
Workload Dependent Performance Evaluation of the Linux 2.6 I/O Schedulers??https://www.kernel.org/doc/ols/2004/ols2004v2-pages-139-162.pdf
Completely Fair Queuing (CFQ)
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s04.html
Linux中常見IO調度器??http://alanwu.blog.51cto.com/3652632/1393068
Linux 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。