我有一台 Linux 数据库 (MySQL) 服务器 (Dell 2950),带有 6 磁盘 RAID 10。其上的默认 IO 调度程序是 CFQ。但是,从我所读和所听到的来看,当重新排序/调度也由底层 RAID 控制器完成时,不需要像 CFQ 这样的调度程序;相反,由于它没有考虑底层 RAID 配置,因此使用 CFQ 的性能实际上可能会降低。主要关注的是降低 CPU 使用率并提高吞吐量。此外,我看到有人建议对数据库使用 noop/deadline IO 调度程序,主要是因为它们的 R/W 访问性质。
因此,问题是在这些情况下是否应该使用 noop 或 deadline 调度程序来代替 CFQ。
答案1
每个工作负载都不同。因此,这个问题没有一个万能的答案。为了使事情变得更加复杂,大多数 IO 调度程序都有可调参数。因此,您能做的最好的事情就是尽可能接近实际工作负载基准进行测试。只要您的测试可重复,它就应该有效。
您可以即时更改 IO 调度程序,而无需重新启动,这使得使用 IO 调度程序进行实验变得容易。为此,请使用如下命令将预期替换为所选调度程序,将 sdb 替换为正确的块设备。如果您以 root 身份登录,echo anticipatory | sudo tee /sys/block/sdb/queue/scheduler
也可以这样做。我使用 tee 方法,这样我就可以使用 sudo。echo anticipatory > /sys/block/sdb/queue/scheduler
和 minaev 一样,我在繁忙的文件服务器上使用 Deadline 时也非常幸运。我们没有任何数据库,因为它主要是使用计算集群进行图像处理。但它们会占用 2 GigE 链接,并一次加载该服务器 48 小时。
我也曾在处理外部 RAID 阵列时使用过 NOOP。我所说的外部是指 RAID 控制器包含在外部机箱中,服务器只是将其视为 SCSI 驱动器。如果 RAID 控制器在服务器中,那么我认为您仍然希望避免 NOOP。但您应该能够通过一些基准测试找出最适合您的方法。
答案2
不确定是否有帮助,但这是来自 Red Hat Magazine 的一篇有趣的文章:“为 Red Hat® Enterprise Linux® 4 和 2.6 内核选择 I/O 调度程序”。我通常将调度程序设置为截止期限,它在我的服务器上运行良好,但我不得不承认,我没有数据可以证明截止期限确实更好。