第 5 章 优化 LVM-VDO 性能
VDO 内核驱动程序通过使用多个线程来加快任务。不是一个线程对 I/O 请求做所有的事情,而是将工作分成较小的部分来分配给不同的线程。这些线程在处理请求时相互通信。这样,一个线程就可以处理共享数据,而不需要不断地锁定和解锁。
当一个线程完成一个任务时,VDO 已经为其准备好了另一项任务。这会保持线程忙碌,并减少了切换任务所花费的时间。VDO 还对较慢的任务使用单独的线程,如将 I/O 操作添加到队列中,或处理到去重索引的消息。
5.1. VDO 线程类型 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
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 线程。