1. 程式人生 > >Linux I/O 排程方法

Linux I/O 排程方法

作業系統的排程有

CPU排程    CPU scheduler

IO排程       IO scheduler

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

[[email protected] ~]# 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=排程程式名
vi /boot/grub/menu.lst
更改到如下內容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet


重啟之後,檢視排程方法:
cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
已經是deadline了

)I/O排程程式的測試

本次測試分為只讀,只寫,讀寫同時進行.
分別對單個檔案600MB,每次讀寫2M,共讀寫300次.

1)測試磁碟讀:


[[email protected] tmp]# echo deadline > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/sda1 of=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.81189 seconds, 92.4 MB/s

real 0m6.833s
user 0m0.001s
sys 0m4.556s
[[email protected] tmp]# echo noop > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/sda1 of=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.61902 seconds, 95.1 MB/s

real 0m6.645s
user 0m0.002s
sys 0m4.540s
[[email protected] tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/sda1 of=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 8.00389 seconds, 78.6 MB/s

real 0m8.021s
user 0m0.002s
sys 0m4.586s
[[email protected] tmp]# echo cfq > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/sda1 of=/dev/null bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 29.8 seconds, 21.1 MB/s

real 0m29.826s
user 0m0.002s
sys 0m28.606s
結果:
第一 noop:用了6.61902秒,速度為95.1MB/s
第二 deadline:用了6.81189秒,速度為92.4MB/s
第三 anticipatory:用了8.00389秒,速度為78.6MB/s
第四 cfq:用了29.8秒,速度為21.1MB/s


2)測試寫磁碟:


[[email protected] tmp]# echo cfq > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/zero of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.93058 seconds, 90.8 MB/s

real 0m7.002s
user 0m0.001s
sys 0m3.525s
[[email protected] tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/zero of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.79441 seconds, 92.6 MB/s

real 0m6.964s
user 0m0.003s
sys 0m3.489s
[[email protected] tmp]# echo noop > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/zero of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 9.49418 seconds, 66.3 MB/s

real 0m9.855s
user 0m0.002s
sys 0m4.075s
[[email protected] tmp]# echo deadline > /sys/block/sda/queue/scheduler
[[email protected] tmp]# time dd if=/dev/zero of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 6.84128 seconds, 92.0 MB/s

real 0m6.937s
user 0m0.002s
sys 0m3.447s

測試結果:
第一 anticipatory,用了6.79441秒,速度為92.6MB/s
第二 deadline,用了6.84128秒,速度為92.0MB/s
第三 cfq,用了6.93058秒,速度為90.8MB/s
第四 noop,用了9.49418秒,速度為66.3MB/s


3)測試同時讀/寫

[[email protected] tmp]# echo deadline > /sys/block/sda/queue/scheduler
[[email protected] tmp]# dd if=/dev/sda1 of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 15.1331 seconds, 41.6 MB/s
[[email protected] tmp]# echo cfq > /sys/block/sda/queue/scheduler
[[email protected] tmp]# dd if=/dev/sda1 of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 36.9544 seconds, 17.0 MB/s
[[email protected] tmp]# echo anticipatory > /sys/block/sda/queue/scheduler
[[email protected] tmp]# dd if=/dev/sda1 of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 23.3617 seconds, 26.9 MB/s
[[email protected] tmp]# echo noop > /sys/block/sda/queue/scheduler
[[email protected] tmp]# dd if=/dev/sda1 of=/tmp/test bs=2M count=300
300+0 records in
300+0 records out
629145600 bytes (629 MB) copied, 17.508 seconds, 35.9 MB/s

測試結果:
第一 deadline,用了15.1331秒,速度為41.6MB/s
第二 noop,用了17.508秒,速度為35.9MB/s
第三 anticipatory,用了23.3617秒,速度為26.9MS/s
第四 cfq,用了36.9544秒,速度為17.0MB/s

三)ionice

ionice可以更改任務的型別和優先順序,不過只有cfq排程程式可以用ionice.


有三個例子說明ionice的功能:

採用cfq的實時排程,優先順序為7
ionice -c1 -n7 -ptime dd if=/dev/sda1 of=/tmp/test bs=2M count=300&


採用預設的磁碟I/O排程,優先順序為3
ionice -c2 -n3 -ptime dd if=/dev/sda1 of=/tmp/test bs=2M count=300&


採用空閒的磁碟排程,優先順序為0
ionice -c3 -n0 -ptime dd if=/dev/sda1 of=/tmp/test bs=2M count=300&

ionice的三種排程方法,實時排程最高,其次是預設的I/O排程,最後是空閒的磁碟排程.
ionice的磁碟排程優先順序有8種,最高是0,最低是7.


注意,磁碟排程的優先順序與程序nice的優先順序沒有關係.
一個是針對程序I/O的優先順序,一個是針對程序CPU的優先順序.

Anticipatory I/O scheduler                適用於大多數環境,但不太合適資料庫應用

Deadline I/O scheduler                     通常與Anticipatory相當,但更簡潔小巧,更適合於資料庫應用

CFQ I/O scheduler                            為所有程序分配等量的頻寬,適合於桌面多工及多媒體應用,預設IO排程器

Default I/O scheduler

相關推薦

Linux I/O 排程方法

作業系統的排程有 CPU排程    CPU scheduler IO排程       IO scheduler IO排程器的總體目標是希望讓磁頭能夠總是往一個方向移動,移動到底了再往反方向走,這恰恰就是現實生活中的電梯模型,所以IO調 度器也被叫做電梯. (elevator)而相應的演算法也就被叫做電

Linux I/O 排程演算法

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

linux常用I/O排程演算法及更改

I/O    任何計算機程式都是為了執行一個特定的任務,有了輸入,使用者才能告訴計算機程式所需的資訊,有了輸出,程式執行後才能告訴使用者任務的結果。輸入是Input,輸出是Output,因此,我們把輸入輸出統稱為Input/Output,或者簡寫為IO。         

Linux I/O復用中select poll epoll模型的介紹及其優缺點的比較

創建 等待 歸類 好的 第一個 class ews tor client 關於I/O多路復用: I/O多路復用(又被稱為“事件驅動”),首先要理解的是。操作系統為你

linux初級學習筆記九:linux I/O管理,重定向及管道!(視頻序號:04_3)

font 運算 bsp 輸出 指令 所有 inittab tput bin 本節學習的命令:tr,tee,wc 本節學習的技能:       計算機的組成       I/O管理及重定向      管道的使用   知識點九:管理及IO重定向(4_3) 計算機組成:  

Linux I/O調度

預訂 完成 進程優先級 關系 組織 合並 針對 介質 最大的 一) I/O調度程序的總結 1) 當向設備寫入數據塊或是從設備讀出數據塊時,請求都被安置在一個隊列中等待完成. 2) 每個塊設備都有它自己的隊列. 3) I/O調度程序負責維護這些隊列的順序,

linux I/O棧 之 SCSI TARGET (1) 基礎介紹

    我們之前介紹了,linux I/O 棧的預習方面。簡單地瞭解了一下整個linux I/O 棧的組成。 從今天開始我們仔細介紹linux I/O棧的匯出I/O棧,linux I/O target。  一、基礎介紹   &nb

Linux I/O複用之select函式詳解

置頂 2017年02月12日 20:50:08 難免有錯_ 閱讀數:7438更多 select函式的功能和呼叫順序 使用select函式時統一監視多個檔案描述符的: 1、 是否存在套接字接收資料? 2、 無需阻塞傳輸資料的套接字有哪些? 3、 哪些套接字發生了

Linux I/O複用中select poll epoll模型的介紹及其優缺點的比較

關於I/O多路複用: I/O多路複用(又被稱為“事件驅動”),首先要理解的是,作業系統為你提供了一個功能,當你的某個socket可讀或者可寫的時候,它可以給你一個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操

linux I/O複用之epoll

目錄 1、epoll簡介 2、epoll使用例子 3、epoll兩種模式 3.1、LT模式 3.2、ET模式 4、和select比較 1、epoll簡介 epoll是2002年加入linux的I/O複用介面,是linux平臺獨有的,epoll不是採用輪詢的方式,事

linux I/O複用select

目錄 1、select簡介 2、select使用 3、select缺點 1、select簡介 在linux網路程式設計I/O複用使用的函式之一就是select,select函式是一個古老的介面 int select(int nfds, fd_set *readfds, f

linux I-O體系結構和裝置驅動程式

裝置驅動程式模型 基於linux 3.13 sysfs檔案系統 允許使用者態應用程式訪問核心內部資料結構的一種檔案系統。被安裝於/sys目錄下,相應的高層目錄結構如下: block 塊裝置,獨立於所連線的匯流排 devices

linux I/O狀態實時監控iostat

首先檢視系統有沒有安裝sysstat 如果沒有,則yum install sysstat -y [root@bogon ~]# iostat -c 2 2 #顯示cpu狀態資訊 Lin

Linux I/O Block--塊裝置的表示

       塊裝置的特點是其平均訪問時間較長,因此為了提高塊裝置的訪問效率,Linux核心用了很多的筆墨來設計和塊裝置相關的部分,這樣一來,從程式碼的角度來看,訪問一個檔案的過程變得尤其的漫長……整個路徑包含的過程基本可以概括為虛擬檔案系統-->塊裝置實際檔案系統-

Linux I/O多路複用技術-epoll

 Linux I/O多路複用技術在比較多的TCP網路伺服器中有使用,即比較多的用到select函式。Linux 2.6核心中有提高網路I/O效能的新方法,即epoll 。1、為什麼select落後     首先,在Linux核心中,select所用到的FD_SET是有限的

linux i/o重定向與管道程式設計

1.Linux 使用三種流: 0:stdin           標準輸入 1:stdout        標準輸出 2:stderr         標準錯誤輸出 2.預設的連線是tty 如果輸入sort,按回車鍵,終端將會連線到sort工具上。隨便輸入幾行文字,當按下

Netty快速入門(01)Linux I/O模型介紹

Netty簡述 Netty是一個高效能的網路程式設計框架。 上面提到了幾個關鍵的字眼,高效能,網路程式設計,框架。這些概括Netty的本質。 Netty是一個NIO客戶端伺服器框架,可以快速輕鬆地開發協議伺服器和客戶端等網路應用程式。它極大地簡化並簡化了TCP和UDP套接字伺服器等網路程式設計。 “快速簡

Linux網絡I/O模型簡介

線程 開始 同步阻塞 lin 進程 bio 輪詢 檢查 開發 一、I/O基礎入門 java1.4之前的早期版本,java對I/O的支持並不完善,開發人員在開發高性能I/O程序的時候,會面臨一些巨大的挑戰和困難,主要問題如下。 1、沒用數據緩沖區,I/O性能存在問題; 2、沒

一種提高單片機i/o口驅動能力的方法

water clas aik eas 發現 strong img white .net 一、簡述問題 當你用單片驅動發光二極管的時,你還感覺不到P0、P1口的差別。(10-20mA之間,當中P0驅動能力最強,但對於驅動直流電機依舊非常弱。其結果就是電機不轉)。那麽

linux常用文件I/O操作之文件共享的實現方式

文件共享dup和dup2函數fcntl函數 1、文件共享的三種實現方式 1、什麽是文件共享: (1)文件共享就是同一個文件(同一個文件指的是同一個inode,同一個pathname)被多個獨立的讀寫體(幾乎可以理解為多個文件描述符)去同時(一個打開尚未關閉的同時另一個去操作)操作。