本文詳細介紹了 Linux 操作系統(tǒng)中的不同I/O調(diào)度算法,如Noop、CFQ、Deadline、BFQ和預(yù)期I/O調(diào)度程序,并對它們的性能進行了比較。了解這些調(diào)度算法有助于提高系統(tǒng)的磁盤訪問效率和應(yīng)用程序響應(yīng)時間。
首先,讓我們回顧一下操作系統(tǒng)中的調(diào)度是什么。我們可以區(qū)分操作系統(tǒng)中的兩種類型的調(diào)度程序:進程調(diào)度程序和I/O調(diào)度程序。我們對后者感興趣。I/O 調(diào)度程序是塊設(shè)備和低級驅(qū)動程序之間的一層。它旨在提供對磁盤設(shè)備的最佳進程訪問。盡管調(diào)度程序的工作表面上很簡單,但由于磁盤操作是一個非常慢的操作并且在磁盤上搜索必要的扇區(qū)不會很快發(fā)生,因此這種簡單性被消除了。同時,進程正在等待輪流訪問磁盤。I/O 調(diào)度程序應(yīng)該能夠按照優(yōu)先級提供信息,并確保應(yīng)用程序在一定時間內(nèi)接收到數(shù)據(jù)。
在早期版本的 Linux 中,只有一個 I/O 調(diào)度程序:Linus Elevator。太原始了,因此在2.6內(nèi)核中,又出現(xiàn)了三個調(diào)度器。讓我們詳細考慮調(diào)度程序。
Noop
Noop是最簡單的調(diào)度程序。它簡單地將所有請求放入 FIFO 隊列中并執(zhí)行它們。請注意,無論 I/O 請求的類型如何,系統(tǒng)中存在的所有進程都會發(fā)生這種情況。此外,noop 能夠合并一些請求。類似目的的讀/寫請求被組合起來,以減少磁盤操作次數(shù)并增加系統(tǒng)調(diào)用的長度。
CFQ
CFQ 作為網(wǎng)絡(luò)調(diào)度程序 SFQ(隨機公平隊列)的擴展出現(xiàn)。CFQ 與 Noop 的不同之處在于,它為每個進程都有單獨的隊列。當隊列不為空或指定的時間片未過期時,調(diào)度程序會循環(huán)服務(wù)每個進程(最后一個條件與進程調(diào)度程序類似)。在每個隊列的范圍內(nèi),讀操作的優(yōu)先級高于寫操作。
Deadline
Deadline 是標準調(diào)度程序。從其名稱可以明顯看出,Deadline 嘗試在指定時間執(zhí)行請求。Deadline 支持兩個特殊的截止時間隊列(按過期時間排序)和兩個用于讀寫操作的排序隊列(按扇區(qū)編號排序)。截止日期隊列旨在防止請求匱乏。Deadline 批量處理請求。批次是按 LBA 遞增順序排列的 I/O 操作序列。讀操作比寫操作具有更高的優(yōu)先級,就像在 CFQ 中一樣,因為進程通常會阻塞讀操作。因此,讀操作的過期時間為 500 毫秒,而寫操作的過期時間為 5 秒。在下一個請求之前,Deadline 必須選擇一個隊列以供使用(讀或?qū)懀?。該算法更適合讀操作較多的系統(tǒng),如數(shù)據(jù)庫、Web服務(wù)器等。
BFQ
BFQ(Budget Fair Queueing)是一種基于CFQ的比例份額磁盤調(diào)度算法。BFQ將基于時間間隔的Round Robin調(diào)度算法進行了轉(zhuǎn)換,使其更加關(guān)注磁盤扇區(qū)數(shù)。每個任務(wù)都有一個專用的部門預(yù)算,該預(yù)算可能會根據(jù)任務(wù)的行為而有所不同。BFQ 保證磁盤流量會在任務(wù)之間更加誠實地分配,并將查詢磁盤數(shù)據(jù)的復(fù)雜度降低到 O(1)。
預(yù)期 I/O 調(diào)度程序
預(yù)期 I/O 調(diào)度程序嘗試猜測后續(xù)請求將在磁盤的哪些塊上執(zhí)行,并嘗試聚合和/或重新排序請求,從而改進局部性并減少磁盤尋道操作。該算法在當前讀操作看似完成時為下一次讀操作做好準備。
對讀取操作有效的調(diào)度算法(例如 Deadline 或 Anticipatory)可以為 Web 服務(wù)器或數(shù)據(jù)庫帶來性能提升。您可以通過調(diào)整調(diào)度程序參數(shù)來充分加快 Apache Web 服務(wù)器的速度。
您可以通過此命令檢查可用調(diào)度程序的列表(當前調(diào)度程序分配在方括號中):
$ cat /sys/block/sda/queue/scheduler
我的 Linux 機器上的輸出是 noop [deadline] cfq .
有很多不錯的工具可以比較調(diào)度算法的性能。我用于 hdparm 寫作基準。hdparm 包含默認基準(但您可以使用自己的基準)。的用法hdparm 是:
$ apt-get install hdparm $ hdparm -tT /dev/sda
為了比較算法的性能,我們必須將調(diào)度程序從默認更改為任意。您可以使用下一個命令來執(zhí)行此操作:
$ echo {SCHEDULER_NAME} > /sys/block/sda/queue/scheduler
hdparm 提供定時緩存讀取和定時緩沖磁盤讀取。當然,您可以使用其他方法進行測試,例如 dd 命令或bonnie++。文章來源:http://www.zghlxwxcb.cn/article/427.html
文章來源地址http://www.zghlxwxcb.cn/article/427.html
到此這篇關(guān)于Linux 中的 I/O 調(diào)度算法解析及性能比較的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!