# 优化磁盘IO调度方式
## 1\. 原理
文件系统在通过驱动读写磁盘时,不会立即将读写请求发送给驱动,而是延迟执行,这样Linux内核的I/O调度器可以将多个读写请求合并为一个请求或者排序(减少机械磁盘的寻址)发送给驱动,提升性能。我们在前文介绍工具iostat时,也提到了合并的统计,这个值就是由这个过程统计获得。
目前Linux版本主要支持3种调度机制:
1. CFQ,完全公平队列调度。早期Linux 内核的默认调度算法,它给每个进程分配一个调度队列,默认以时间片和请求数限定的方式分配IO资源,以此保证每个进程的 IO 资源占用是公平的。这个算法在IO压力大,且IO主要集中在某几个进程的时候,性能不太友好。
2. DeadLine,最终期限调度。这个调度算法维护了4个队列,读队列,写队列,超时读队列和超时写队列。当内核收到一个新请求时,如果能合并就合并,如果不能合并,就会尝试排序。如果既不能合并,也没有合适的位置插入,就放到读或写队列的最后。一定时间后, I/O调度器会将读或写队列的请求分别放到超时读队列或者超时写队列。这个算法并不限制每个进程的IO资源,适合IO压力大且IO集中在某几个进程的场景,比如大数据、数据库使用HDD磁盘的场景。
3. NOOP,也叫NONE,是一种简单的FIFO调度策略。因为固态硬盘支持随机读写,所以固态硬盘可以选择这种最简单的调度策略,性能最好。
## 2.使用方法
执行以下命令查看当前的调度方式。
```
cat /sys/block/$DEVICE-NAME/queue/scheduler
noop deadline [cfq]
```
其中,“\[ \]”中即为当前使用的磁盘IO调度模式。操作系统不同,返回的值或默认值可能不同。
## 3.临时修改
如果需要修改,可以采用echo来修改。
比如执行以下命令将sda的调度模式修改为“deadline”。
```
echo none > /sys/block/sda/queue/scheduler
```
如果HPC程序并不使本地盘进行IO读写,可以跳过此步骤。
## 4.永久修改
```
#修改grub文件添加elevator=none参数
[root@localhost ~]# vim /etc/grub2.cfg
linux /vmlinuz-4.19.90-23.15.v2101.ky10.x86_64 root=/dev/mapper/klas-root ro transparent_hugepage=never crashkernel=1024M,high resume=/dev/mapper/klas-swap rd.lvm.lv=klas/root rd.lvm.lv=klas/swap video=efifb:on rhgb quiet quiet elevator=none
#重启操作系统
[root@localhost ~]# reboot
```

## 5.验证
```
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
[none] mq-deadline kyber bfq
```
- 常见问题
- 进入救援模式
- 进入单用户模式
- grub引导修复
- V10SP1-biosdevname解析
- 外设挂载和卸载
- audit关闭解决方案
- 终端无法切换
- 救援模式取数据
- 网卡更名操作
- 问题复现解决类
- xgboost复现解决步骤
- 激活类
- 麒麟服务器激活常用命令
- 服务器故障激活问题--须知
- 激活权限获得方式
- V10-SP系列服务器激活
- 银河麒麟高级服务器操作系统V7&V10激活手册
- shell脚本类
- 多网卡队列绑定CPU脚本
- 服务器健康检查脚本
- 服务安装配置类
- 银河麒麟高级服务器操作系统V10(sp1)安装手册
- LVM创建
- Chrony时间同步配置
- 搭建网络yum源
- PXE部署实施
- Man手册安装
- 部署VNC服务
- Kylin-Server-V10-SP1-0711-DNS服务单机部署文档
- 麒麟ks文件定制-封装iso文件
- iptables端口配置
- V10-SP1-aarch64安装jdk1.7
- 工具使用类
- cyclictest测试工具
- e2fsprogs工具介绍
- Logrotate工具说明
- nmon工具安装与使用
- 升、降级类
- rsyslog升级报告
- 性能优化类
- 日志轮转
- 大页内存与透明大页详解
- 优化磁盘IO调度方式
- core文件设置
- 分析报告类
- bond模式4协商不通排查
- audit内存泄露问题分析报告
- mate-indicators内核占用过高问题分析报告
- ansible问题-hostname以及lvol报错
- 关于Linux内存计算的说明
- 磁盘IO调度算法
- 硬件相关类
- 串口
- 网络相关类
- bond创建
- 在已配置好网络情况下添加路由
- 网卡配合网桥实现内网互通KVM虚拟机
- Bond模式4协商不通排查过程
- HA高可用
- kylin HA shell实践
- kylin HA概念性及shell使用
- 虚拟化
- KVM创建虚拟机(图形化操作)
- KVM创建虚拟机(命令操作)
- 容器类
- docker-runc升级
- docker基础镜像制作-服务器版
- 麒麟云平台
- USB3.0设备穿透方法(针对win10云主机穿透)
- 麒麟云平台开关机操作说明
- 技术演练
