今天测试了一下几种 IO 调度器,不过没什么结论
Tofloor
poster avatar
走钢丝
deepin
2020-10-19 00:21
Author
因为系统经常卡死无响应的问题,今天查了查磁盘 IO 方面的资料,并测试了一下。

论坛内有一个帖子说 https://bbs.deepin.org/post/141744,不过,这个似乎跟我的问题不相干。


IO 调度方面的资料网上不多,很多都是重复的,只能找两篇看看。

单队列调度算法

  1. deadline
  2. cfq
  3. noop
Copy the Code

多队列调度算法


  1. mq-deadline
  2. bfq
  3. none
  4. kyber
Copy the Code

mq 多队列调度机制 3.16 正式加入,适配 io 密集、高 iops 的系统,pc 机上可用可不用,用着意义不太大。5.0 内核已删除单队列调度程序。


查看目前可用的 IO 调度器


  1. cat /sys/block/sda/queue/scheduler
Copy the Code


好像只有 [mq-deadline] none 两个。默认选中的是 mq-deadline,看网上介绍的,这似乎是适用于数据库服务器的调度器。


另外又分别查看了 debian 10 和 ubuntu 20,似乎都是一样的。只有那两个,跟网上说的不太一样。

不过看了 deepin 15.11,似乎 4.15 内核还是使用的单队列调度策略。有 deadline、cfq、noop 等可选,默认的是 cfq,适用于普通台式机。

后来查看了 /usr/lib/modules/5.4.50-amd64-desktop/kernel/block 目录,发现里面有 bfq.ko 和 kyber-iosched.ko。看来 mq-deadline 模块是编译进内核了,其他的调度程序是以单独的模块形式存在的,启动时也没有默认加载。

后面开了一个占用 CPU 特别高的 wine 程序,分别查看了下现有的 mq-deadline 和 none、bfq 等三种调度程序下的表现,都还是会卡死。不过 bfq 表现稍好点,挺得时间较长。

另外,无意中在 phoronix 论坛发现有人说一直在找,大量写入数据导致系统挂起的问题,原因何在。找了十几年都没找到。后面有人说是虚拟内存系统的问题,也没说清。这可能就是说的卡死的问题吧?官方可以参考参考,或主动问下? https://bbs.deepin.org/user/48640   在 4.19 那个测试贴 17 楼和 23 楼。

参考:
如何选择IO调度器
Changing I/O scheduler
Linux 4.19 I/O Scheduler SSD Benchmarks With Kyber, BFQ, Deadline, CFQ
Linux 5.6 I/O Scheduler Benchmarks: None, Kyber, BFQ, MQ-Deadline
linux io阻塞问题
Linux文件读写机制及优化方式


Reply Favorite View the author
All Replies
走钢丝
deepin
2020-10-19 00:29
#1
另外看 arch 的 wiki 上推荐 nvme 的 ssd 不使用 IO 调度器,即 none。有些网站说只要不是机械硬盘,就应该用 none。

Reply View the author
走钢丝
deepin
2020-10-20 20:51
#2
本帖最后由 lidanger 于 2020-10-20 12:54 编辑

今天发现 redhat 的文档上有更详细的说明




我是普通 SSD,又是桌面,该用哪个?@jingle

参考:Chapter 8. Setting the disk scheduler

Reply View the author
走钢丝
deepin
2020-10-20 21:01
#3
https://bbs.deepin.org/post/203997
今天发现 redhat 的文档上有更详细的说明

https://bbs.deepin.org/user/13508  https://bbs.deepin.org/user/10700
大佬来说说。对我来说应该是 bfq 最好吧?

Reply View the author
走钢丝
deepin
2020-10-22 02:24
#4
ubuntu wiki 上说  mq-deadline/none/bfq 等多队列调度器在 ssd 或 nvme 设备上差别不大。所以我最终选择了 kyber
Reply View the author
走钢丝
deepin
2020-10-22 20:47
#5
最终如下,不知道合理不合理,先用一段再说。

加载调度模块

  1. sudo dedit /etc/modules-load.d/iosched.conf
Copy the Code

添加两个未编译进内核的调度模块

  1. bfq
  2. kyber-iosched
Copy the Code

添加应用规则

  1. sudo dedit /etc/udev/rules.d/60-iosched.rules
Copy the Code

添加以下规则,然后重启

  1. # set mq-deadline scheduler for non-rotating disks
  2. ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="kyber"

  3. # set bfq scheduler for rotating disks
  4. ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

  5. # set mq-deadline scheduler for non-rotating nvme-disks
  6. ACTION=="add|change", KERNEL=="nvme[0-9]n1", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
Copy the Code

规则是从其他地方搬来的,改了下。第 3 个用于 nvme 存储;第 2 个用于需要转动的 sata 存储,应该是指机械硬盘吧;第 1 个用于不需要转动的 sata 存储。

我主要把第一个从 mq-deadline 改成 kyber 了。中间改过 bfq,none 等,最后还是觉得 kyber 逻辑上更合适点。因为 ssd 上各个多队列调度器差别不大,按说应该选 none 的,不过考虑到 kyber 添加了读写分离,觉得还是这个好点。毕竟普通 ssd 没那么快。


Reply View the author