linux 进程调度cfg,选择Linux I / O调度程序
我讀到,據說可以通過寫入/ sys / block / [disk] / queue / scheduler來更改正在運行的內核上特定設備的I / O調度程序。 例如,我可以在系統上看到:
anon@anon:~$ 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
[username@hostname ~]$ io-get-sched
sda: ? ?bfq
sr0: ? ?bfq
# Query available I/O schedulers
[username@hostname ~]$ io-set-sched --list
mq-deadline kyber bfq none
# Set sda to use"kyber"
[username@hostname ~]$ 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
[username@hostname ~]$ io-get-sched
sda: ? ?kyber
sr0: ? ?bfq
# Set all block devices to use 'deadline' i/o scheduler
[username@hostname ~]$ 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
[username@hostname ~]$ 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看到編輯
總結
以上是生活随笔為你收集整理的linux 进程调度cfg,选择Linux I / O调度程序的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 不可错过的年度AI学术盛会 2021新一
- 下一篇: 宝石迷阵 java_宝石迷阵-2019头
