blk-mq 与多队列块层
这页讲的是:现代存储设备和多核机器下,块 I/O 如果还只靠单一队列慢慢排,会很容易在锁竞争、队列争用和并行度上吃亏。学这页的重点,是理解 blk-mq 不是简单“多开几个队列”,而是让块层更贴近现代硬件并发形态的一次重新组织。
这块是什么
blk-mq 与多队列块层,讲的是 Linux 怎样把块 I/O 的提交、排队和下发,从更偏单一入口的旧式组织,重构成能更好适配多核 CPU 和高并发存储设备的多队列方式。它关心的不只是“请求怎么排”,还关心“谁在排、排在哪里、怎样减少全局争抢、怎样把并行硬件喂饱”。
可以把它理解成:过去像全城货车都挤一个总调度口,现在则更像多个分拣口和多条装车通道一起工作,尽量别让所有司机都在同一扇门口排队吵架。
它负责什么
降低全局队列争用
- 多核下所有 I/O 都挤一个队列会很容易互相卡住
- 多队列能减少锁竞争和共享热点
- 让不同 CPU 或上下文不必总抢同一入口
- 把并发压力从“一个大瓶颈”拆开
更贴近现代设备并行度
- 很多现代设备本来就支持更高并发提交
- 块层需要以更现代的方式喂给设备工作
- 让软件队列和硬件队列关系更合理
- 避免老模型把新硬件喂成单线程
组织从中间对象到最终请求的推进
- bio 往下并不会凭空消失
- 它们会继续变成更靠近设备执行的请求队列元素
- 多队列层帮助把这些请求并发地整理和下发
- 让块路径既能高吞吐,也能维持秩序
为什么它不是“硬盘快了所以顺手优化一下”
| 如果想得太简单 | 会怎样 | 真正关键在哪 |
|---|
| 把 blk-mq 当成单纯性能补丁 | 会忽略它本质上在重组块层并发模型。 | 它处理的是现代多核和现代设备下的软件组织问题。 |
| 觉得队列越多越好 | 会错过多队列也必须和设备能力、完成路径、调度策略配合。 | 重点不是数量,而是匹配真实并发形态。 |
| 只盯着设备不看 CPU | 容易漏掉很多瓶颈其实先发生在软件队列争抢上。 | 块层性能常是 CPU 争用和设备并发一起决定的。 |
| 把它和请求本身混为一谈 | 会看不清“请求是什么”和“请求如何被并发组织”是两层不同问题。 | blk-mq 更偏后者:怎么排、怎么交、怎么少打架。 |
关键概念
| 概念 | 现在怎么理解 |
|---|
| blk-mq | 面向现代多核和高并发设备的块层多队列组织方式。 |
| 软件队列 / 硬件队列 | 前者更偏内核内部并发整理,后者更贴近设备实际提交通道。 |
| 锁竞争 | 所有路径都抢同一队列和同一把锁时,多核优势会被自己人抵消。 |
| 完成路径 | 请求发出去之后还要高效地把完成结果收回来并通知上层。 |
| 并发匹配 | 块层软件结构要尽量贴合设备真实能并行处理的能力。 |
为什么重要
- 它解释了为什么现代块 I/O 性能问题不只是设备快不快,还取决于块层软件模型能不能承住并发。
- 很多 NVMe 一类设备的优势,只有块层并发组织也跟上时才真正能发挥出来。
- 理解这层后,你会更容易把 bio、请求队列、设备并发和完成路径接成一张更现代的图。
- 它让你看到:系统性能不是靠某一层单独升级,而是整条提交路径的组织方式一起升级。
常见误解
- 误解一:blk-mq 就是把一个队列改成多个队列。实际上它牵涉的是整个块层并发组织思路。
- 误解二:多队列只对极快设备有意义。实际上多核机器上的软件争用本身就值得认真处理。
- 误解三:只要设备支持并行,块层自然就能用好。实际上软件路径本身可能先把自己卡死。
它不负责什么
- 它不替代上层 I/O 来源;文件系统、页缓存、写回仍然是请求从哪里来的问题。
- 它不定义具体文件语义,也不直接决定脏页何时产生。
- 它不单独解释所有存储抖动;写回节奏、回收压力、设备特性仍会一起影响最终表现。
和其他模块的关系
| 相关模块 | 关系 |
|---|
| bio 与块 I/O 组织单元 | 那页更偏“先把 I/O 意图装起来”,这页更偏“装好以后怎样高并发地排和交”。 |
| 块层与 I/O 路径 | 这是那张总览图里最靠近现代设备并发组织的细分主题之一。 |
| writeback | 大量脏页回写推下来的 I/O,最终也要沿着这类多队列路径被组织和下发。 |
| 调度器 / 并发控制 | 多核提交、完成中断、队列争用和唤醒路径,本身就是高度并发的系统行为。 |
读完这页后,你应该能回答
- 为什么现代块层需要 blk-mq 这种更贴近多核和高并发设备的组织方式?
- 为什么块 I/O 性能瓶颈可能先出现在软件队列争用,而不是设备本身?
- 为什么理解 blk-mq 有助于把“上层 I/O 很多”和“设备为什么没被喂满”连起来?
后面适合继续问:软件队列和硬件队列最容易混在哪?为什么 NVMe 这类设备会把块层旧瓶颈暴露得更明显?请求发出后的完成路径为什么同样重要?