关于修改磁盘IO调试deadline问题

cat /sys/block/sd[bc]/queue/scheduler

[mq-deadline] kyber bfq none

请问磁盘类型是sdb, 这个mq-deadline需要修改成none吧?

1 个赞

测试环境,随便玩玩就好

1 个赞

sdb是什么,调度类型是根据磁盘类型来的,ssd的tidb建议none,机械盘就是deadline。

1 个赞

这里不是用的固态硬盘,我觉得默认mq-deadline就可以了。
为何官方文档建议sd/vd类型的磁盘需要修改为none?

1 个赞

TiKV 底层是 RocksDB,自己已经做了写限流和 IO 调度;SSD 没有寻道时间,块层再做请求合并、排队排序没有收益,反而多一层延迟。TiDB 官方部署建议里,SSD 盘的 IO 调度器就是 none(老内核叫 noop),HDD 才用 deadline。

2 个赞

文档写的是SD或VD设备都统一改用noop

1 个赞

官方应该都是默认是SSD来说的。
SD、VD说的可能是命名方式。

1 个赞

建议先确认下磁盘类型,如果是NVMe SSD,改成none确实能减少一层调度开销,性能会好一些。但如果是普通SATA/SAS SSD,mq-deadline其实也够用,差距不大。

改的话可以这样:

echo none > /sys/block/sdb/queue/scheduler
echo none > /sys/block/sdc/queue/scheduler

不过要注意这是临时生效,重启就没了。

1 个赞

官方文档写的摸零两可,没写明白,小学生写的文档。
按官方文档说的就是sd或vd类接口硬盘统一修改为none

1 个赞

对,SSD 就改成 none:

# 先确认是 SSD(ROTA=0)
lsblk -d -o NAME,ROTA

# 临时改
echo none > /sys/block/sdb/queue/scheduler

# 永久改(写 udev 规则)
echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"' > /etc/udev/rules.d/60-iosched.rules
udevadm control --reload && udevadm trigger

机械盘就保留 mq-deadline 别改。sdc 如果是 SSD 也一起改。

2 个赞

调度模式是根据磁盘介质类型来设置的

使用某单机数据库对不同磁盘调度算法测试后的结果如下:

操作系统是UOS、镜像指的是2块ssd在操作系统层绑定raid 1。

如果是普通的sata磁盘或普通+固态缓存混合磁盘,这种设置为none不知道有没有影响,按文档的意思是统一设置为none。

tidb文档真的是写的不明不白,不敢恭维,从来也不修正错误,就像没有错误一样。

看下这句话就非常明确了:

对于固态盘统一设置为none。对于HDD盘为了性能更优,可以配置为其他调度算法,比如mq-deadline。

ssd的tidb建议none,机械盘就是deadline

混合盘 rotational 报的是 1,块层按机械盘对待,直接改 none 随机读延迟会抖. 别照文档拍脑袋,fio 跑 4k randread 比 iops 和 p99 再定。NVMe 其实只有 none 可选,真要调收益更大的是 queue/nr_requests 和 read_ahead_kb。

建议设置为none,现在数据盘普遍是SSD的,另外,sdb不是磁盘类型,只是磁盘分区。

机械盘留mq-deadline就行,none是给ssd的