游乐游手机版
首页/科技数码/文章详情

Linux磁盘I/O性能优化:从调度到缓存的核心设计解析

时间:2025-12-02 14:57
Linux磁盘的I O调度是系统性能调优的一个重要组成部分,其核心目标在于根据存储设备的物理特性,合理的去规划I O请求的顺序,减少无效操作导致性能问题。 0 引言在前一篇文章中我们讲解了文件I O

Linux磁盘的I/O调度是系统性能调优的一个重要组成部分,其核心目标在于根据存储设备的物理特性,合理的去规划I/O请求的顺序,减少无效操作导致性能问题。

0.引言

在前一篇文章中我们讲解了文件I/O与流的概念,帮助大家理解了上层的抽象设计。本文将深入更为底层的实现机制,探讨Linux如何高效访问磁盘的两大关键技术:磁盘调度算法和Page Cache。我们将分别从两个维度进行分析:一是I/O调度策略的优化,二是Page Cache的如何减少I/O操作。

1.磁盘I/O调度:减少寻道时间和延迟

Linux磁盘的I/O调度是系统性能调优的一个重要组成部分,其核心目标在于根据存储设备的物理特性,合理的去规划I/O请求的顺序,减少无效操作导致性能问题。因为调度的选择涉及设备的物理特性,所以我们来看常见的两种物理存储设备,然后再来去介绍不同调度算法:

1)机械硬盘(HDD):机械硬盘是传统的硬盘,其依赖于磁头移动和盘片旋转来实现读写,其寻道时间(磁头移动)和旋转延迟(盘片旋转)是其主要耗时,所以随机I/O性能远低于顺序I/O,这就要求调度算法要通过合并、排序等方式来减少磁头的移动。

2)固态硬盘(SSD):固态硬盘是由控制单元和存储单元组成,没有机械部件,所以寻道时间几乎可以忽略不计,也就是说它有着很好的随机I/O性能,但其存在擦写次数限制,和写入放大。所以SSD的调度需要考虑合并小写入,减少CPU计算调度。

1.1 调度算法介绍(基于Linux 5.10)

调度算法可以分为单队列(全局单一队列)和多队列(多CPU/硬件队列独立),因为现代主要使用多队列模式,所以我们主要介绍多队列的调度算法,先来看整体的调度结构:

图片

整体多队列调度的初始化函数如下,后面到具体算法因其实现涉及代码比较多,我们会主要描述思路。

void elevator_init_mq(struct request_queue *q){ struct elevator_type *e; // 指向选中的I/O调度器类型结构体 int err; // 函数返回值,用于检查初始化是否成功 // 检查当前队列是否支持I/O调度器(如部分设备可能强制使用noop调度器) // 若不支持,则直接返回,不进行调度器初始化 if (!elv_support_iosched(q)) return; // 警告:若队列已注册(已完成初始化),则触发BUG_ON警告(仅调试用) // 确保调度器初始化仅在队列未注册时执行 WARN_ON_ONCE(blk_queue_registered(q)); // 若队列已关联调度器(非空),则无需重复初始化,直接返回 if (unlikely(q->elevator)) return; // 根据队列需求选择合适的I/O调度器 if (!q->required_elevator_features) { // 若队列无特殊功能需求,选择默认调度器(由内核配置或设备类型决定) e = elevator_get_default(q); } else { // 若队列有特殊功能需求(如支持层级调度、延迟控制等), // 则根据需求匹配具备对应功能的调度器 e = elevator_get_by_features(q); } // 若未找到合适的调度器(e为NULL),则退出初始化 if (!e) return; // 冻结队列:阻止新的I/O请求进入队列,确保初始化期间队列状态稳定 blk_mq_freeze_queue(q); // 暂停队列:等待队列中已有请求处理完成,避免初始化干扰正在进行的I/O blk_mq_quiesce_queue(q); // 初始化调度器:将选中的调度器(e)与队列(q)绑定,创建调度器上下文 // 该函数会为多队列的每个软件队列初始化调度器实例(如MQ-Deadline的每个队列私有数据) err = blk_mq_init_sched(q, e); // 恢复队列运行:允许队列重新接收并处理I/O请求 blk_mq_unquiesce_queue(q); // 解冻队列:完全恢复队列的正常操作 blk_mq_unfreeze_queue(q); // 检查调度器初始化是否失败 if (err) { // 打印警告信息,提示当前调度器初始化失败,将回退到"none"调度器(noop) pr_warn("\"%s\" elevator initialization failed, " "falling back to \"none\"\n", e->elevator_name); // 释放之前获取的调度器引用,避免资源泄漏 elevator_put(e); }}

1.1.1 BFQ调度

BFQ(Budget Fair Queueing)其含义为公平对待每个进程,其主要逻辑可以见下图,其中实线代表IO请求的方向,通过add方法添加到IO队列,然后使用调度器调度,由dispatch方法进行下发处理。

虚线箭头budget表示每个进程被分配的访问的最大扇区数目,其每访问一个扇区就会进行减少,一旦消耗完就会选择其他进程执行IO,当前用完的进程会被重新估算下一次的budget数量。

然后再来看Next active application selection,这是所有IO调度器的核心功能,本质就是选择出一个下一个有访问磁盘权力的队列,BFQ是从符合条件的队列中进行选择(如budget没用完的,等待时间较长的)。

图片图片

1.1.2 mq-deadLine调度

其整体逻辑如下:通过两个结构进行管理,一个用来记录磁盘位置排序(为了方便连续读取),一个按照时间排序(为了deadline优先),其为每个CPU配置一个队列,减少锁竞争,同时采用上述的双重排序策略来提高性能。

图片图片

1.1.3 kyber调度

其整体逻辑如下:在初始化阶段时创建四类请求队列(读、写、discard、other),初始化 Token 池(控制每种请求的最大并发数),并设置延迟目标(读请求优先低延迟,写请求平衡吞吐);应用请求先进入暂存队列,完成请求合并(减少 I/O 次数)和类型分类,再分别进入对应类型的分发队列;核心调度逻辑:

1)调度器按固定顺序轮询四类队列,避免某类请求长期被忽略;

2)通过Token 机制控制并发:每种请求需消耗 Token 才能被处理,Token 耗尽则队列挂起,直到请求完成释放 Token;

3)优先保障有 Token 的队列,避免无限制并发导致设备拥堵;

4)通过定期统计实际延迟来动态适应设备负载。

图片图片

1.1.4 总结比较

我们从调度器的优劣以及适用场景进行比较,同时会描述我们修改调度器的方式。

切换调度器方式如下,中间路径需要根据实际存储类型变化:

sudo echo kyber > /sys/block/hda/queue/scheduler

2.Page Cache

Page Cache是Linux用于缓存数据的核心机制,通过将磁盘数据暂存到内存中,减少磁盘IO次数,我们将从Page Cache的查看、缓存管理、读写交互以及页面回收四个部分进行介绍。

2.1 如何查看Page Cache

可以使用vmstat -n 1查看读写,其中主要信息就是cache字段,另外更为详细的信息可以使用cat/proc/meminfo查看,其部分内容如图:

图片图片

2.2 缓存管理

缓存管理主要的三个结构就是inode、page和address_space,其代表的含义和核心关联如下:

1)inode表示文件元数据,并通过i_mapping关联对应的address_space。

2)address_space是连接元数据inode和物理页page的核心,每个address_space对应一个打开的文件,根据index来找到对应页,并通过统一抽象的operations来适配不同文件系统。

3)page是物理页结构,描述实际数据信息。

图片图片

2.3 缓存交互

缓存交互可以分为读写操作,先来看读:

1)读操作,先检查缓存再实际读取,其流程图和交互图示如下:

图片图片

图片图片

2)写操作,先写缓存然后标记为脏页,异步回写,主要流程如下:

图片图片

2.4 缓存淘汰

缓存淘汰逻辑较为简单,使用的是LRU算法进行Page Cahce中页的淘汰。

3.总结

本文从两个角度来描述了IO高效的实现方式,一个是合理调度磁盘,一个是减少磁盘访问。了解了实现磁盘高效IO的思想,下一篇将会讲解特殊的优化,零拷贝技术。

来源:https://www.51cto.com/article/826903.html
上一篇回收陈震撞毁劳斯莱斯后连开3天直播,成租车行业热点 下一篇科沃斯业绩飙升:扫地机器人巨头年赚200亿,钱东奇身家翻倍
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
年国家能源局充换电服务业用电量增速48.8%
科技数码 · 2026-06-29

年国家能源局充换电服务业用电量增速48.8%

2025年全社会用电量达103682亿千瓦时,同比增长5 0%。充换电服务业用电增速高达48 8%,信息传输与软件服务业增速17 0%。第三产业和居民用电对增长贡献率合计占一半。中国成为全球首个年度用电量超10 4万亿千瓦时的国家。

追风者 GLACIER ONE 360 S25 液冷散热器新品上市 联体风扇售价429元
科技数码 · 2026-06-29

追风者 GLACIER ONE 360 S25 液冷散热器新品上市 联体风扇售价429元

追风者冰川360S25液冷散热器售价429元,三联一体风扇便捷安装,冷头小体积纯铜底座噪音18dB,风扇转速300-2000RPM、风量75CFM、静压2 96mmAq,五年质保漏液包赔。

三星Galaxy Watch8用户反馈谷歌后台组件异常
科技数码 · 2026-06-29

三星Galaxy Watch8用户反馈谷歌后台组件异常

三星GalaxyWatch8、Watch5Pro、Watch6及Watch7用户反映,GooglePlayServices后台耗电异常,电量占比最高达99 97%,远超正常水平,严重影响续航。目前故障原因不明,谷歌尚未发布官方声明。

罗永浩批苹果iOS 27创新不足 盼新CEO改进
科技数码 · 2026-06-29

罗永浩批苹果iOS 27创新不足 盼新CEO改进

罗永浩批评苹果iOS27创新不足,称仅有双iPhone同号、音量分离等数十项细节改进,认为库克时代缺乏突破性创新,股市虽好但消费者只能被迫接受挤牙膏式升级。

年国产车出口710万辆,两家车企销量破百万
科技数码 · 2026-06-29

年国产车出口710万辆,两家车企销量破百万

2025年国产汽车出口总量达710万辆,同比增长21%。奇瑞以134万辆居首,比亚迪105万辆次之,上汽乘用车出口占比60%最高,长城出口51万辆。吉利、长安等主流品牌同步增长,小鹏、零跑等新兴品牌海外拓展加速。