> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 配置调度器

Qualcomm<sup>®</sup> Linux 内核支持标准的 Linux 调度器解决方案。内核使用调度器根据 CPU 能耗为任务放置选择合适的 CPU。

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

内核基线支持标准的 Linux 调度器解决方案。内核使用[能耗感知调度（EAS）](https://docs.kernel.org/scheduler/sched-energy.html)根据 CPU 能耗为任务放置选择合适的 CPU。

EAS 覆盖了完全公平调度器（CFS）的任务唤醒均衡代码。在具有非对称 CPU 拓扑的系统中，它使用 CPU 的能耗模型（EM）和逐实体负载跟踪（PELT）信号，在唤醒均衡期间选择能效最优的目标 CPU。

有关基础调度器文档，请参阅 [Scheduler](https://docs.kernel.org/scheduler/index.html)。

## 了解 CPU 拓扑和 EAS

Qualcomm SoC 具有异构 CPU 拓扑，以 EAS 中使用的 CPU 算力（capacity）指标加以区分。

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

EAS 根据 CPU 节点中指定的 Dhrystone 每秒百万指令数（DMIPS）值以及集群支持的最大频率来构建集群的算力。

以下是 CPU 拓扑和算力的 `sysfs` 节点：

**表：CPU 拓扑和算力**

|                           **命令**                           |         **用途**        |
| :--------------------------------------------------------: | :-------------------: |
|       cat /sys/devices/system/cpu/cpu\*/cpu\_capacity      |   获取系统中每个 CPU 关联的算力。  |
| cat /sys/devices/system/cpu/cpufreq/policy\*/related\_cpus | 获取系统中与每个集群关联的 CPU 列表。 |

有关调度器如何使用 CPU 算力的更多信息，请参阅 [Capacity Aware Scheduling](https://docs.kernel.org/scheduler/sched-capacity.html)。

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

CPU 频率调节器可以在运行时更改，也可以在构建编译期间静态设置。

1. Kconfig 配置：要设置 CPU 频率调节器，请在内核 defconfig 文件中启用相应的驱动。
   要将 `PERFORMANCE` 调节器设置为默认的 CPU 频率调节器，请在 defconfig 文件中设置 `CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y`。
2. 内核命令行：要覆盖内核配置选项，请在 SoC 特定机器包含文件中的 kas 基础配置文件 `ci/base.yml` 的 `KERNEL_CMDLINE_EXTRA` 中，向内核命令行添加 `cpufreq.default_governor=performance` 参数。
   例如，在 `meta-qcom/conf/machine/include/qcom-<SoC>.inc` 文件中设置合适的 CPU 频率调节器。

## 配置 SchedUtil 调节器

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

SchedUtil CPU 频率调节器与 EAS 绑定，它尝试预测所有 CPU 接下来将运行在哪个 OPP，以估算其能耗。

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

## 配置利用率钳制（UCLAMP）

利用率钳制是一项调度器特性，允许用户空间管理任务的性能需求。

要执行钳制，请配置以下参数：

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

<Note>
  `UCLAMP_MAX > UCLAMP_MIN`
</Note>

使用 UCLAMP 影响调度器的任务放置决策。

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

例如，将不重要的（琐碎/后台/日常维护）任务钳制到较低值（较低的 `UCLAMP_MAX`），以促使调度器将任务放置在小核集群上。同样，将重要/前台/活跃任务钳制到较高值（较高的 `UCLAMP_MIN`），以促使调度器将任务放置在大核集群上。

UCLAMP 还允许调度器控制频率引导。

为满足任务的快速升频需求，请将任务钳制到较高的需求（`UCLAMP_MIN`）值。较高的钳制有助于提升集群频率，以满足任务的性能需求。

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

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

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