我读到,通过写入/sys/block/[disk]/queue/scheduler,可以在运行的内核上更改特定设备的I/O调度程序.例如,我可以在我的系统上看到:

anon@anon:~$ cat /sys/block/sda/queue/scheduler 
noop anticipatory deadline [cfq] 

默认值是完全公平的队列调度程序.我想知道的是,在我的定制内核中包含所有四个调度器是否有用.除非内核足够聪明,能够为正确的硬件 Select 正确的调度器,特别是为基于闪存的驱动器 Select "noop"调度器,为传统硬盘驱动器 Select 其他调度器,否则编译多个调度器似乎没有多大意义.

是这样吗?

推荐答案

/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

理想情况下,将有一个单一的调度器来满足所有需求.它似乎还不存在.内核通常没有足够的知识来为您的工作负载 Select 最佳的调度程序:

  • noop通常是内存支持的块设备(例如ramdisks)和其他非旋转介质(flash)的最佳 Select ,在这些设备中,try 重新安排I/O是一种资源浪费
  • deadline是一个轻量级的调度器,它试图对延迟进行严格限制
  • cfq试图保持系统范围内I/O带宽的公平性

在很长一段时间内,默认值为anticipatory,并进行了大量调整,但在2.6.33年(2010年初)被删除.cfq在不久前成为默认版本,因为它的性能是合理的,公平性是多用户系统(甚至是单用户台式机)的一个好目标.在某些情况下——数据库经常被用作示例,因为它们往往已经有了自己独特的调度和访问模式,并且通常是重要的服务(那么谁在乎公平呢?——anticipatory在这些工作负载上长期以来一直是可调的,以获得最佳性能,而deadline则非常迅速地将所有请求传递到底层设备.

Linux相关问答推荐

完全加入- bash

Linux打开/dev/tran/n是否与复制相同?

为什么在Linux上STD::SLEEP_FOR(STD::Chrono::Hors::Max())会立即返回?

如何在 if ... elif struct 中判断 bash 命令的退出状态?

ln命令报错target not a directory

使用 sed 或 awk 格式化文本

使用 grep 时如何跳过第一行和最后一行?

当 skylake 有 fsgsbase 时,为什么使用 __builtin_ia32_wrfsbase64 会收到非法指令?

如何/在哪里可以找到要修复的 Linux 内核错误?

在 Bash 中从最后到第一个输出文件行

bash 中的sed命令

如何优雅地退出 X11 事件循环?

在 Node.JS 中引用相对于应用程序根目录的文件的正确方法

在使用文件时截断文件 (Linux)

无法在 Android Studio 中清理项目

为 django 项目安装 memcached

如何分析内存使用情况?

将 CMake 项目导入 Eclipse CDT

linux根据文件名模式搜索文件

判断环境变量是否已经设置