了解 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 中。
有关更多信息,请参阅以下内容:
了解 Userspace Resource Manager
Userspace Resource Manager(URM)是一个开源、轻量级且可扩展的框架,旨在从用户空间智能地管理和配置系统资源。 现代工作负载在服务器、计算、XR、移动和物联网等细分领域差异巨大,每种用例都表现出不同的特征。有些工作负载需要高 CPU 频率,有些需要持续的 GPU 吞吐量,还有许多依赖高效的缓存或更大的内存带宽。与此同时,这些工作负载运行在能力、功耗范围和用户期望各不相同的多种硬件平台上。因此,统一的调优方法不足以满足此类环境的多样化性能和功耗需求。 URM 通过提供以下能力来应对这些挑战:- 启用应用程序级调优
- 启用用例和工作负载级调优
- 提供信号和调优 API
了解内存管理
Qualcomm Linux 进行的所有内存分配都使用 RAM。必须管理 RAM 以满足性能需求并确保应用程序平稳运行。下图显示了内存分区:图:内存分区
- 系统 RAM 在非 Linux 和 Linux 组件之间进行分区。
- 非 Linux 部分包含一个标记为 Reserved(保留)的大块,表示为非 Linux 操作分配的内存。
- Linux 部分在 Memory total(系统 RAM)下分为四个块:
- 内核静态
- 内核动态
- 用户空间进程
- 空闲内存
- 虚拟内存和按需分页的实现
- 为内核内部结构和用户空间程序分配内存
- 将文件映射到进程的地址空间
- 其他内存管理操作
配置 RAM 内存分区
下表描述了各种类型的内存分配。下表中指定的命令应在设备上运行。
| RAM 分类 | 内存段 | 分配类型 | 说明 |
|---|---|---|---|
| 非 Linux | 无 | 无 | 内存由 Linux 以外的各个子系统以划出区(carveout)形式保留。这些划出区在相应的 DTSI 文件中指定。 |
| Linux(系统 RAM) | 内核静态 | Vmlinux + 内核页结构 | 内核在引导时为自身使用保留此内存。Vmlinux 是用于存储 vmlinux 镜像的内存。vmlinux 镜像的大小和明细可以在引导时从 dmesg 日志中获取。内核页结构内存按每 GB RAM 大小 16 MB 计算。 |
| 内核动态 | Slab |
| |
| 内核栈 | 内核栈存储每个进程的调用栈。 | ||
| PageTables | 内核使用内存来存储将虚拟地址映射到物理地址的 PageTables。 | ||
| 模块 | 表示作为内核模块动态加载的内核实体。 | ||
| Vmalloc | 用于分配连续内存。 | ||
| 缓存(内核 + 用户空间) | 驻留在 RAM 中的文件支持内存量。 | ||
| 缓冲区 | 包含从磁盘读取或写入磁盘的信息块的固定大小缓冲区。 | ||
| Shmem | 映射到两个或多个进程地址空间的共享内存。 | ||
| 用户空间 | ZUSED(ZRAM) | 经 ZRAM 压缩后的匿名内存。 | |
| CMA | 通常映射到视频和显示等硬件 IP 但在运行时分配的连续物理内存。只有可移动分配(例如用户空间进程分配)可以使用 CMA 空闲内存;内核分配不能使用。 | ||
| ANON | 用户空间应用程序使用 malloc() 或 new() 分配的内存。 | ||
| ION |
| ||
| KGSL |
| ||
| 空闲内存 | 无 | 无 | 可用于任何分配的空闲内存。 |
了解实时(RT)内核
实时系统是一种确定性系统,要求在设定的时间内对事件做出响应。 如果满足以下条件,系统即被归类为兼容 RT:- 不存在无界延迟。
- 最大响应时间可以精确计算。
- 满足设定的任务调度标准(延迟和截止期限)。
实时支持面向内核空间进程,而非用户空间。
本节不适用于 QCS5430。
图:构建顺序
设置工作区
Qualcomm Linux 内核支持 LTS RT 内核(6.18.x),该内核通过meta-qcom 层中 recipes-kernel/linux/linux-qcom-rt_6.18.bb 文件的 Yocto 配方进行维护。
有关克隆工作区并获取所有 Qualcomm Linux meta 层以使用 Qualcomm RT Linux 的更多信息,请参阅 Sync。
启用 RT 内核
Qualcomm Linuxmeta-qcom 层支持 linux-qcom-rt_6.18.bb 配方,该配方默认为受支持的机器获取并构建 Qualcomm Linux 内核。
meta-qcom 层在现有层之上应用更改。在内核构建期间,meta-qcom 层根据内核版本使用 rt.config 启用 PREEMPT_RT,并允许实时配置。
- 对于 QLI.2.x,使用
linux-qcom-rt_6.18.bb。 - 对于
qcom-next,使用linux-qcom-next-rt_git.bb。
定制 RT 内核
- 如果您对 RT 内核有任何更改,请按如下方式在配方中维护它们:
- 将补丁文件维护在
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>.cfg配方中维护配置文件。 - 将配置文件追加到
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。
作为 linux-qcom-rt_6.18.bb 配方中使用的 rt.config 的一部分,CONFIG_PREEMPT_RT 标志默认启用。
以下示例显示了内核配置:
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)与虚拟机监控程序无关。KVM 因以下原因被选为 QLI 2.0 的默认虚拟机监控程序:- 上游社区支持 — KVM 及其驱动程序是主线 Linux 内核的一部分,可实现更广泛的生态系统贡献和长期支持。
- 标准 VirtIO 支持 — KVM 支持所有上游 VirtIO 设备,并与 QEMU 等标准 VMM 兼容。
- 开放开发 — 活跃的上游社区,开发者熟悉度更高。
xbl_config_kvm.elf 包含在生成的 qcomflash 包中。无需手动进行 UEFI BDS 配置。
将 kas 锁定文件从 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 Development Kit 执行以下操作:
- 禁用定时器迁移:
- 将
/sys/devices/virtual/workqueue/*中的所有内核工作队列亲和到管家(housekeeping)CPU: - 将 CPU 频率调速器设置为 performance:
- 禁用 RT 记账/节流:
- 将 IRQ 亲和性设置为管家 CPU:
- 禁用定时器迁移:
- 将
/sys/devices/virtual/workqueue/*中的所有内核工作队列亲和到管家 CPU: - 将 CPU 频率调速器设置为 performance:
- 禁用 RT 记账/节流:
- 将 IRQ 亲和性设置为管家 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(下一代)的 cyclictest:执行此测试时添加特定百分比的负载,以测量最坏情况下的系统延迟。
- 对 QCS6490、Qualcomm Dragonwing™ IQ-9075 和 Qualcomm Dragonwing™ IQ-615 开发套件运行以下循环测试:
- 对 Dragonwing™ IQ-8275 Development Kit 运行以下循环测试:
- 记录延迟。
- 设置目标 CPU 负载。定义所需的 CPU 负载百分比。如果未指定,默认负载为 60%:
- 在后台在选定的 CPU 核心上运行 stress-ng。使用 stress-ng 对核心 0、1、2、4、5、6 和 7 施加 CPU 负载。每个实例运行一天并固定到特定的 CPU 核心:
- 运行循环延迟测试。以高优先级执行 cyclictest 以测量调度延迟。该测试运行约 27.78 小时:
- 记录最坏情况的延迟。
- 设置目标 CPU 负载:
- 在选定的 CPU 核心上运行 stress-ng:
- 运行循环延迟测试:
- 记录最坏情况的延迟。
RT 测试结果
| 设备 | 发行版和镜像 | 循环测试用例 (持续时间: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 | ||
| Dragonwing IQ-9075 RT 核心:7 引导流程 - KVM | performance_linux-qcom-rt-6.18_qcom-distro-kvm 和 qcom-multimedia-image | 无负载 | 1 | 2 | 5 |
| Stress-NG | 1 | 2 | 5 | ||
| Dragonwing IQ-8275 RT 核心:3 引导流程 - KVM | performance_linux-qcom-rt-6.18_qcom-distro-kvm 和 qcom-multimedia-image | 无负载 | 1 | 2 | 7 |
| Stress-NG | 1 | 2 | 6 |

