2.9. scheduler TuneD 插件的功能


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

CPU 隔离

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

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

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

例 2.9. 隔离 CPU 2-4

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

[scheduler]
isolated_cores=2-4
ps_blacklist=.*pmd.*;.*PMD.*;^DPDK;.*qemu-kvm.*

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 文件中。

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

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

[scheduler]
isolated_cores=1,3
default_irq_smp_affinity=0,2

调度策略

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

group.groupname=rule_prio:sched:prio:affinity:regex

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

group.groupname=

sched 必须是以下之一:

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

关联性 是十六进制的 CPU 关联性。对于没有更改,使用 *

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

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

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

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

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

[scheduler]
group.kthreads=0:*:1:*:\[.*\]$
group.watchdog=0:f:99:*:\[watchdog.*\]

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

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

注意

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

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

例 2.12. 禁用动态 scheduler 功能

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

[scheduler]
runtime=0
isolated_cores=1,3

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 控制文件来隔离指定的核,并将所有匹配的进程和线程移到这个组中。如果此选项未设置,则使用 sched_setaffinity () 的经典 cpuset 关联性设置 CPU 关联性。

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

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

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

例 2.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

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

10:hugetlb:/,9:perf_event:/,8:blkio:/

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

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

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

[scheduler]
isolated_cores=1
cgroup_ps_blacklist=:/daemons\b

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

[scheduler]
isolated_cores=1
cgroup_ps_blacklist=\b8:blkio:

最近的内核将一些 sched_numa_balancing_ 内核运行时参数从 sysctl 工具管理的 /proc/sys/kernel 目录移到 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

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

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

    [sysctl]
    kernel.sched_migration_cost_ns=500000

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

    [scheduler]
    sched_migration_cost_ns=500000

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.