# 配置调度程序

Qualcomm Linux 内核支持标准的 Linux 调度器方案。内核使用调度器根据 CPU 能耗选择适合放置任务的目标 CPU。

调度器决定进程的运行顺序。调度器运行每个 CPU 的运行队列中的进程。

内核基线支持标准的 Linux 调度器方案。内核使用 [Energy Aware Scheduling (EAS)](https://www.kernel.org/doc/html/next/scheduler/sched-energy.html) 功能根据 CPU 能耗选择适合放置任务的目标 CPU。

EAS 会取代完全公平调度器 (CFS) 任务唤醒负载均衡代码。在采用非对称 CPU 拓扑的系统中，它会使用 CPU 的能量模型 (EM) 和实体负载跟踪 (PELT) 信号，在任务唤醒负载均衡期间选择节能的目标 CPU。

有关调度器的基本文档，参见 [Scheduler](https://www.kernel.org/doc/html/next/scheduler/index.html)。

## 了解 CPU 拓扑和 EAS

Qualcomm SoC 采用异构 CPU 拓扑，这些拓扑通过 EAS 中使用的 CPU 容量指标加以区分。

EAS 使用*容量*的概念来区分具有不同计算能力的 CPU。CPU 的容量表示的是相对于系统中性能最强的 CPU 而言，以最高频率运行时完成的工作量。容量值归一化至 1024 范围内（最强大 CPU/群集的容量值配置为 1024）。

EAS 根据 CPU 节点中指定的 Dhrystone 每秒百万条指令 (DMIPS) 值和群集支持的最高频率确定群集的容量。

下表列出了 CPU 拓扑和容量对应的 `sysfs` 节点：

> 
> 
> 表：CPU 拓扑和容量
> 
> 
> | 命令 | 目的 |
> | --- | --- |
> | cat /sys/devices/system/cpu/cpu*/cpu_capacity<br>    Copy to clipboard | 获取系统中每个 CPU 的相关容量。 |
> | cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus<br>    Copy to clipboard | 获取与系统中每个群集相关的 CPU 列表。 |

有关调度器如何使用 CPU 容量的详细信息，参见 [Capacity Aware Scheduling](https://www.kernel.org/doc/html/next/scheduler/sched-capacity.html)。

## 更改默认 CPU 频率调节器

CPU 频率调节器可以在 runtime 更改，也可以在编译版本编译过程中静态设置。

1. Kconfig 配置选项：要设置 CPU 频率调节器，请在内核 defconfiguration 文件中启用相应的驱动程序。

    要设置 `PERFROMANCE` 调节器作为默认 CPU 频率调节器，请在 defconfiguration 文件中设置 `CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y`。
2. 内核命令行选项：要覆盖内核配置选项，请在 `meta-qcom-hwe/conf/machine/include/qcom-<SoC>.inc` 文件中的内核命令行中添加 `cpufreq.default_governor=performance` 参数，以设置适当的 CPU 频率调节器。

## 配置实体负载跟踪

实体负载跟踪 (PELT) 是一种负载跟踪机制，用于跟踪 `sched_entities/groups/runqueues` 的负载计算。

调节 PELT 时钟乘数以满足功耗和性能要求。

命令行参数 `sched_pelt_multiplier` 允许您设置时钟乘数。时钟乘数可调节 PELT 上升/下降速度，以便优化系统功耗和性能。

半衰期越短，任务的 CPU 利用率累积得越快。这些任务被分配给性能 CPU，从而以更高的功耗实现更好的性能。此外，CPU 利用率也会累积起来，以便在更短的时间内选择更高的 CPU 频率。

Note

半衰期还会影响任务利用率的下降方式。UTIL EST 功能可加快下降速度。

### PELT 乘数

在 Linux 内核中，PELT 半衰期乘数会影响系统如何适应不断变化的工作负载，并根据历史利用率数据调整 CPU 频率。该配置可加快 PELT 时钟并缩短半衰期，从而加快系统响应速度。

通过内核命令行参数配置 PELT 乘数：

`kernel.sched_pelt_multiplier=[1, 2, 4] Default value: 1 (half life 32 msec), 2 (half life 16msec), 4(half life 8 msec)]`

有关 PELT 的详细信息，参见 [Per-entity load tracking](https://lwn.net/Articles/531853/)。

## 配置 SchedUtil 调速器

SchedUtil CPU 频率调节器是 Qualcomm Linux 内核中的默认调节器。SchedUtil 根据 CPU 利用率预测最佳工作点 (OPP)，从而在频率请求与能耗预测之间保持一致。

SchedUtil CPU 频率调节器与 EAS 相关联，它试图预测所有 CPU 下一步将在哪个 OPP 下运行以估算它们的能耗。

有关更多信息，请参阅 [SchedUtil](https://www.kernel.org/doc/html/next/scheduler/schedutil.html)。

## 配置利用率限制 (UCLAMP)

利用率限制是调度器的一个功能，允许用户空间管理任务的性能要求。

要执行限制操作，请配置以下参数：

- `UCLAMP_MIN`：如果设置为任意值 `> 0`，则任务需求将始终大于或等于该值。如果实际任务需求大于此值，则使用实际需求信号，但如果实际任务需求小于此值，则将 `UCLAMP_MIN` 报告为任务需求。
- `UCLAMP_MAX`：如果设置为任意值 `> 0`，则任务需求将始终小于或等于该值。如果实际任务需求小于该值，则使用实际需求信号；但如果实际任务需求大于该值，则将 `UCLAMP_MAX` 作为任务需求报告。

Note

`UCLAMP_MAX > UCLAMP_MIN`

使用 UCLAMP 影响调度器的任务分配决策。

在异构系统中，调度器使用任务需求或利用率信号（PELT 信号）将任务分类为小任务或大任务。根据任务分类的输入，调度器会选择较小（计算能力较低）或较大（计算能力较高）的 CPU 核心进行任务放置，这可能会对功耗产生影响。

例如，将非重要（琐碎/后台/综合管理）任务限制为较低的值 (`lower UCLAMP_MAX`)，从而促使调度器将任务分配到小群集。同样，将重要/前台/活动任务限制为较高的值 (`higher UCLAMP_MIN`)，从而促使调度器将任务分配到大群集。

UCLAMP 还允许通过调度器控制频率指导。

要满足任务的快速频率上升需求，可将任务限制为较高的需求 (`UCLAMP_MIN`) 值。更高的限制有助于提升群集的频率，以满足任务的性能要求。

UCLAMP 操作允许从用户空间对任务/任务组进行性能管理。

UCLAMP 允许放置任务或任务组，并允许性能提示或约束。此机制用于影响调度器放置决策或影响群集的频率指导。

有关更多信息，请参阅 [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html)。有关接口和配置的更多信息，请参见 [Utilization Clamping](https://www.kernel.org/doc/html/v6.6/scheduler/sched-util-clamp.html)。

Last Published: Jul 22, 2025

[Previous Topic
配置和管理内存](https://docs.qualcomm.com/bundle/publicresource/80-70020-3SC/topics/memory.md) [Next Topic
配置动态电压和频率调节 (DVFS) 调速器](https://docs.qualcomm.com/bundle/publicresource/80-70020-3SC/topics/dynamic-clock-and-voltage-scaling-dcvs.md)