了解 CPU 调度器
CPU 调度器管理 CPU 时间在 Linux 系统上运行的进程之间的分配方式。 CPU 调度器使用由 Linux 内核提供的 An earliest eligible virtual deadline first (EEVDF) CPU scheduler for Linux。EEVDF CPU 调度器使用 Per-entity load tracking [LWN.net] 来监控任务负载。 利用率钳制(UCLAMP 或 util clamp)是一种帮助管理任务性能需求的调度器功能。 更多信息请参见定制 CPU 调度器。了解 CPU 频率调节器
CPU 频率调节器根据任务负载调整 CPU 频率。CPU 调度器为此过程提供必要的输入。 Qualcomm Linux 使用由 Linux 内核提供的schedutil 调节器。
当系统负载较重时,此调节器会提高 CPU 频率;当负载较低时则降低频率,从而确保功耗与性能之间的最佳平衡。
更多信息请参见以下内容:
了解 DVFS 调节器
DVFS 调节器根据系统工作负载控制 CPU 缓存(L3)、末级缓存控制器(LLCC)和 DDR 的频率。 这些调节器在工作负载高时提高频率,在工作负载低时降低频率,确保功耗与性能之间的最佳平衡。 Qualcomm Linux 为 L3 缓存支持以下两种类型的 DVFS 调节器:- LLCC
- DDR
配置静态映射 DVFS 调节器
此调节器将 CPU L3 缓存和 DDR 的频率与当前 CPU 频率对齐,以平衡功耗和性能需求。 例如,如果 CPU 频率处于最大值,则 L3 缓存和 DDR 频率也必须处于最高水平。 静态映射位于源代码的arch/arm64/boot/dts/qcom/<target>.dtsi 中。
有关定制选项,请参见定制静态映射 DVFS 调节器。
了解 BWMON 调节器
带宽监控(BWMON)调节器根据测量到的从 CPU 到 LLCC 再到 DDR 的流量,动态调整 LLCC 和 DDR 的频率。 BWMON 硬件模块负责测量此流量。它在指定的采样窗口内监控内存与其他子系统之间的数据吞吐量,并利用这些信息来调节 LLCC 和 DDR 频率以满足所需带宽。 BWMON 调节器驱动位于源代码的drivers/soc/qcom/icc-bwmon.c 中。
更多信息请参见以下内容:
了解用户空间资源管理器
用户空间资源管理器(URM)是一个开源、轻量级且可扩展的框架,旨在从用户空间智能地管理和调配系统资源。 现代工作负载在服务器、计算、XR、移动和 IoT 等不同细分领域之间差异显著,每个用例都表现出不同的特征。有些工作负载需要高 CPU 频率,有些需要持续的 GPU 吞吐量,还有许多依赖高效的缓存或更高的内存带宽。同时,这些工作负载运行在能力、功耗范围和用户期望各不相同的各种硬件平台上。因此,统一的调优方法不足以满足此类环境中多样化的性能和功耗需求。 URM 通过提供以下能力来应对这些挑战:- 支持应用级调优
- 支持用例和工作负载级调优
- 提供信号和调优 API
了解内存管理
Qualcomm Linux 所做的所有内存分配都使用 RAM。必须对 RAM 进行管理,以满足性能需求并确保应用行为流畅。下图展示了内存分区:图:内存分区
- 系统 RAM 在非 Linux 组件和 Linux 组件之间进行分区。
- 非 Linux 部分包括一个标记为 Reserved 的大块,表示为非 Linux 操作分配的内存。
- Linux 部分在总内存(系统 RAM)下分为四个块:
- 内核静态(Kernel static)
- 内核动态(Kernel dynamic)
- 用户空间进程(User space process)
- 空闲内存(Free memory)
- 虚拟内存和按需分页的实现
- 为内核内部结构和用户空间程序分配内存
- 将文件映射到进程的地址空间
- 其他内存管理操作
配置 RAM 内存分区
下表描述了各种类型的内存分配。下表中指定的命令应在设备上运行。
了解实时(RT)内核
实时系统是一种确定性系统,要求在设定的时间内对事件做出响应。 满足以下条件的系统被归类为兼容 RT:- 不存在无界延迟。
- 可精确计算最大响应时间。
- 满足任务调度的设定标准(延迟和截止时间)。
实时支持面向内核空间进程,而非用户空间。
本节不适用于 QCS5430。
图:构建顺序
设置工作区
Qualcomm Linux 内核支持 LTS RT 内核(6.18.x),通过meta-qcom 层中 recipes-kernel/linux/linux-qcom-rt_6.18.bb 文件里的 Yocto recipe 进行维护。
有关克隆工作区并获取所有 Qualcomm Linux meta 层以使用 Qualcomm RT Linux 的更多信息,请参见 Sync。
启用 RT 内核
Qualcomm Linuxmeta-qcom 层支持 linux-qcom-rt_6.18.bb recipe,该 recipe 默认为受支持的机器获取并构建 Qualcomm Linux 内核。
meta-qcom 层在现有层之上应用更改。在内核构建期间,meta-qcom 层会根据内核版本使用 rt.config 启用 PREEMPT_RT,并允许实时配置。
- 对于 QLI.2.0,使用
linux-qcom-rt_6.18.bb。 - 对于
qcom-next,使用linux-qcom-next-rt_git.bb。
定制 RT 内核
- 如果您为 RT 内核携带了任何更改,请按如下所示在 recipe 中维护它们:
- 将补丁文件维护在
recipes-kernel/linux/linux-qcom-6.18/<your_patch_file>.patch下 - 将补丁文件附加到
recipes-kernel/linux/linux-qcom-rt_6.18.bb文件中的SRC_URI。
- 将补丁文件维护在
- 要在 RT 内核上应用任何外部配置:
- 将配置文件维护在
recipes-kernel/linux/linux-qcom-6.18/configs/<your_config>.cfgrecipe 中。 - 将配置文件附加到
recipes-kernel/linux/linux-qcom-rt_6.18.bb文件中的SRC_URI。
- 将配置文件维护在
- 要修改内核命令行,请将命令行参数添加到
meta-qcom/ci/base.yml文件中的KERNEL_CMDLINE_EXTRA变量。
为 RT 内核配置内核设置
RT 内核中使用可选和必需的内核配置。 要在 RT 内核中启用完全抢占,请使用CONFIG_PREEMPT_RT。
CONFIG_PREEMPT_RT 标志作为 linux-qcom-rt_6.18.bb recipe 中使用的 rt.config 的一部分默认启用。
以下示例展示了内核配置:
CONFIG_NO_HZ_COMMON- 启用后,为无滴答(tickless)运行配置内核基础设施。CONFIG_NO_HZ_FULL- 启用后,配置内核以避免向只有单个可运行任务的 CPU 发送调度时钟中断。CONFIG_CPUSETS- 使用CONFIG_CPUSETS配置选项启用cpuset,将 CPU 分组形成一个集合。
图:RT 内核验证
构建 RT 内核
要构建 RT 内核,请运行以下命令:- 要确保处于 KAS shell 中,请运行以下命令:
qcom-distro-kvm.yml 配置仅在 QLI 2.0 中与 KVM 一起受支持。RT 内核(PREEMPT_RT)与虚拟机管理程序(hypervisor)无关。KVM 被选为 QLI 2.0 的默认虚拟机管理程序,原因如下:- 上游社区支持 — KVM 及其驱动是主线 Linux 内核的一部分,可实现更广泛的生态系统贡献和长期支持。
- 标准 VirtIO 支持 — KVM 支持所有上游 VirtIO 设备,并兼容 QEMU 等标准 VMM。
- 开放开发 — 活跃的上游社区,开发者熟悉度更高。
xbl_config_kvm.elf 包含在生成的 qcomflash 软件包中。无需手动进行 UEFI BDS 配置。
将 kas lock 文件从 meta-qcom-releases 复制到 meta-qcom,请参见 Build a BSP image。
- 要编译 BitBake Qualcomm Linux 多媒体镜像,请运行以下命令:
调优 RT 内核
调优 RT 内核,以使设备中的 RT 任务获得确定性的延迟。 将运行 RT 任务的 CPU 核心设置为以最大运行频率运行,同时防止 CPU 频率的热缓解。例如,在空闲休眠场景中,RT 任务会因 CPU 唤醒时间延迟而面临调度延迟。当启动 RT 测试(cyclictest)时,这些优化会由 URM 自动应用。
在正常运行时不需要手动配置。 以下步骤仅供参考、调试或自定义设置使用。要在运行测试之前配置系统,请对 QCS6490、Qualcomm Dragonwing™ IQ-9075 和 Qualcomm Dragonwing™ IQ-615 开发套件执行以下操作:
- 禁用定时器迁移:
- 将
/sys/devices/virtual/workqueue/*中的所有内核工作队列亲和到 housekeeping CPU: - 将 CPU 频率调节器设置为 performance:
- 禁用 RT 计账/限流:
- 将 IRQ 亲和性设置到 housekeeping CPU:
- 禁用定时器迁移:
- 将
/sys/devices/virtual/workqueue/*中的所有内核工作队列亲和到 housekeeping CPU: - 将 CPU 频率调节器设置为 performance:
- 禁用 RT 计账/限流:
- 将 IRQ 亲和性设置到 housekeeping CPU:
meta-qcom/conf/machine/<machine-name.conf> 中添加内核命令行参数以禁用 RCU 回调(rcu_nocbs):- CPU 核心 7
- IRQ 亲和到核心 0-6
- RCU 无回调 7
测试 RT 内核
Linux 基金会 RT 测试套件中提供了一套测试。RT Linux 内核测试可获取以下信息:- RT Linux 内核的实时性能
- RT Linux 内核延迟和关键性能指标(KPI)
在 RT Linux 内核测试期间请勿重启系统,因为它需要运行超过 24 小时。
- 无负载 cyclictest:执行此测试时不添加系统负载。
- 带 stress-ng(next-generation)的 cyclictest:执行此测试时添加特定百分比的负载,以测量最坏情况下的系统延迟。
- 对 QCS6490、Qualcomm Dragonwing™ IQ-9075 和 Qualcomm Dragonwing™ IQ-615 开发套件运行以下 cyclic 测试:
- 对 Dragonwing™ IQ-8275 开发套件运行以下 cyclic 测试:
- 记录延迟。
- 设置目标 CPU 负载。定义所需的 CPU 负载百分比。如果未指定,默认负载为 60%:
- 在后台在选定的 CPU 核心上运行 stress-ng。使用 stress-ng 在核心 0、1、2、4、5、6 和 7 上施加 CPU 负载。每个实例运行一天并固定到特定的 CPU 核心:
- 运行 cyclic 延迟测试。以高优先级执行 cyclictest 来测量调度延迟。测试运行约 27.78 小时:
- 记录最坏情况延迟。
- 设置目标 CPU 负载:
- 在选定的 CPU 核心上运行 stress-ng:
- 运行 cyclic 延迟测试:
- 记录最坏情况延迟。
RT 测试结果
| 设备 | 发行版和镜像 | Cyclic 测试用例 (时长:24 小时) | 最小延迟(µs) | 平均延迟(µs) | 最大延迟(µs) |
|---|---|---|---|---|---|
| QCS6490 RT 核心:7 启动流程 - KVM | performance_linux-qcom-rt-6.18_qcom-distro-kvm 和 qcom-multimedia-image | 无负载 | 1 | 1 | 6 |
| Stress-NG | 1 | 1 | 6 | ||
| Dragonwing IQ-615 RT 核心:7 启动流程 - KVM | performance_linux-qcom-rt-6.18_qcom-distro-kvm 和 qcom-multimedia-image | 无负载 | 1 | 2 | 7 |
| Stress-NG | 1 | 2 | 9 |

