共計 3526 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章主要介紹 Linux I/ O 調度器是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
Linux I/O 調度器是 Linux 內核中的一個組成部分,用戶可以通過調整這個調度器來優化系統性能。
Linux I/O 系統簡介
Linux I/ O 調度器 (Linux I/O Scheduler) 是 LinuxI/ O 體系的一個組件,它介于通用塊層和塊設備驅動程序之間。如圖 1 所示。
圖 1 Linux I/ O 調度器介于通用塊層和塊設備驅動程序之間
當 Linux 內核組件要讀寫一些數據時,并不是請求一發出,內核便立即執行該請求,而是將其推遲執行。當傳輸一個新數據塊時,內核需要檢查它能否通過。Linux IO 調度程序是介于通用塊層和塊設備驅動程序之間,所以它接收來自通用塊層的請求,試圖合并請求,并找到最合適的請求下發到塊設備驅動程序中。之后塊設備驅動程序會調用一個函數來響應這個請求。
Linux 整體 I / O 體系可以分為七層,它們分別是:
1. VFS 虛擬文件系統:內核要跟多種文件系統打交道,內核抽象了這 VFS,專門用來適配各種文件系統,并對外提供統一操作接口。
2. 磁盤緩存:磁盤緩存是一種將磁盤上的一些數據保留著 RAM 中的軟件機制,這使得對這部分數據的訪問可以得到更快的響應。磁盤緩存在 Linux 中有三種類型:Dentry cache,Page cache,Buffer cache。
3. 映射層:內核從塊設備上讀取數據,這樣內核就必須確定數據在物理設備上的位置,這由映射層 (Mapping Layer) 來完成。
4. 通用塊層:由于絕大多數情況的 I / O 操作是跟塊設備打交道,所以 Linux 在此提供了一個類似 vfs 層的塊設備操作抽象層。下層對接各種不同屬性的塊設備,對上提供統一的 Block IO 請求標準。
5. I/ O 調度層:大多數的塊設備都是磁盤設備,所以有必要根據這類設備的特點以及應用特點來設置一些不同的調度器。
6. 塊設備驅動:塊設備驅動對外提供高級的設備操作接口。
7. 物理硬盤:這層就是具體的物理設備。
5 種類型的 Linux I/ O 調度器
Linux 從 2.4 內核開始支持 I / O 調度器, 到目前為止有 5 種類型:Linux 2.4 內核的 Linus Elevator、Linux 2.6 內核的 Deadline、Anticipatory、CFQ、Noop,其中 Anticipatory 從 Linux 2.6.33 版本后被刪除了。目前主流的 Linux 發行版本使用 Deadline、CFQ、Noop 三種 I / O 調度器。下面依次簡單介紹:
1 Linus Elevator
在 2.4 內核中它是第一種 I / O 調度器。它的主要作用是為每個設備維護一個查詢請求,當內核收到一個新請求時,如果能合并就合并。如果不能合并,就會嘗試排序。如果既不能合并,也沒有合適的位置插入,就放到請求隊列的最后。
2 Anticipatory
Anticipatory 的中文含義是 預料的,預想的,顧名思義有個 I / O 發生的時候,如果又有進程請求 I / O 操作,則將產生一個默認的 6 毫秒猜測時間,猜測下一個進程請求 I / O 是要干什么的。這個 I / O 調度器對讀操作優化服務時間,在提供一個 I / O 的時候進行短時間等待,使進程能夠提交到另外的 I /O。Anticipatory 算法從 Linux 2.6.33 版本后被刪除了,因為使用 CFQ 通過配置也能達到 Anticipatory 的效果。
3 DeadLine
Deadline 翻譯成中文是截止時間調度器,是對 Linus Elevator 的一種改進,它避免有些請求太長時間不能被處理。另外可以區分對待讀操作和寫操作。DEADLINE 額外分別為讀 I / O 和寫 I / O 提供了 FIFO 隊列。Deadline 的工作流程如圖 2 所示。
圖 2 Deadline 的工作流程
4 CFQ
CFQ 全稱 Completely Fair Scheduler,中文名稱完全公平調度器,它是現在許多 Linux 發行版的默認調度器,CFQ 是內核默認選擇的 I / O 調度器。它將由進程提交的同步請求放到多個進程隊列中,然后為每個隊列分配時間片以訪問磁盤。對于通用的服務器是最好的選擇,CFQ 均勻地分布對 I / O 帶寬的訪問。CFQ 為每個進程和線程, 單獨創建一個隊列來管理該進程所產生的請求, 以此來保證每個進程都能被很好的分配到 I / O 帶寬,I/ O 調度器每次執行一個進程的 4 次請求。該算法的特點是按照 I / O 請求的地址進行排序,而不是按照先來后到的順序來進行響應。簡單來說就是給所有同步進程分配時間片,然后才排隊訪問磁盤,CFQ 的工作流程如圖 3 所示。
圖 3 CFQ 的工作流程
5 NOOP
NOOP 全稱 No Operation, 中文名稱電梯式調度器,該算法實現了最簡單的 FIFO 隊列,所有 I / O 請求大致按照先來后到的順序進行操作。NOOP 實現了一個簡單的 FIFO 隊列, 它像電梯的工作主法一樣對 I / O 請求進行組織。它是基于先入先出 (FIFO) 隊列概念的 Linux 內核里最簡單的 I /O 調度器。此調度程序最適合于固態硬盤。
I/ O 調度器的選擇
目前主流 Linux 發行版本使用三種 I / O 調度器:DeadLine、CFQ、NOOP,通常來說 Deadline 適用于大多數環境, 特別是寫入較多的文件服務器,從原理上看,DeadLine 是一種以提高機械硬盤吞吐量為思考出發點的調度算法,盡量保證在有 I / O 請求達到最終期限的時候進行調度,非常適合業務比較單一并且 I / O 壓力比較重的業務,比如 Web 服務器,數據庫應用等。CFQ 為所有進程分配等量的帶寬, 適用于有大量進程的多用戶系統,CFQ 是一種比較通用的調度算法,它是一種以進程為出發點考慮的調度算法,保證大家盡量公平, 為所有進程分配等量的帶寬, 適合于桌面多任務及多媒體應用。NOOP 對于閃存設備和嵌入式系統是最好的選擇。對于固態硬盤來說使用 NOOP 是最好的,DeadLine 次之,而 CFQ 效率最低。
查看 Linux 系統的 I/ O 調度器
查看 Linux 系統的 I / O 調度器一般分成兩個部分,一個是查看 Linux 系統整體使用的 I / O 調度器,另一個是查看某磁盤使用的 I / O 調度器。
查看當前系統支持的 I / O 調度器,使用如下命令:
# dmesg | grep -i scheduler [ 1.508820] io scheduler noop registered [ 1.508827] io scheduler deadline registered [ 1.508850] io scheduler cfq registered (default)
顯示 cfq 是目前的 I / O 調度器。
查看某塊硬盤的 IO 調度算法 I / O 調度器,使用如下命令:
# cat /sys/block/sda/queue/scheduler noop deadline [cfq]
顯示當前使用的調度器是 cfq,就是括號括起來的那一個。
修改 Linux 系統的 I/ O 調度器
修改 Linux 系統的 I/ O 調度器有三種方法,分別是使用 shell 命令、使用 grubby 命令或者修改 grub 配置文件。下面依次介紹:
1、使用 shell 命令
Linux 下更改的 I / O 調度器很簡單。不需要更新內核,可以使用 shell 命令修改:
#echo noop /sys/block/sdb/queue/scheduler
清單 3 的命令把 noop 設置為一個磁盤的 I / O 調度器,你可以隨時更改而無需重啟計算機。
2、永久修改默認的 I / O 調度器
使用 shell 命令修改 I / O 調度器,只是臨時修改,系統重啟后,修改的調度器就會失效,要想修改默認的調度器,有兩種方法使用 grubby 命令或者直接編輯 grub 配置文件。
使用 grubby 命令
例如需要把 I / O 調度器從 cfq 調整成 DeadLine,命令如下:
# grubby --grub --update-kernel=ALL --args= elevator=deadline
通過設置內核加載參數, 這樣當機器重啟的時候,系統自動把所有設備的 I/ O 調度器變成 DeadLine。
3、使用編輯器修改配置文件
也可以直接編輯 grub 的配置文件,通過修改 grub 配置文件,系統自動把所有設備的 I/ O 調度器變成 cfq。操作過程如下:
#vi cat /etc/default/grub # 修改第五行,在行尾添加 # elevator= cfq 然后保存文件,重新編譯配置文件, #grub2-mkconfig -o /boot/grub2/grub.cfg
重新啟動計算機系統即可。
以上是“Linux I/ O 調度器是什么”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!