理解块层、多队列和设备映射器
1. 技术要求
在深入探讨块层、多队列和设备映射器相关内容之前,除了需要具备之前了解的 Linux 操作系统概念外,还需对现代处理器和存储技术有基本的认识。有 Linux 存储管理的实践经验,将极大地提升对某些方面的理解。
本文中的命令和示例适用于任何 Linux 操作系统,如 Debian、Ubuntu、Red Hat、Fedora 等。文中会多次引用内核源代码,若想下载内核源码,可从 https://www.kernel.org 下载,代码片段基于内核 5.19.9。
2. 单请求队列的问题
操作系统需充分发挥块设备的性能。应用程序可能要在块设备的任意位置执行 I/O 操作,这就需要在多个磁盘位置进行寻道,从而延长操作时间。对于旋转的机械硬盘,频繁的随机访问不仅会降低性能,还会产生明显噪音。
虽然 Serial Advanced Technology Attachment (SATA) 等接口在现代仍有使用,但它们是机械硬盘的首选协议。内核块层的原始设计是针对机械硬盘作为主要存储介质的时代,这些传统硬盘只能处理几百个 I/O 操作每秒(IOPs)。多核处理器的兴起和硬盘技术的进步改变了这一状况,存储栈的瓶颈从物理硬件转移到了内核的软件层。
在传统设计中,内核块层处理 I/O 请求的方式有以下两种:
- 块层维护一个单请求队列(链表结构)来处理 I/O 请求,新请求插入队列尾部。在将请求交给驱动程序之前,块层会对这些请求执行合并等技术处理。
- 某些情况下,I/O 请求需绕过请求队列,直接到达设备驱动程序,这意味着请求队列中的所有处理工作都由驱动程序完成,通常会对性
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



