天天看點

linux 程序排程cfg,選擇Linux I / O排程程式

我讀到,據說可以通過寫入/ sys / block / [disk] / queue / scheduler來更改正在運作的核心上特定裝置的I / O排程程式。 例如,我可以在系統上看到:

[email protected]:~$ cat /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

預設值是完全公平的隊列排程程式。 我想知道的是,在自定義核心中包括所有四個排程程式是否有用。 除非核心足夠聰明地為正确的硬體選擇正确的排程程式,特别是基于閃存的驅動器的" noop"排程程式,以及針對傳統驅動器的其他排程程式,否則編譯一個以上的排程程式似乎沒有多大意義。 硬碟。

是這樣嗎

如/usr/src/linux/Documentation/block/switching-sched.txt中所述,可以在運作時更改任何特定塊裝置上的I / O排程程式。可能會有一些延遲,因為在使用新的排程程式之前,所有先前的排程程式的請求都已清除,但是即使裝置使用過多,也可以毫無問題地對其進行更改。

# cat /sys/block/hda/queue/scheduler

noop deadline [cfq]

# echo anticipatory > /sys/block/hda/queue/scheduler

# cat /sys/block/hda/queue/scheduler

noop [deadline] cfq

理想情況下,将有一個排程程式來滿足所有需求。它似乎還不存在。核心通常沒有足夠的知識來為您的工作負載選擇最佳的排程程式:

noop通常是記憶體支援的塊裝置(例如ramdisk)和其他非旋轉媒體(閃存)的最佳選擇,在這些裝置中嘗試重新安排I / O會浪費資源

deadline是一個輕量級的排程程式,它試圖對延遲進行硬性限制

cfq嘗試維護I / O帶寬在系統範圍内的公平性

預設值為anticipatory很長時間,它進行了大量調整,但在2.6.33(2010年初)中已被删除。 cfq成為不久前的預設設定,因為它的性能合理且公平是多使用者系統(甚至單使用者桌面)的良好目标。在某些情況下-資料庫經常被用作示例,因為它們往往已經具有自己獨特的排程和通路模式,并且通常是最重要的服務(是以誰在乎公平性?)-anticipatory曆史悠久可以調整以在這些工作負載上獲得最佳性能,并且deadline很快将所有請求傳遞到基礎裝置。

很好的資訊,謝謝!但是我的基本問題仍然沒有得到解答,如果我插入閃存驅動器或上網本用閃存驅動器運作,因為其主驅動器的核心足夠聰明,可以選擇noop而不是預設的cfq嗎?還是完全由我決定手動執行此操作?

您可以将核心配置為預設使用其他排程程式。在非旋轉媒體上自動使用noop會很聰明,但是核心沒有該功能。它确實可以檢測到非旋轉媒體,但是由于某些磁盤錯誤地報告了自身,是以它并不可靠,而且無論如何還不能連接配接到I / O排程程式代碼。

您可以添加udev規則來根據裝置特征定義排程程式,如debian wiki(wiki.debian.org/SSDOptimization#Low-Latency_IO-Scheduler)中一樣#為非旋轉磁盤設定截止期限排程程式ACTION ==" add | change",KERNEL ==" sd [az]",ATTR {queue / rotational} ==" 0",ATTR {queue / scheduler} ="最後期限"

@Dani_l您應該對此進行擴充并将其添加為答案。

@ RobertS.Barnes完成,感謝您的建議。

有沒有辦法在運作時一次為所有驅動器更改它?同樣,通過核心指令行參數" elevator"設定預設排程程式。謝謝。

是否可以更改每個分區的I / O排程程式。假設sda1具有ext4,但sda2具有xfs。 XFS FAQ說cfq對于該檔案系統不好

可以使用udev規則讓系統根據硬體的某些特性來決定排程程式。

用于SSD和其他非旋轉驅動器的udev規則示例可能看起來像

# set noop scheduler for non-rotating disks

ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

在新的udev規則檔案中(例如/etc/udev/rules.d/60-ssd-scheduler.rules)。該答案基于debian Wiki

要檢查ssd磁盤是否将使用該規則,可以預先檢查trigger屬性:

for f in /sys/block/sd?/queue/rotational; do printf"$f"; cat $f; done

自動化檢測非旋轉媒體并将IO排程程式僅應用于那些非旋轉媒體的絕佳答案。建議截止日期不僅适用于非旋轉媒體。 Oracle建議使用截止日期io排程程式來處理資料庫工作負載。 Oracle的這一建議可能來自這樣一個事實,即截止日期可以比其他IO排程程式處理更好的同步寫入。例如,檢視/ sys / block / sdX / queue / iosched / writes_starved"最後期限"排程程式的可調參數(對于讀取而言,沒有這種可調參數)。如果資料庫的同步重做寫入不能很快完成,則資料庫的性能可能會很差。

使核心支援不同核心的目的是您可以在不重新開機的情況下試用它們。然後,您可以通過系統運作測試工作負載,衡量性能,然後将其作為應用程式的标準工作負載。

在現代的伺服器級硬體上,隻有noop才顯得有用。其他人在我的測試中似乎較慢。

您如何在運作時實際更改它?

相對于其他排程程式,noops性能在很大程度上取決于硬體和特定的負載。出于好奇,您正在運作哪些磁盤,控制器和測試?

是的,當您擁有智能RAID控制器和其他東西(比核心更多地了解最佳通路模式)時,noop很好。截止日期也不錯。

這對我來說純粹是一個學習練習,我試圖配置最小和最快的引導核心,以提供筆記本電腦上我需要的所有功能。 Ive在" Linux Kernel Development"和" Essential Linux Device Drivers"中都進行了研究,但還沒有找到令人滿意的答案,核心在運作時選擇Scheduler時有多聰明,或者除非您手動設定,否則它總是使用預設值去别的東西?

ephemient>在DELL PERC控制器上,也在DELL Powervault MD3000上。兩者似乎都比預設(CFQ)好。

啊,真正的伺服器級硬體。是的,我可以想象noop的性能要好于cfq,但是deadline也應該相當不錯...

您可以在啟動時通過向核心cmdline添加" elevator"參數來進行設定(例如在grub.cfg中)

例:

elevator=deadline

這将使"截止期限"成為所有塊裝置的預設I / O排程程式。

如果您想在系統啟動後查詢或更改排程程式,或者想為特定的塊裝置使用其他排程程式,建議您安裝并使用ioschedset工具來簡化此操作。

https://github.com/kata198/ioschedset

如果您使用的是Archlinux,則可以在aur中使用:

https://aur.archlinux.org/packages/ioschedset

一些示例用法:

# Get i/o scheduler for all block devices

[[email protected] ~]$ io-get-sched

sda:    bfq

sr0:    bfq

# Query available I/O schedulers

[[email protected] ~]$ io-set-sched --list

mq-deadline kyber bfq none

# Set sda to use"kyber"

[[email protected] ~]$ io-set-sched kyber /dev/sda

Must be root to set IO Scheduler. Rerunning under sudo...

[sudo] password for username:

+ Successfully set sda to 'kyber'!

# Get i/o scheduler for all block devices to assert change

[[email protected] ~]$ io-get-sched

sda:    kyber

sr0:    bfq

# Set all block devices to use 'deadline' i/o scheduler

[[email protected] ~]$ io-set-sched deadline

Must be root to set IO Scheduler. Rerunning under sudo...

+ Successfully set sda to 'deadline'!

+ Successfully set sr0 to 'deadline'!

# Get the current block scheduler just for sda

[[email protected] ~]$ io-get-sched sda

sda:    mq-deadline

用法應該是不言自明的。這些工具是獨立的,僅需要bash。

希望這可以幫助!

編輯:免責聲明,這些是我編寫的腳本。

Linux核心不會在運作時自動更改IO Scheduler。我的意思是,到目前為止,Linux核心無法根據輔助儲存設備的類型自動選擇"最佳"排程程式。在啟動期間或運作期間,可以手動更改IO排程程式。

預設排程程式是在啟動時根據/linux-2.6 /block/Kconfig.iosched檔案中的内容選擇的。但是,可以通過将有效的排程程式名稱echo放入/ sys / block / [DEV] / queue / scheduler中的檔案來在運作時更改IO排程程式。例如,echo deadline > /sys/block/hda/queue/scheduler

我不明白為什麼這個答案值得這麼多贊成票。它實際上不是錯誤的。

@DepressedDaniel看到編輯