3.9. scheduler TuneD 插件的功能


使用 scheduler TuneD 插件控制并调优调度优先级、CPU 核隔离和进程、线程以及 IRQ 关联性。

CPU 隔离

要防止进程、线程和 IRQ 使用某些 CPU,请使用 isolated_cores 选项。它更改进程和线程关联性、IRQ 关联性,并为 IRQs 设置 default_smp_affinity 参数。

ps_whitelist 选项匹配的所有进程和线程调整了 CPU 关联性掩码,这取决于 sched_setaffinity() 系统调用的成功。ps_whitelist 正则表达式的默认设置是 .*,以匹配所有进程和线程名称。要排除某些进程和线程,请使用 ps_blacklist 选项。这个选项的值也被解释为一个正则表达式。进程和线程名称与该表达式匹配。配置文件回滚可让所有匹配的进程和线程在所有 CPU 上运行,并在配置文件应用程序之前恢复 IRQ 设置。

支持 ps_whitelistps_blacklist 选项的以 ; 分隔的多个正则表达式。转义的分号 \; 按字面处理。

例 3.9. 隔离 CPU 2-4

以下配置隔离 CPU 2-4.与 ps_blacklist 正则表达式匹配的进程和线程可以使用任何 CPU,而不考虑隔离:

[scheduler]
isolated_cores=2-4
ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*
Copy to Clipboard Toggle word wrap

IRQ SMP 关联性

/proc/irq/default_smp_affinity 文件包含一个位掩码,代表系统上所有不活跃中断请求(IRQ)源的默认目标 CPU 核。IRQ 被激活或分配后,/proc/irq/default_smp_affinity 文件中的值决定了 IRQ 的关联性位掩码。

default_irq_smp_affinity 参数控制 TuneD 写入 /proc/irq/default_smp_affinity 文件的内容。default_irq_smp_affinity 参数支持以下值和行为:

calc

isolated_cores 参数计算 /proc/irq/default_smp_affinity 文件的内容。isolated_cores 参数的倒置计算非隔离的核。

然后,非隔离内核和以前的 /proc/irq/default_smp_affinity 文件的内容的交集被写入 /proc/irq/default_smp_affinity 文件中。

如果省略了 default_irq_smp_affinity 参数,则这是默认行为。

ignore
TuneD 不修改 /proc/irq/default_smp_affinity 文件。
CPU 列表

采用单数字的形式,如 1、以逗号分隔的列表,如 1、3 或范围,如 3-5

解包 CPU 列表,并将其直接写入到 /proc/irq/default_smp_affinity 文件中。

例 3.10. 使用显式 CPU 列表设置默认 IRQ smp 关联性

以下示例使用显式 CPU 列表将默认的 IRQ SMP 关联性设置为 CPU 0 和 2:

[scheduler]
isolated_cores=1,3
default_irq_smp_affinity=0,2
Copy to Clipboard Toggle word wrap

调度策略

要为一组进程或线程调整调度策略、优先级和关联性,请使用以下语法:

group.groupname=rule_prio:sched:prio:affinity:regex
Copy to Clipboard Toggle word wrap

其中 rule_prio 定义规则的内部 TuneD 优先级。规则按优先级排序。这是继承性所需要的,以便能够重新排序之前定义的规则。应按照定义的顺序处理相同的 rule_prio 规则。但是,这依赖于 Python 解释器。要禁用 groupname 的一个继承规则,请使用:

group.groupname=
Copy to Clipboard Toggle word wrap

sched 必须是以下内容之一:

f
用于先入先出(FIFO)
b
用于批处理
r
用于循环
o
用于其他
*
用于不更改

affinity 是十六进制的 CPU 关联性。对于无变化,使用 *

prio 是调度优先级(请参阅 chrt -m)。

regex 是 Python 正则表达式。它与 ps -eo cmd 命令的输出匹配。

任何给定进程名称可以匹配多个组。在这种情况下,最后匹配的 regex 决定优先级和调度策略。

例 3.11. 设置调度策略和优先级

以下示例将调度策略和优先级设置为内核线程和 watchdog:

[scheduler]
group.kthreads=0:*:1:*:\[.*\]$
group.watchdog=0:f:99:*:\[watchdog.*\]
Copy to Clipboard Toggle word wrap

scheduler 插件使用 perf 事件循环来识别新创建的进程。默认情况下,它侦听 perf.RECORD_COMMperf.RECORD_EXIT 事件。

perf_process_fork 参数设置为 true 来告知插件也侦听 perf.RECORD_FORK 事件,意味着由 fork () 系统调用创建的子进程被处理了。

注意

处理 perf 事件可能会造成大量 CPU 开销。

可以使用调度程序 runtime 选项,并将其设置为 0 来缓解调度程序插件的 CPU 开销。这会完全禁用动态调度程序功能,并且不会对 perf 事件进行监控和操作。这样做的缺点是,进程和线程调优只在配置文件应用程序中完成。

例 3.12. 禁用动态调度程序功能

以下示例禁用了动态调度程序功能,同时也隔离了 CPU 1 和 3:

[scheduler]
runtime=0
isolated_cores=1,3
Copy to Clipboard Toggle word wrap

mmapped 缓冲用于 perf 事件。在重负载下,此缓冲区可能会溢出,因此插件可能会开始丢失事件,并且没有处理一些新创建的进程。在这种情况下,使用 perf_mmap_pages 参数来增加缓冲区大小。perf_mmap_pages 参数的值必须是 2 的幂。如果 perf_mmap_pages 参数不是手动设置的,则使用默认值 128。

使用 cgroups 限制

scheduler 插件支持使用 cgroup v1 的进程和线程限制。

cgroup_mount_point 选项指定挂载 cgroup 文件系统的路径,或者 TuneD 期望挂载它的位置。如果未设置,则期望为 /sys/fs/cgroup/cpuset

如果 cgroup_groups_init 选项被设置为 1,则TuneD 会创建和删除使用 cgroup* 选项定义的所有 cgroups。这是默认的行为。如果 cgroup_mount_point 选项设为 0,则必须由其他方法预设置 cgroups

如果 cgroup_mount_point_init 选项被设置为 1,则TuneD 会创建并删除 cgroup 挂载点。它暗示 cgroup_groups_init = 1。如果 cgroup_mount_point_init 选项被设置为 0,则必须通过其他方法预设置 cgroups 挂载点。这是默认的行为。

cgroup_for_isolated_cores 选项是 isolated_cores 选项功能的 cgroup 名称。例如,如果系统有 4 个 CPU,isolated_cores=1 表示 Tuned 将所有进程和线程移到 CPU 0、2 和 3。scheduler 插件通过将计算的 CPU 关联性写入指定 cgroup 的 cpuset.cpus 控制文件来隔离指定的核,并将所有匹配的进程和线程移到这个组中。如果此选项未设置,则经典 cpuset 关联性使用 sched_setaffinity() 设置 CPU 关联性。

cgroup.cgroup_name 选项为任意 cgroup 定义关联性。您甚至可以使用层次结构的 cgroups,但您必须以正确顺序指定层次结构。TuneD 不会在此处执行任何健全性检查,例外是它强制 cgroup 位于 cgroup_mount_point 选项指定的位置。

group 开头的调度程序选项的语法已被增强,来使用 cgroup.cgroup_name ,而不是十六进制 关联性。匹配的进程被移到 cgroup cgroup_name 中。您也可以使用不是由 cgroup. 选项定义的 cgroups,如上面所述。例如,cgroups 不由 TuneD 管理的。

通过将所有句点((.)替换为斜杠(/)来对所有 cgroup 名称进行清理。这可防止插件在 cgroup_mount_point 选项指定的位置之外写入。

例 3.13. 使用带有 scheduler 插件的 cgroup v1

以下示例创建 2 个 cgroupsgroup1group2。它将 cgroup group1 关联性设置为 CPU 2,将 cgroup group2 关联性设置为 CPU 0 和 2。假定有 4 个 CPU 设置,isolated_cores=1 选项将所有进程和线程移到 CPU 内核 0、2 和 3。由 ps_blacklist 正则表达式指定的进程和线程不会被移动。

[scheduler]
cgroup_mount_point=/sys/fs/cgroup/cpuset
cgroup_mount_point_init=1
cgroup_groups_init=1
cgroup_for_isolated_cores=group
cgroup.group1=2
cgroup.group2=0,2

group.ksoftirqd=0:f:2:cgroup.group1:ksoftirqd.*
ps_blacklist=ksoftirqd.*;rcuc.*;rcub.*;ktimersoftd.*
isolated_cores=1
Copy to Clipboard Toggle word wrap

cgroup_ps_blacklist 选项排除了属于指定 cgroup 的进程。此选项指定的正则表达式与 /proc/PID/cgroupscgroup 层次结构匹配。在正则表达式匹配前,逗号(,) 将 cgroups v1 层次结构与 /proc/PID/cgroups 分开。以下是正则表达式匹配的内容的示例:

10:hugetlb:/,9:perf_event:/,8:blkio:/
Copy to Clipboard Toggle word wrap

多个正则表达式可以用分号(;)分开。分号表示逻辑"或"运算符。

例 3.14. 使用 cgroup 从调度程序中排除进程

在以下示例中,scheduler 插件将所有进程从核 1 中移走,但属于 cgroup /daemons 的进程除外。\b 字符串是一个与单词边界匹配的正则表达式元字符。

[scheduler]
isolated_cores=1
cgroup_ps_blacklist=:/daemons\b
Copy to Clipboard Toggle word wrap

在以下示例中,scheduler 插件排除属于层次结构 ID 为 8 和 controller-list blkio 的 cgroup 的所有进程。

[scheduler]
isolated_cores=1
cgroup_ps_blacklist=\b8:blkio:
Copy to Clipboard Toggle word wrap

最近的内核将 sysctl 工具管理的 /proc/sys/kernel 目录中的一些 sched_numa_balancing_ 内核运行时参数移到了 debugfs,其通常挂载在 /sys/kernel/debug 目录下。TuneD 通过 scheduler 插件为以下参数提供了一种抽象机制,其中,根据所使用的内核,TuneD 将指定的值写到正确的位置:

  • sched_min_granularity_ns
  • sched_latency_ns,
  • sched_wakeup_granularity_ns
  • sched_tunable_scaling,
  • sched_migration_cost_ns
  • sched_nr_migrate
  • numa_balancing_scan_delay_ms
  • numa_balancing_scan_period_min_ms
  • numa_balancing_scan_period_max_ms
  • numa_balancing_scan_size_mb

    例 3.15. 为迁移决策设置任务的 "cache hot" 值。

    在旧内核中,设置以下参数意味着 sysctl 将值 500000 写到 /proc/sys/kernel/sched_migration_cost_ns 文件中:

    [sysctl]
    kernel.sched_migration_cost_ns=500000
    Copy to Clipboard Toggle word wrap

    在最新内核中,这相当于通过 scheduler 插件设置以下参数:

    [scheduler]
    sched_migration_cost_ns=500000
    Copy to Clipboard Toggle word wrap

    意味着 TuneD 将值 500000 写到 /sys/kernel/debug/sched/migration_cost_ns 文件中。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat