6.3. 重新分发 VDO 线程
在处理请求时,VDO 对不同的任务使用各种线程池。最佳性能依赖于在每个池中设置正确的线程数,这因可用的存储、CPU 资源以及工作负载的类型而异。您可以将 VDO 分散到多个线程中,以提高 VDO 性能。
VDO 旨在通过并行性最大化性能。您可以根据可用 CPU 资源等因素和瓶颈的根本原因,通过给瓶颈任务分配更多线程来提高其性能。高线程利用率(70-80% 以上)可能会导致延迟。因此,在这种情况下增加线程数可能会有所帮助。但是,过量的线程可能会妨碍性能,并产生额外的成本。
要获得最佳性能,请执行以下操作:
- 测试具有各种预期工作负载的 VDO 来评估和优化其性能。
- 为利用率超过 50% 的池增加线程数。
- 如果总体利用率大于 50%,增加 VDO 可用的核数,即使单个线程利用率较低。
6.3.1. 在 NUMA 节点中对 VDO 线程进行分组 复制链接链接已复制到粘贴板!
跨 NUMA 节点访问内存比本地内存访问要慢。在核共享节点中的最后一个缓存的 Intel 处理器上,数据在节点间共享时的缓存问题比在单个节点中共享时更严重。虽然很多 VDO 内核线程管理专用的数据结构,但它们通常会交换有关 I/O 请求的消息。VDO 线程分散到多个节点上,或者调度程序在节点间重新分配线程可能会导致竞争,也就是多个节点竞争同一个资源。
您可以通过将同一 NUMA 节点上的某些线程进行分组来提高 VDO 性能。
- 将一个 NUMA 节点上的相关线程分组在一起
-
I/O 确认(
ackQ)线程 高级 I/O 提交线程:
- 用户模式线程处理直接 I/O
- 内核页缓存刷新线程
-
I/O 确认(
- 优化设备访问
-
如果设备访问时间因 NUMA 节点而异,请在最接近存储设备控制器的节点上运行
bioQ线程
-
如果设备访问时间因 NUMA 节点而异,请在最接近存储设备控制器的节点上运行
- 最小化争用
-
在与
logQ或physQ线程相同的节点上运行 I/O 提交和存储设备中断处理。 - 在同一节点上运行其他与 VDO 相关的工作。
-
如果一个节点无法处理所有 VDO 工作,请在将线程移到其他节点时考虑内存争用。例如,将中断处理和
bioQ线程的设备移到另一个节点。
-
在与
6.3.2. 配置 CPU 亲和性 复制链接链接已复制到粘贴板!
如果调整 VDO 线程的 CPU 亲和性,您可以提高某些存储设备驱动程序上的 VDO 性能。
当存储设备驱动程序的中断(IRQ)处理程序做了大量工作,并且驱动程序不使用线程 IRQ 处理程序时,它可能会限制系统调度程序优化 VDO 性能的能力。
要获得最佳性能,请执行以下操作:
-
如果核过载,将特定的核专用于 IRQ 处理,并调整 VDO 线程亲和性。如果
%hi值比其它核高出几个百分点,则核过载。 -
避免在忙碌的 IRQ 核上运行单例 VDO 线程,如
kvdo:journalQ线程。 - 只有在单个 CPU 使用较高时,才将其他线程类型脱离忙于 IRQ 的核。
配置在系统重启后不会保留。
流程
设置 CPU 亲和性:
taskset -c <cpu-numbers> -p <process-id>
# taskset -c <cpu-numbers> -p <process-id>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<cpu-numbers>替换为逗号分隔的您要为其分配进程的 CPU 号的列表。将<process-id>替换为您要为其设置 CPU 亲和性的正在运行的进程的 ID。例 6.1. 为 CPU 核 1 和 2 上的
kvdo进程设置 CPU 亲和性for pid in `ps -eo pid,comm | grep kvdo | awk '{ print $1 }'` do taskset -c "1,2" -p $pid done# for pid in `ps -eo pid,comm | grep kvdo | awk '{ print $1 }'` do taskset -c "1,2" -p $pid doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示亲和性集合:
taskset -p <cpu-numbers> -p <process-id>
# taskset -p <cpu-numbers> -p <process-id>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
<cpu-numbers>替换为逗号分隔的您要为其分配进程的 CPU 号的列表。将<process-id>替换为您要为其设置 CPU 亲和性的正在运行的进程的 ID。