通过调整Linux I/O调度器优化VPS读写性能

大家都知道购买了VPS云主机后,使用自带的CentOS镜像或者Debian镜像,然后安装建站环境等,高级一点的话知道更新内核,安装BBR加速等进行VPS的性能或网络的优化。今天搬主题主要介绍一下通过调整Linux I/O调度器优化VPS读写性能。

什么是I/O调度器

目前主流的Linux发行版本一般提供以下三种I/O调度器,下面进行简单的介绍:

CFQ

CFQ全称Completely Fair Scheduler,中文名称完全公平调度器,它是目前多数Linux发行版默认使用的调度器,其由内核默认选择。CFQ将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。对于通用的服务器是最好的选择,CFQ均匀地分布对I/O带宽的访问。CFQ为每个进程和线程,单独创建一个队列来管理该进程所产生的请求,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。该算法的特点是按照I/O请求的地址进行排序,而不是按照先来后到的顺序来进行响应。简单来说就是给所有同步进程分配时间片,然后才排队访问磁盘。

DeadLine

Deadline为截止时间调度器,是对Linus Elevator的一种改进(在2.4内核中使用的第一种I/O调度器。主要作用是为每个设备维护一个查询请求,当内核收到一个新请求时,如果能合并就合并。如果不能合并,就会尝试排序。如果既不能合并,也没有合适的位置插入,就放到请求队列的最后),可以避免有些请求太长时间不能被处理,并可以区分对待读操作和写操作。Deadline分别额外为读I/O和写I/O提供了FIFO队列。
Debian9系统下,如果使用官方提供的4.16版本内核,将会同时默认启用mq-deadline,其可以并行执行I/O调度,提高执行效率。

NOOP

NOOP全称No Operation,中文名称电梯式调度器,其实现了最简单的FIFO队列,所有I/O请求大致按照先来后到的顺序进行操作。NOOP实现了一个简单的FIFO队列,像电梯的工作主法一样对I/O请求进行组织。它是基于先入先出(FIFO)队列概念的Linux内核里最简单的I/O调度器。此调度程序比较适合固态硬盘。

查看使用的I/O调度器

先查看系统支持的I/O调度器:使用命令

dmesg | grep -i scheduler

如下图

[    0.055544] rcu: RCU calculated value of scheduler-enlistment delay is 100 jiffies.
[    0.218701] io scheduler mq-deadline registered
[    0.218703] io scheduler kyber registered
[    0.218753] io scheduler bfq registered

如图,可以看到有3个调度器,分别是mq-deadline、kyber、bfq

再查看自己VPS云主机的硬盘

fdisk -l

得知自己的硬盘名称为vda,然后再查自己目前的硬盘使用的I/O调度器:

cat /sys/block/vda/queue/scheduler
[mq-deadline] kyber bfq none

结果显示,mq-deadline是此硬盘使用的I/O调度器。
注意,此命令在VPS上可能无法执行。

修改使用的I/O调度器

修改Linux的调度器十分简单,可以通过shell命令或者修改grub配置文件来达到目的。这里先说答案:

如果是VPS,硬盘是SSD的,建议把I/O调度器修改为none或mq-deadline,如果是HDD普通硬盘的话,那就改为bfq。通过下面的方法进行修改

Shell

此方法可以随时更改I/O调度器而无需重启计算机。

echo deadline > /sys/block/vda/queue/scheduler

注意,此命令在VPS上可能无法执行。

GRUB

此方法将永久修改默认的I/O调度器,与使用shell命令的临时修改不同,系统重启后,修改的调度器不会失效。 修改/etc/default/grub,在GRUB_CMDLINE_LINUX内增加:

elevator=none

保存之后执行update-grub命令,然后重启计算机即可。如果是CentOS 7的话,保存方式如下

[root@ION2 ~]# sudo readlink -e /etc/grub2.cfg
/boot/grub2/grub.cfg
[root@ION2 ~]# sudo grub2-mkconfig --output /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.16.7
Found initrd image: /boot/initramfs-5.16.7.img
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-96cdfb16f9c7495ebbd1cf755fca0865
Found initrd image: /boot/initramfs-0-rescue-96cdfb16f9c7495ebbd1cf755fca0865.img
Found linux image: /boot/vmlinuz-0-rescue-0a0a3679cc2ae8d3279cb44b6d541c79
Found initrd image: /boot/initramfs-0-rescue-0a0a3679cc2ae8d3279cb44b6d541c79.img
done

技术参考文章:

https://documentation.suse.com/zh-cn/sled/15-SP3/html/SLED-all/cha-tuning-io.html
https://www.phoronix.com/scan.php?page=article&item=linux-56-nvme&num=1

千百度
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容