第 5 章 优化 LVM-VDO 性能
VDO 内核驱动程序使用多个线程加快任务。它将 I/O 请求分为较小的部分,这些部分由不同的线程处理,这些部分相互通信。这允许一个线程在没有频繁锁定和解锁的情况下有效地管理共享数据。
当一个线程完成一个任务时,VDO 已经为其准备好了另一项任务。这会保持线程忙碌,并减少了切换任务所花费的时间。VDO 还对较慢的任务使用单独的线程。这包括在队列或处理消息到重复数据删除索引中添加 I/O 操作。
5.1. VDO 线程类型 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
VDO 使用各种线程类型来处理特定的操作,包括 I/O 处理、压缩、重复数据删除和其他存储管理任务。
以下是 VDO 使用的线程类型:
- 逻辑区域线程(
vdo:logQ) - 维护提供给 VDO 设备用户的逻辑块号(LBN)之间的映射。另外,在底层存储系统中映射物理块号(PBN)。它们还阻止对同一块的并发写。逻辑线程在读和写操作过程中处于活动状态。处理通常是平均分布的,但特定的访问模式偶尔可能会将工作集中在一个线程上。例如,频繁访问特定块映射页中的 LBN 可能会导致一个逻辑线程处理所有这些操作。
- 物理区域线程(
vdo:physQ) - 在写操作过程中处理数据块分配和引用计数。
- I/O 提交线程(
vdo:bioQ) -
处理从 VDO 到存储系统的块 I/O (
bio)操作的传输。它们处理来自其他 VDO 线程的 I/O 请求,并将它们传递给底层设备驱动程序。这些线程与设备相关的数据结构交互,并为设备驱动程序内核线程创建请求。当 I/O 请求因为完整设备请求队列被阻止时,它们可防止延迟。 - CPU 处理线程(
vdo:cpuQ) - 处理不阻止或需要对其他线程类型管理的数据结构进行独占访问的 CPU 密集型任务。这些任务包括计算哈希值和压缩数据块。
- I/O 确认线程(
vdo:ackQ) - 表示到更高级别组件的 I/O 请求完成,如内核页缓存或应用程序线程执行直接 I/O。其 CPU 使用率和对内存争用的影响受到内核级代码的影响。
- 哈希区域线程(
vdo:hashQ) - 将 I/O 请求与匹配哈希进行协调,以处理潜在的去重任务。虽然它们创建并管理去重请求,但它们不会执行大量计算。单个哈希区线程通常就足够了。
- 去重线程 (
vdo:dupeQ) - 处理 I/O 请求并与去重索引进行通信。这个工作在单独的线程上执行,以防止阻塞。如果索引没有快速响应,它还有一个跳过去重的超时机制。每个 VDO 设备只有一个去重线程。
- 日志线程(
vdo:journalQ) - 更新恢复日志并为写调度日志块。此任务不能划分到多个线程中。每个 VDO 设备只有一个日志线程。
- 封装器线程 (
vdo:packerQ) - 启用压缩时,写操作过程中的工作。它从 CPU 线程收集压缩的数据块,以减少浪费的空间。每个 VDO 设备只有一个 packer 线程。