Linux系统I/O调度器对磁盘I/O性能至关重要,本文通过vi编辑器详细讲解实践修改流程:首先使用lsblk或fdisk -l确认目标设备(如sda),再通过cat /sys/block/sda/queue/scheduler查看当前调度器(默认cfq/noop/deadline等),执行vi /sys/block/sda/queue/scheduler进入编辑模式,将光标定位至目标调度器(如deadline),按x删除其他选项,保留目标值后按:wq保存,需root权限操作,修改后可通过cat命令验证生效,不同场景(如SSD/机械硬盘)需选择合适调度器以优化读写性能。
在Linux系统中,I/O调度器是内核管理块设备(如硬盘、SSD)I/O请求的核心组件,它负责对磁盘读写请求进行排序、合并和调度,以优化磁盘访问效率,减少寻址时间,提升系统整体性能,不同的I/O调度器适用于不同的硬件场景(如机械硬盘HDD、固态硬盘SSD或虚拟化环境),因此根据实际需求修改I/O调度器是Linux系统优化的重要环节,本文将详细介绍如何使用vi编辑器永久修改Linux系统的I/O调度器,涵盖原理、步骤及注意事项。
Linux I/O调度器简介
Linux内核提供了多种I/O调度器,每种调度器的设计目标和工作机制不同,主要分为以下几类(以较新内核版本为例):
noop(No Operation)
- 特点:最简单的调度器,仅按请求顺序直接提交给磁盘,不进行额外排序或合并。
- 适用场景:SSD、虚拟化环境(如KVM、VMware)或内存存储设备(如RAM disk),因为这些设备的寻址时间极短,复杂调度反而可能增加延迟。
deadline
- 特点:在保证请求顺序的同时,为每个I/O请求设置超时时间(deadline),避免“饿死”现象(即某些请求因长时间等待而超时)。
- 适用场景:机械硬盘(HDD),尤其是随机读写较多的场景,能有效平衡延迟和吞吐量。
mq-deadline(Multi-Queue Deadline)
- 特点:deadline的多队列版本,支持多核CPU并发处理I/O请求,通过分离读写队列和按进程/线程分类请求,提升多核系统性能。
- 适用场景:多核CPU+SSD/HDD的现代服务器或高性能桌面系统。
bfq(Budget Fair Queueing)
- 特点:基于时间片的公平调度器,为每个进程分配独立的I/O带宽,确保进程间的I/O公平性,尤其适合交互式应用(如桌面系统)。
- 适用场景:桌面Linux发行版(如Ubuntu、Fedora)或多任务场景,避免某个进程占用过多磁盘资源导致卡顿。
修改I/O调度器的核心思路
修改Linux系统I/O调度器有两种方式:临时修改(立即生效,重启后失效)和永久修改(通过配置文件实现,重启后仍生效),本文重点介绍通过vi编辑器实现永久修改,其核心原理是通过修改内核启动参数(grub配置),让系统在启动时加载指定的I/O调度器。

使用vi编辑器修改I/O调度器的详细步骤
步骤1:确认当前系统I/O调度器
在修改前,需先查看当前系统使用的I/O调度器,对于块设备(如/dev/sda、/dev/nvme0n1),可通过以下命令查看:
cat /sys/block/sda/queue/scheduler
(注:sda为示例磁盘设备名,实际使用时需替换为目标磁盘,可通过lsblk或fdisk -l查看磁盘列表。)
执行后,输出类似内容:
noop deadline [mq-deadline] bfq
方括号[]中的即为当前激活的I/O调度器(如mq-deadline)。
步骤2:选择目标I/O调度器
根据硬件场景选择合适的调度器(如SSD选noop或mq-deadline,HDD选deadline或bfq),本文以将调度器修改为deadline为例。
步骤3:使用vi编辑器修改grub配置文件
永久修改I/O调度器需通过修改grub(GRand Unified Bootloader)的配置文件,将调度器参数添加到内核启动命令中,不同Linux发行版的grub配置文件位置略有差异:
- Ubuntu/Debian:
/etc/default/grub - CentOS/RHEL/Fedora:
/etc/default/grub或/etc/grub2.cfg(需根据实际版本确认)
以Ubuntu/Debian为例,使用vi编辑器打开配置文件:
sudo vi /etc/default/grub
步骤4:定位并修改内核启动参数
在/etc/default/grub文件中,找到GRUB_CMDLINE_LINUX_DEFAULT或GRUB_CMDLINE_LINUX行(通常为默认启动参数),在引号内添加elevator=调度器名称参数。
修改前示例(默认可能为空或包含quiet splash):
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
修改后示例(添加elevator=deadline):
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash elevator=deadline" 
