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看到编辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值