# 功能

Qualcomm Linux 内核包括 CPU 调度器、CPU 频率调节器、动态电压和频率调节 (DVFS) 以及内存管理等功能。本指南概述了每个功能并提供了相关参考链接。此外，Qualcomm 还添加了一项名为 PerfHAL 的功能，以增强 Qualcomm Linux 软件的性能。

## CPU 调度器

CPU 调度器用于管理 CPU 时间如何在 Linux 系统上运行的进程之间分配。

它使用 EEVDF（最早符合条件的虚拟截止时间优先）调度器，这是 Linux 内核提供的一种功能。EEVDF CPU 调度器使用 “每实体负载跟踪” (PELT) 来监测任务的负载。

如需了解更多信息，请访问：

- [An EEVDF CPU scheduler for Linux](https://lwn.net/Articles/925371/)
- [Per-entity load tracking \[LWN.net\]](https://lwn.net/Articles/531853/)

利用率限制（UCLAMP 或 util\_clamp）是一项调度器功能，可帮助管理任务的性能要求。

如需了解更多信息，请访问：

- [https://docs.kernel.org/scheduler/sched-util-clamp.html](https://docs.kernel.org/scheduler/sched-util-clamp.html)
- [定制 CPU 调度器](https://docs.qualcomm.com/doc/80-70017-10SC/topic/18-customize.html#customize-scheduler)

## CPU 频率调节器

CPU 频率调节器根据任务负载调整 CPU 频率。CPU 调度器为该进程提供必要的输入。

Qualcomm Linux 使用 Linux 内核提供的 `schedutil` 调节器功能。

该调节器可在系统承受高负载时提高频率，在负载减少时降低频率，从而确保达到功耗与性能之间的最佳平衡。

如需了解更多信息，请访问：

- [https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)
- [配置 CPU](https://docs.qualcomm.com/doc/80-70017-10SC/topic/14-configure.html#cpu)
- [定制 CPU 频率调节器](https://docs.qualcomm.com/doc/80-70017-10SC/topic/18-customize.html#cpu-frequency-governer)

## 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 调节器](https://docs.qualcomm.com/doc/80-70017-10SC/topic/18-customize.html#section-u1x-jps-51c-caharris-03-20-24-2005-37-832)。

### BWMON 调节器

带宽监控 (BWMON) 调节器根据测得的从 CPU 流向 LLCC 再流向 DDR 的流量，动态调整 LLCC 和 DDR 的频率。

BWMON 硬件模块测量此流量。该模块在指定采样窗口内监测内存与其他子系统之间的数据吞吐量，并利用这一信息来调整 LLCC 和 DDR 频率，以满足所需带宽。

BWMON 调节器驱动程序的源代码位于 `drivers/soc/qcom/icc-bwmon.c`。

如需了解更多信息，请访问：

- [\[PATCH v3 0/4\] soc/arm64: qcom: Add initial version of bwmon](https://lwn.net/ml/linux-kernel/20220531105137.110050-1-krzysztof.kozlowski@linaro.org/)
- [自定义 BWMON 调节器](https://docs.qualcomm.com/doc/80-70017-10SC/topic/18-customize.html#section-qxs-4ps-51c-caharris-03-20-24-2007-2-926)

## PerfHAL

PerfHAL 是 Qualcomm 专有的一项服务，该服务使 perflock API 可访问，从而提供附加功能。如需在短期内提高性能或降低功耗，可以使用该服务。

Perflock 可帮助修改系统行为，以管理间歇性工作负载。例如，如果特定的代码段必须在较高的 CPU 频率下运行一段时间，则可以在该代码中使用 perflock 来提高 CPU 频率。

PerfHAL 高效处理来自多个客户端的并行 perflock 请求。当有多个目标为同一个资源的请求时，PerfHAL 将这些请求聚合在一起，以达到设备所需的最佳性能水平。

当客户端的 Perflock 不再处于活动状态时，PerfHAL 会释放与该客户端关联的所有 Perflock。

### Perflock API

应用程序可以通过 Perflock API 基于具体用例调整系统参数，使之达到性能和功耗目标。

用户空间应用程序使用 `perf_lock_acq()` 和 `perf_lock_rel()` API 来请求系统可调参数在设定时段或不确定时段内的具体值。

### 获取 perflock

`perf_lock_acq()` 函数用于获取经过必要优化的 perflock。

该函数的语法如下：

`int perf_lock_acq(int handle, int duration, int list[], int numArgs)`

表： perf_lock_acq API 参数

| 参数 | 说明 |
| --- | --- |
| `handle` | 标识客户端请求。 |
| `duration` | <ul class="simple"><br><li><p>表示需要拥有 perflock 的最长超时时间（单位为毫秒）。</p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">duration</span></code> 参数可以设置为确定时间或不确定时间 <code class="docutils literal notranslate"><span class="pre">(0)</span></code>。</p><ul><br><li><p>确定型 perflock 需要通过一个正整数值来指定最大超时时间。将创建一个定时器，定时器达到定时值时便会释放 perflock</p></li><br><li><p>不确定型 perflock 将保留到客户端调用释放函数为止。请使用 <code class="code docutils literal notranslate"><span class="pre">perf_lock_rel()</span></code> 函数，以便手动释放已设置为不确定持续时间的 perflock。</p></li><br></ul><br></li><br></ul> |
| `list` | 资源操作码和值对的数组。操作码指示系统参数（资源）和设置值（级别）。 |
| `numArgs` | 列表数组中的元素数。 |

表：perf_lock_acq API 返回值和结果

| 返回值 | 结果 |
| --- | --- |
| 非零整数 | 成功 |
| -1 | 失败 |

### Perflock 释放

`perf_lock_rel()` 函数用于释放 `perf_lock_acq()` API 持有的 perflock。此功能仅用于设置为不确定时间的 perflock。该函数的语法如下：

`int perf_lock_rel(int handle)`

表： perf_lock_rel API 参数

| 参数 | 说明 |
| --- | --- |
| `handle` | <ul class="simple"><br><li><p>跟踪唯一请求</p></li><br><li><p>传递 <code class="docutils literal notranslate"><span class="pre">perf_lock_acq()</span></code> 返回的相同句柄以释放锁</p></li><br></ul> |

表：perf_lock_rel API 返回值和结果

| 返回值 | 结果 |
| --- | --- |
| 非零整数 | 成功 |
| -1 | 失败 |

### 资源操作码

Perflock 使用操作码及其相应值的组合对 perflock 资源执行特定操作。

要了解 QCS9075 和 QCS8275 支持的操作码，请参阅相应的附录。以下指南可供具有授权访问权限的许可用户使用：

- [Qualcomm Linux Performance Guide - Addendum for QCS9075](https://docs.qualcomm.com/bundle/resource/topics/80-70017-10A/overview.html)
- [Qualcomm Linux Performance Guide - Addendum for QCS8275](https://docs.qualcomm.com/bundle/resource/topics/80-70017-10B/overview.html)

下表列出了支持的操作码：

表：支持的操作码

| 操作码 | 目的 | 设备上的系统节点 |
| --- | --- | --- |
| 0x44000000 | 设置单个任务和任务组可接受的最低性能级别。 | `/proc/sys/kernel/sched_util_clamp_min` |
| 0x44004000 | 设置单个任务和任务组可接受的最高性能级别。 | `/proc/sys/kernel/sched_util_clamp_max` |
| 0x44008100 | 设置小核群集的最小频率。 | `/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq` |
| 0x44008000 | 设置大核群集的最小频率。 | `/sys/devices/system/cpu/cpufreq/policy4/scaling_min_freq` |
| 0x44008200 | 设置超大核群集的最小频率。 | `/sys/devices/system/cpu/cpufreq/policy7/scaling_min_freq` |
| 0x4400C100 | 设置小核群集的最大频率。 | `/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq` |
| 0x4400C000 | 设置大核群集的最大频率。 | `/sys/devices/system/cpu/cpufreq/policy4/scaling_max_freq` |
| 0x4400C200 | 设置超大核群集的最大频率。 | `/sys/devices/system/cpu/cpufreq/policy7/scaling_max_freq` |

以下是资源操作码的一些示例：

- 0x44008100, 1958400：这一对操作码和值表示小核群集的最小频率必须设置为 1958400 KHz。
- 0x44008100, 1958400, 0x4400C100, 2100000：这一对操作码和值表示小核群集的最小频率必须设置为 1958400 KHz。小核群集的最大频率必须设置为 2100000 KHz。

有关如何使用和调试 perflock 的更多信息，参见[自定义 perflock](https://docs.qualcomm.com/doc/80-70017-10SC/topic/18-customize.html#customize-perlocks)。

## 内存

RAM 用于 Qualcomm Linux 软件进行的所有内存分配。有效管理 RAM 对满足性能要求及确保应用程序运行顺畅至关重要。

![../../_images/partitioning-memory.png](data:image/png;base64,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)

**图：内存分区**

RAM 的某些部分独立于 Linux 系统进行管理。例如，从这些特定 RAM 分区运行的 Modem、视频和音频等固件。Linux 内核管理所有其他 RAM 分区。

Linux 内核有自己的内存管理子系统，其中包括：

- 实现虚拟内存和按需分页
- 为内核内部结构和用户空间程序分配内存
- 文件映射到进程的地址空间
- 其他内存管理操作

### RAM 内存分区

下表描述了各种类型的内存分配。

Note

应在设备上运行下表中指定的命令。

| RAM 分类 | 内存段 | 分配类型 | 说明 |
| --- | --- | --- | --- |
| 非 Linux | – | – | <ul class="simple"><br><li><p>内存以 carveout 的形式由 Linux 以外的各种子系统保留.</p></li><br><li><p>这些 carveout  在相应 DTSI 文件中指定。</p></li><br></ul> |
| Linux（系统 RAM） | 静态内核 | Vmlinux + 内核页结构 | <ul><br><li><p>内核在启动时保留该内存供自己使用。</p></li><br><li><p>Vmlinux 内存用于存储 vmlinux 镜像。</p></li><br><li><p>Vmlinux 镜像的大小和细分情况，可以从启动时的 <code class="docutils literal notranslate"><span class="pre">dmesg</span></code> 日志中获取：</p><br><div class="screenoutput docutils container"><br><p>Memory: 3061872K/4134912K available (28800K kernel code, 2090K rwdata, 10688K rodata, 3072K init, 969K bss, 679824K reserved, 393216K cma-reserved)</p><br></div><br><div class="screenoutput docutils container"><br><p>Kernel code + rwdata + rodata+init +bss indicates vmlinux kernel image size (28800k+2090k+10688k+3072k+969k)</p><br></div><br></li><br><li><p>内核页结构是内核在维护每一个 RAM 页的结构时所使用的内存。其计算方法为每 GB RAM 为 16 MB。</p></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | Slab | <ul><br><li><p>Slab 由内核使用，旨在提高常用数据结构使用内存的速度和效率。</p></li><br><li><p>请运行以下命令，以便了解 slab 的内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i slab<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br><li><p>要了解各种 slab 的分解及用法，可在内核配置中启用 <code class="docutils literal notranslate"><span class="pre">CONFIG_SLUB_DEBUG</span></code>，然后运行以下命令：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/slabinfo<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | 内核堆栈 | <ul><br><li><p>内核堆栈存储每个进程的调用堆栈。</p></li><br><li><p>请运行以下命令，以便了解内核协议栈的内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i kernelstack<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | PageTables | <ul><br><li><p>内核使用内存来存储将虚拟地址映射到物理地址的 PageTables</p></li><br><li><p>请运行以下命令，以便了解页表的内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i PageTables<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | 模块 | <ul><br><li><p>以内核模块的形式表示动态加载到内核中的内核实体。</p></li><br><li><p>要显示已加载内核模块的列表及其内存使用情况，可运行以下命令：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/modules<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | Vmalloc | <ul><br><li><p>用于分配连续内存。</p></li><br><li><p>请运行以下命令，以便了解 Vmalloc 内存分解：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/vmallocinfo<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | 缓存（内核 + 用户空间） | <ul><br><li><p>驻留在 RAM 中的由文件支持的内存量。</p></li><br><li><p>请运行以下命令，以便了解缓存内存的使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i cached<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | 缓存 | <ul><br><li><p>缓存的大小固定，包含从磁盘读取或写入磁盘的信息块。</p></li><br><li><p>请运行以下命令，以便了解缓存内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i Buffers<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 动态内核 | Shmem | <ul><br><li><p>共享内存是映射到两个或更多进程的地址空间的公共内存块。</p></li><br><li><p>请运行以下命令，以便了解共享内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i shmem<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 用户空间 | ZUSED (ZRAM) | 由 ZRAM 进行后压缩的匿名内存。 |
| Linux（系统 RAM） | 用户空间 | CMA | <ul class="simple"><br><li><p>物理连续内存通常映射到其他 IP（如视频和显示），但分配到 runtime。</p></li><br><li><p>随着使用更多的 CMA 预留，系统可以使用的可用内存会减少。只有可移动分配（例如用户空间进程分配）才能使用 CMA 保留的可用内存。但不能用于内核分配。</p></li><br></ul> |
| Linux（系统 RAM） | 用户空间 | ANON | <ul><br><li><p>用户空间应用程序使用 malloc() 或 new() 函数调用分配的内存。</p></li><br><li><p>请运行以下命令，以便了解进程的 ANON 内存分解：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/&lt;pid&gt;/smaps<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 用户空间 | ION | <ul><br><li><p>ION 内存允许在硬件 IP（如视频、摄像头和 Qualcomm Linux 软件）之间共享缓存。</p></li><br><li><p>ION 管理一个或多个内存池，这些内存池在启动时可以预留出来以防止碎片化。</p></li><br><li><p>请运行以下命令，以便了解 ION 内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>mount -t debugfs none /sys/kernel/debug<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /sys/kernel/debug/dma_buf/bufinfo | grep bytes<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 用户空间 | KGSL | <ul><br><li><p>图形驱动程序分配的内存。</p></li><br><li><p>请运行以下命令，以便了解整体内核图形支持层 (KGSL) 内存使用情况：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /sys/class/kgsl/kgsl/page_alloc<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br><li><p>请运行以下命令，以便了解进程级别分解：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /sys/class/kgsl/kgsl/proc/&lt;pid&gt;/kernel<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
| Linux（系统 RAM） | 空闲内存 | – | <ul><br><li><p>空闲内存是指尚未使用并可用于任何分配的内存。</p></li><br><li><p>请运行以下命令，以便了解可用内存：</p><br><div class="highlight-default notranslate"><div class="highlight"><pre class="pre codeblock"><code>cat /proc/meminfo | grep -i MemFree<br></code><span class="copyclip"><svg xmlns="http://www.w3.org/2000/svg" class="copyclipicon" width="25px" height="25px" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><title>Copy to clipboard</title><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg></span></pre></div><br></div><br></li><br></ul> |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |
|  |  |  |  |

## 实时内核

实时 (RT) Linux 是一个可选功能，默认情况下在 Qualcomm Linux 上不启用。可以根据产品要求启用该功能。

RT Linux 旨在为时间敏感型应用提供确切并且可预测的行为。

### 设置工作区

在 Qualcomm Linux 中，RT Linux 内核配方参考如下：

- 基本 BSP：`linux-qcom-base-rt`
- 定制 BSP：`linux-qcom-custom-rt`

Qualcomm Linux 内核提供对( LTS）RT 内核 6.6 版本的长期支持，通过源代码中以下路径的 `meta-qcom-realtime` 层中的 Yocto 配方进行维护：

- 基本 BSP：`recipes-kernel/linux/linux-kernel-base-rt_6.6.bb`
- 定制 BSP：`recipes-kernel/linux/linux-kernel-custom-rt_6.6.bb`

关于如何克隆工作区并获取所有元层以使用 Qualcomm RT Linux 内核的更多信息，请参阅[使用实时 Linux 同步和构建](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#sync-and-build-with-real-time-linux)。

### 启用 RT 内核

RT 内核是使用 RT Linux 内核配方启用的。该配方获取内核，下载抢占 RT 补丁，并将这些补丁应用于内核。它还可以通过以下配置启用可完全抢占的内核：

`CONFIG_PREEMPT_RT=y`

关于更多信息，请参阅 [Qualcomm Linux 内核指南](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-3/overview.html)。

### 验证内核类型

启动后，通过在设备上运行以下命令来验证内核类型：

uname -v
    Copy to clipboard

以下是命令的输出：

SMP PREMPT\_RT

### 测试 RT Linux 内核

RT Linux 内核测试有助于获取以下信息：

- RT Linux 内核的实时性能
- RT Linux 内核延迟和关键性能指标 (KPI)

Note

本节仅适用于 QCS6490。

Caution

确保在 RT Linux 内核测试期间系统不会重启，因为该测试大约运行超过 24 小时。

### Cyclictest

Cyclictest 工具用于对 RT Linux 内核系统进行基准测试。它用于评估实时系统的相对性能。Qualcomm Linux 编译中包含 Cyclictest 工具。关于更多详细信息，请参阅 [https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start/](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start/)。

本指南描述了以下 Cyclictest：

- 空载 Cyclictest：该测试是在不添加任何系统负载的情况下执行的。
- stress-ng (stress next generation) 和 Cyclictest 结合使用：此测试通过添加特定百分比的负载来测量最坏情况下的系统延迟。关于 stress-ng 的更多信息，请参阅 [Kernel/Reference/stress-ng - Ubuntu Wiki](https://wiki.ubuntu.com/Kernel/Reference/stress-ng/)。

#### 预设

> 
> 
> 确保在运行 Cyclictest 之前完成以下预设：

1. 配置并隔离 CPU 核心 1 至核心 3 以执行 RT 任务。用户可以根据需要配置任何其他 CPU 内核。

    例如，您可以在以下路径的源代码中配置 RT CPU：

    `layers/meta-qcom-realtime/recipes-kernel/images/linux-qcom-uki.bbappend`

    例如，CPU 配置如下：

KERNEL_CMDLINE_EXTRA:qcm6490 = "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=1-3 **isolcpus=1-3 irqaffinity=4-7** nohz_full=1-3 no-steal-acc vfio_iommu_type1.allow_unsafe_interrupts=1"
        Copy to clipboard
2. 在 RT Linux 内核上运行以下命令：

> 
> 
> echo 0 > /sys/kernel/tracing/tracing_on
>         Copy to clipboard
> 
> 
> echo E0 > /sys/devices/virtual/workqueue/kgsl-workqueue/cpumask
>         Copy to clipboard
> 
> 
> echo E0 > /sys/devices/virtual/workqueue/scsi_tmf_0/cpumask
>         Copy to clipboard
> 
> 
> echo E0 > /sys/devices/virtual/workqueue/writeback/cpumask
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state2/disable
>         Copy to clipboard
> 
> 
> echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state1/disable
>         Copy to clipboard
> 
> 
> echo 2707200 > /sys/devices/system/cpu/cpufreq/policy7/scaling_min_freq
>         Copy to clipboard
> 
> 
> echo 1958400  > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
>         Copy to clipboard
> 
> 
> echo 2400000  > /sys/devices/system/cpu/cpufreq/policy4/scaling_min_freq
>         Copy to clipboard
> 
> 
> echo performance > /sys/devices/system/cpu/cpufreq/policy7/scaling_governor
>         Copy to clipboard
> 
> 
> echo performance > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
>         Copy to clipboard
> 
> 
> echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
>         Copy to clipboard
> 
> 
> mkdir /sys/fs/cgroup/cpuset/core1-3/
>         Copy to clipboard
> 
> 
> echo 0 > /sys/fs/cgroup/cpuset/core1-3/cpuset.mems
>         Copy to clipboard
> 
> 
> echo 1-3 > /sys/fs/cgroup/cpuset/core1-3/cpuset.cpus
>         Copy to clipboard

> 
> 
> - 空载 Cyclictest
>     - 要在空载情况下运行 Cyclictest，请按照下列步骤操作：
> 
> 1. 完成[预设](https://docs.qualcomm.com/doc/80-70017-10SC/topic/2-performance-features.html#presettings)。
> 2. 运行以下命令启动 Cyclictest：
> 
> 
> 
> > 
> > 
> > cgexec -g cpuset:core1-3 cyclictest -a 1-3 -t 3 -m -l 100000000 -i 1000 -p 99 -h 800 --mainaffinity 4 --spike 100
> >         Copy to clipboard
> > 
> > 
> > 命令参数说明如下表：
> > 
> > 
> > 
> > 
> > 
> > 
> >     | 命令参数 | 说明 |
> >     | --- | --- |
> >     | `cgexec -g cpuset:core1-3` | 这部分命令使用 cgexec 在控制组 (cgroup) 中运行命令。`-g cpuset:core1-3` 指定要使用的 cgroup，在本例中为名为 `core1-3` 的 cpuset cgroup，它将执行限制为 CPU 核心 1 到 3。 |
> >     | `-a 1-3` | 此选项用于指定 Cyclictest 创建的线程的 CPU 关联性，这意味着它在 CPU 核心 1 到 3 上运行。 |
> >     | `-t 3` | 这会将线程数设置为 3。 |
> >     | `-m` | 此选项用于锁定内存，防止测试被换出到磁盘。 |
> >     | `-l 100000000` | 这会将测试循环数设置为 100,000,000。 |
> >     | `-i 1000` | 这会将测试周期之间的间隔设置为 1000 微秒（相当于1 毫秒）。 |
> >     | `-p 99` | 这会将测试线程的优先级设置为99，该优先级为实时调度中的高优先级。 |
> >     | `-h 800` | 这会将直方图大小设置为 800，用于测量延迟。 |
> >     | `--mainaffinity 4` | 这会将主线程的 CPU 关联性设置为 CPU 4 核心。 |
> >     | `--spike 100` | 此选项引入 100 微秒的尖峰来模拟负载。 |
> 3. 记录延迟。
> 
> - stress-ng 和 Cyclictest 结合使用
>     - > 
> > 
> > stress-ng 和 Cyclictest 结合使用，请按照下列步骤操作：
> 
> 
> 
> 1. 完成 [预设](https://docs.qualcomm.com/doc/80-70017-10SC/topic/2-performance-features.html#presettings)。
> 2. 打开 shell 并运行以下命令来运行 stress-ng。在以下示例命令中，CPU 负载为 60%：
> 
> 
> 
> > 
> > 
> > mkdir /tmp/temp-path
> >         Copy to clipboard
> 
> 
> 
> > 
> > 
> > stress-ng --cpu 5 --cpu-load 60 --temp-path /tmp/temp-path --sched fifo --sched-prio 1 -t 2d
> >         Copy to clipboard
> 
> 
> 
> 此过程大约需要 48 小时。在此示例中，加载了 CPU 5。
> 3. 运行以下命令在另一个终端中启动 Cyclictest，以同时运行 Cyclictest 和 stress-ng：
> 
> 
> 
> > 
> > 
> > cgexec -g cpuset:core1-3 cyclictest -a 1-3 -t 3 -m -l 100000000 -i 1000 -p 99 -h 800 --mainaffinity 4 --spike 100
> >         Copy to clipboard
> 4. 按 Ctrl + C 停止 stress-ng。
> 5. 记录最坏情况下的延迟。

### RT Linux 内核关键性能指标

下表对 Cyclictest KPI 进行了描述

> 
> 
> 空载 Cyclictest 的 KPI
> 
> 
> | RT 核心 | 核心 1 | 核心 2 | 核心 3 |
> | --- | --- | --- | --- |
> | 最小延迟（以微秒为单位） | 00008 | 00009 | 00009 |
> | 最大延迟（以微秒为单位） | 00061 | 00019 | 00040 |
> 
> 
> 
> 
> strss-ng 和 Cyclictest 结合使用的 KPI
> 
> 
> | RT 核心 | 核心 1 | 核心 2 | 核心 3 |
> | --- | --- | --- | --- |
> | 最小延迟（以微秒为单位） | 00008 | 00009 | 00009 |
> | 最大延迟（以微秒为单位） | 00055 | 00037 | 00027 |

Last Published: Jan 22, 2025

[Previous Topic
入门指南](https://docs.qualcomm.com/bundle/publicresource/80-70017-10SC/topics/get-started.md) [Next Topic
分析工具](https://docs.qualcomm.com/bundle/publicresource/80-70017-10SC/topics/13-performance_tools.md)

Source: [https://docs.qualcomm.com/doc/80-70017-10SC/topic/2-performance-features.html](https://docs.qualcomm.com/doc/80-70017-10SC/topic/2-performance-features.html)