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_whitelist
和 ps_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_COMM
和 perf.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 个 cgroups
,group1
和 group2
。它将 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/cgroups
的 cgroup
层次结构匹配。在正则表达式匹配前,逗号(,
)将 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
文件中。