Skip to main content
定制是一个包括对系统各方面进行微调的过程,可以显著影响系统的整体性能和功耗。 可以对 CPU 调度器、CPU 频率调节器(governor)、动态电压和频率调节(DVFS)调节器、用户空间资源管理器(URM)以及内存进行微调。建议在通过大量的性能和功耗分析获得深入了解之后再进行任何调优。
任何定制都可能影响设备的功耗和性能。因此,在执行任何定制之前,务必在所有相关用例中验证其影响。

定制 CPU 调度器

您可以定制 CPU 调度器的功能,例如利用率钳制(UCLAMP 或 util clamp)调度器。 更多信息请参见了解 CPU 调度器

UCLAMP

UCLAMP 是一项调度器功能,允许用户空间管理任务的性能需求。 它是一种提示机制,帮助调度器了解任务的性能需求和限制,从而协助调度器做出明智的决策。 当使用 schedutil CPU 频率调节器时,UCLAMP 决定 CPU 频率的选择。UCLAMP 值的范围为 0 到 1024。 可以为 UCLAMP 定制以下参数:
  • sched_util_clamp_min:此参数为单个任务和任务组设置最低可接受的性能水平,确保任务即使在低需求时期也能获得足够的资源来运行。任务请求的任何 uclamp.min 值都不能超过 sched_util_clamp_min
    • 对于调度器,它充当跟踪任务使用情况的按实体负载跟踪(PELT)信号的下限。
    • 对于 CPU 频率,它指示调节器选择能够满足任务性能需求的频率,从而确保响应性和效率。Qualcomm 调优值为 1024。要设置此参数,请在设备上运行以下命令:
  • sched_util_clamp_max:此参数为单个任务和任务组设置最高可接受的性能水平。它确保任务不会消耗过多资源,从而防止资源争用和系统不稳定。任务请求的任何 uclamp.max 值都不能超过 sched_util_clamp_max
    • 对于调度器,它充当跟踪任务使用情况的 PELT 信号的上限。
    • 对于 CPU 频率,如果任务需求超过可用频率,调节器可能会调整频率以防止功耗过高。Qualcomm 调优值为 1024。要设置此参数,请在设备上运行以下命令:
  • sched_util_clamp_min_rt_default:默认情况下,实时(RT)任务始终以最高频率和最高 CPU 能力运行。此参数允许您在使用 UCLAMP 时更改 RT 任务的默认行为。它允许为 RT 任务调优最佳值,在不将其推至最大性能点的情况下提供良好的性能。这种行为可以满足系统需求,而无需一直消耗功率并运行在最大性能点。Qualcomm 调优值为 128。要设置此参数,请在设备上运行以下命令:
更多信息请参见 Utilization Clamping

定制 CPU 频率调节器

您可以使用 scaling_governor 节点配置 CPU 频率调节器以增强 CPU 性能。
包含 policy7 的命令在 QCS5430 FP1 上不受支持。
要为 Qualcomm Dragonwing IQ-9075 和 Qualcomm Dragonwing IQ-8275 定制频率调节器,请参见相应的附录。以下指南面向具有授权访问权限的许可用户:
下表中指定的命令应在设备上运行。
表:为 QCS6490、QCS5430 FP2、FP2.5、FP3 定制 CPU 频率调节器的命令
下表中指定的命令应在设备上运行。
表:为 Dragonwing IQ-615 定制 CPU 频率调节器的命令

定制 DVFS 调节器

您可以根据设备的功耗和性能需求,使用 DTSI 文件定制静态映射 DVFS 调节器和带宽监控(BWMON)调节器。

定制静态映射 DVFS 调节器

您可以根据功耗和性能需求,在源代码的 arch/arm64/boot/dts/qcom/<target>.dtsi 文件中定制 CPU 频率与 L3/DDR 频率之间的映射。 在 DTSI 文件中,每个 CPU 节点都有一个 operating-points-v2 = <&cpux_opp_table> 条目,其中 cpux_opp_table 保存了 CPU 频率与 L3 及 DDR 频率之间的静态映射。 例如,以下条目表示 CPU 0 频率运行在 300 MHz:
当 CPU 0 运行在 300 MHz 时,它会执行以下操作:
  • 向 L3 投票 9600000,即 9600000/w(其中 w = 32)= 300,000,对应 300 MHz
  • 向 DDR 投票 800000,即 800000/w(其中 w = 4)= 200,00,对应 200 MHz
在此示例中,‘w’ 表示单个周期内可写入的字节数。
  • 对于 L3,该值为 32,即每个周期一次事务,每次事务 32 字节。
  • 对于双通道 DDR,该值为 4。每个通道每个周期可执行两次事务(因为它是 DDR 内存),每次事务为 2 字节。
更多信息请参见 Generic OPP (Operating Performance Points) Bindings 这些表指定的是每通道 DDR 值。这意味着映射是在 CPU 频率与每个内存控制器通道的带宽之间进行的。
如果更改 DTSI 文件,将影响设备的功耗和性能。在更改任何节点之前,请确保在所有相关用例中验证其影响。

定制 BWMON 调节器

您可以根据功耗和性能需求,在源代码的 arch/arm64/boot/dts/qcom/<target>.dtsi 文件中,为末级缓存控制器(LLCC)和 DDR 投票定制 bwmon_opp_table 以下代码示例包含 DDR 频率级别和 LLCC 频率级别,每个级别都会根据流量转换为对 LLCC 和 DDR 的投票。 以下 DTSI 条目根据 LLCC 到 DDR 之间的 CPU 流量向 DDR 投票,对应 200 MHz。在此示例中,800000/w(其中 w = 4)等于 200000:
以下 DTSI 条目根据 CPU 与 LLCC 之间的 CPU 流量向 LLCC 投票,对应 150 MHz。在此示例中,2400000/w(其中 w = 16)等于 150000:
在这些示例中,‘w’ 表示单个周期内可写入的字节数。
  • 对于 DDR,该值为 4。每个通道每个周期可执行两次事务(DDR 内存),每次事务为 2 字节。
  • 对于 LLCC,该值为 16。

使用扩展定制 URM

URM 扩展承载 Qualcomm 芯片组特定的配置和用例特定的定制。这些扩展支持在运行时集成额外的配置和扩展模块,从而在不修改核心 URM 实现的情况下实现灵活的调优和策略定制。

定制按应用调优

针对 Qualcomm 特定芯片组的按应用调优定义在 userspace-resource-manager-extensions/Configs/PerApp.yaml 中。 以下示例代码展示了针对 GST 和 cyclic test 应用的按应用调优用法:
芯片组特定的调优配置定义在 userspace-resource-manager-extensions/Configs/<target-specific> 中。

定制信号设置

针对 Qualcomm 特定芯片组的信号配置定义在 userspace-resource-manager-extensions/Configs/SignalsConfig.yaml 配置文件中。 以下示例代码展示了应用启动时信号设置的用法:
芯片组特定的 SignalsConfig.yaml 文件位于 userspace-resource-manager-extensions/Configs/<target-specific> 下,会覆盖通用的信号调优。

定制资源配置

针对通用 Qualcomm 特定芯片组的资源配置定义在 userspace-resource-manager-extensions/Configs/ResourcesConfig.yaml 中。 以下示例代码展示了资源配置的定制:
芯片组特定的 ResourcesConfig.yaml 文件位于 userspace-resource-manager-extensions/Configs/<target-specific> 下,会覆盖通用的资源配置。

定制初始化配置

针对所有通用 Qualcomm 特定芯片组的初始化配置定义在 userspace-resource-manager-extensions/Configs/InitConfig.yaml 中。 以下示例展示了如何定制初始化配置:
芯片组特定的 InitConfig.yaml 文件位于 e-manager-extensions/Configs/<target-specific> 下。

使用自定义插件和资源扩展 URM

URM 提供了一个扩展框架,支持集成自定义资源和插件,以满足平台或用例特定的需求。 例如,以下代码段注册了自定义资源,如 0x00800000(调节器更改资源)和 0x00800002(工作队列亲和性资源)。它还实现了一个扩展,用于优化 cyclictest 应用的信号处理。
有关扩展和定制的更多信息,请参见 Userspace Resource Manager Extensions

定制内存

您可以使用 Kswapd 管理虚拟内存,使用水位线(watermark)调节系统内存,并通过内存 carveout 为特定子系统定义内存区域。

Kswapd

Kswapd 是管理虚拟内存的内核线程。当系统空闲内存不足时,Kswapd 会被激活,通过从文件缓存中识别使用频率较低的页并将其移动到交换空间(ZRAM)来回收内存。 Kswapd 执行以下操作:
  • 监控系统的内存使用情况
  • 在后台执行交换活动,以维持最佳的空闲内存水平
图:使用 Kswapd 时的 CPU 使用率与性能对比

图:使用 Kswapd 时的 CPU 使用率与性能对比

水位线(Watermark)

水位线是设置在内存参数上的阈值或限制,有助于调节系统内存的分配和使用。 表:水位线参数 更多信息请参见 Documentation for /proc/sys/vm/

内存 carveout

内存 carveout 是指内核无法寻址的特定内存区域,称为 no-map 区域。调制解调器、摄像头、aDSP、cDSP 以及 Qualcomm® 可信执行环境(TEE)/TrustZone(TZ)等特定子系统独占使用这些区域,因此 Linux 内核无法访问它们。 这些 carveout 定义在源代码的 arch/arm64/boot/dts/qcom/<target>.dtsi 中。 它们属于 reserved-memory 节点,并且可以进行配置。 以下代码展示了 cDSP、摄像头、调制解调器和 QTEE/TrustZone(TZ)子系统的 no-map 区域:
您可以根据产品需求调整保留内存 carveout 区域。这种调整可以包括移除调制解调器 carveout 区域,或减小 QTEE/TrustZone(TZ)应用内存 carveout 区域的大小。 例如,以下代码片段展示了如何禁用调制解调器内存 carveout 以优化内存:
在此代码中:
  • 0x8b800000 是调制解调器区域的基地址。
  • 0xf600000 是调制解调器区域的大小,即 246 MB。
  • 添加 status = disabled 可使该区域可供 Linux 内核使用。
以下示例代码片段展示了如何将 QTEE/TrustZone(TZ)应用的内存 carveout 大小从 28 MB(0x1c00000)减小到 20 MB(0x1400000): 修改前:
修改后:

后续步骤