linux - 选择 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 中所述,任何特定 block 设备上的 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 通常是内存支持的 block 设备(例如 ramdisk)和其他非旋转介质(闪存)的最佳选择,因为尝试重新调度 I/O 会浪费资源
  • deadline 是一个轻量级调度器,它试图对延迟设置硬性限制
  • cfq 尝试维护系统范围内 I/O 带宽的公平性

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

https://stackoverflow.com/questions/1009577/

相关文章:

python - 未找到 Virtualenv 命令

linux - 仅使用 shell 脚本从文本文件中获取特定行

python - 在 Python 中使用多个参数进行字符串格式化(例如 '%s ... %s' )

python - 如何在python中打印百分比值?

python - 仅在 Django 启动 ONCE 时执行代码?

python - ConfigParser 中的列表

ruby - 找不到 gem 命令

linux - 使用 find 命令但排除两个目录中的文件

linux - 如何使用 cURL 从 GitHub 下载 tarball?

linux - 使用 bash 为文件添加文件扩展名