三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

ARM大小核架构调度原理与RK3588嵌入式配置复习

ARM大小核架构调度原理与RK3588嵌入式配置复习

ARM大小核架构调度原理与RK3588嵌入式配置

一、ARM大小核(big.LITTLE)架构调度核心原理

1. 硬件基础:Cortex-A76 与 Cortex-A55 的异构定位

ARM big.LITTLE 架构通过两类指令集完全兼容但性能/功耗特性差异巨大的CPU核心,实现「峰值性能」与「待机能效」的动态平衡:

  • 大核(Cortex-A76):乱序执行架构,更大的L1/L2缓存(64KB L1 + 512KB L2/核),最高主频可达2.4GHz,面向CPU密集型、低延迟敏感任务,单线程性能强但功耗高。
  • 小核(Cortex-A55):顺序执行架构,精简缓存设计(32KB L1 + 128KB L2/核),最高主频1.8GHz左右,面向轻负载、后台常驻任务,能效比是大核的2~3倍。

两类核心共享L3缓存与内存总线,任务可在大小核之间无缝迁移,无软件兼容性问题。

2. 主流调度机制:从HMP到EAS

Linux内核针对异构架构经历了两代调度方案,当前嵌入式与移动端主流为EAS(Energy Aware Scheduling,能量感知调度)

(1)早期HMP调度

简单基于「集群负载阈值」做任务迁移:小核簇负载超过阈值时,把任务整体迁到大核簇;负载下降再迁回。缺点是粒度粗、迁移抖动大,无法精细平衡单任务的性能与功耗。

(2)EAS能量感知调度(当前主流)

EAS从Linux 5.4开始成为主线标准方案,核心是基于量化的能量模型,为每个任务选择「性能满足需求且功耗最低」的CPU核心,核心组件包括:

  1. 能量模型(Energy Model, EM):设备树中预置每个CPU在不同频率档位下的算力(capacity)与功耗值,调度器可精确计算「把任务放在某核某频」的能耗成本。
  2. PELT负载跟踪:按实体(进程/线程)维度统计负载,区分CPU密集型与IO密集型任务,预测任务后续的算力需求。
  3. 任务放置策略
    • 轻负载、后台任务优先放置在小核,尽可能压低功耗;
    • 当任务负载超过小核算力上限,或高优先级任务唤醒时,迁移到大核执行;
    • 负载下降后,逐步迁回小核,避免频繁切换带来的开销。
  4. schedutil调频器协同:调频策略直接对接调度器的负载信息,任务迁到大核时同步拉高频率,迁到小核时降低频率,实现调度与调频的一体化决策。

3. 嵌入式场景的能效平衡核心思路

嵌入式场景业务固定、可预测性强,相比消费电子的纯动态调度,更适合「静态分区+动态辅助」的混合模式:

  • 任务分级绑定:核心业务、实时任务绑定大核;后台守护、日志、网络等轻负载进程绑定小核,避免调度器误判。
  • 分簇精细化调频:大核簇按需冲高,小核簇锁定低频区间,减少无意义的频率波动。
  • 空闲深度休眠:低负载场景下关闭部分大核,仅保留小核运行,降低待机功耗。
  • 实时性保障:硬实时任务绑定固定大核并锁频,消除调度迁移与调频带来的延迟抖动。

二、RK3588 硬件拓扑与环境准备

1. RK3588 CPU硬件拓扑

RK3588采用4核Cortex-A55 + 4核Cortex-A76的八核设计,电源与调频按3个簇独立管理:

调频策略节点对应CPU编号核心类型典型主频范围
policy0CPU0~CPU3Cortex-A55(小核)408MHz ~ 1.8GHz
policy4CPU4~CPU5Cortex-A76(大核簇0)408MHz ~ 2.4GHz
policy6CPU6~CPU7Cortex-A76(大核簇1)408MHz ~ 2.4GHz

注:两个A76子簇共享L2缓存,可独立调频,也可合并为一个大核域统一调度。

2. 环境确认命令

先验证系统的CPU拓扑与基础能力:

# 1. 查看CPU型号与编号对应关系cat/proc/cpuinfo|grep-E"processor|part"# part 0xd05 = Cortex-A55,part 0xd0b = Cortex-A76# 2. 查看调频簇划分ls/sys/devices/system/cpu/cpufreq/# 3. 查看每个CPU的算力容量(EAS核心参数,最大值1024)cat/sys/devices/system/cpu/cpu*/cpu_capacity# 通常A55约400~500,A76约1024,代表单核算力相对值# 4. 查看当前可用调频策略cat/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors

三、RK3588 大小核调度配置分步实战

以下操作基于瑞芯微官方Linux 5.10 SDK(Debian/Ubuntu根文件系统),默认内核已开启EAS基础支持,仅需做业务适配调优。

步骤1:内核配置验证与开启EAS

瑞芯微官方SDK内核默认已启用EAS相关选项,若自行裁剪内核,需确保以下配置开启:

# 进入内核配置界面makeARCH=arm64 menuconfig

必选配置项:

CPU Power Management ---> CPU Frequency scaling ---> <*> CPU Frequency scaling <*> 'schedutil' cpufreq policy governor Default CPUFreq governor (schedutil) ---> CPU Idle ---> <*> CPU idle PM support [*] Menu governor (for tickless system) Kernel Features ---> [*] Energy Model for scheduling [*] Scheduler Energy Aware Scheduling Device Drivers ---> SOC (System On Chip) ---> Rockchip SoC support ---> [*] Rockchip CPUFreq driver

配置完成后重新编译内核并烧录到开发板。

设备树补充:RK3588的DTS中已预置cpu-energy-model节点,定义了每个频率档的功耗与算力,EAS会自动读取该数据,无需手动修改。

步骤2:CPUFreq调频策略配置

调频策略是能效平衡的基础,嵌入式场景推荐搭配schedutil调度器(EAS原生协同),再根据业务限制频率范围。

(1)全局切换为schedutil调度器
# 所有簇统一切换为schedutil(EAS推荐)echoschedutil|tee/sys/devices/system/cpu/cpufreq/policy*/scaling_governor# 验证当前策略cat/sys/devices/system/cpu/cpufreq/policy*/scaling_governor
(2)分簇设置频率上下限

根据业务场景限制频率范围,平衡性能与功耗:

# === 小核簇(A55,policy0):锁定中低频,处理后台任务 ===# 最低频率408MHz,最高限制1.2GHz(轻负载场景)echo408000>/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freqecho1200000>/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq# === 大核簇0(A76,policy4):性能优先,允许冲高 ===echo1000000>/sys/devices/system/cpu/cpufreq/policy4/scaling_min_freqecho2200000>/sys/devices/system/cpu/cpufreq/policy4/scaling_max_freq# === 大核簇1(A76,policy6):均衡模式,限制最高频降功耗 ===echo800000>/sys/devices/system/cpu/cpufreq/policy6/scaling_min_freqecho1800000>/sys/devices/system/cpu/cpufreq/policy6/scaling_max_freq
(3)极端场景:定频配置
  • 性能优先模式(如满负载AI推理):大核锁定最高频
    echoperformance|tee/sys/devices/system/cpu/cpufreq/policy4/scaling_governorechoperformance|tee/sys/devices/system/cpu/cpufreq/policy6/scaling_governor
  • 功耗优先模式(如待机值守):小核低频运行,关闭大核
    echopowersave>/sys/devices/system/cpu/cpufreq/policy0/scaling_governor

步骤3:任务CPU亲和性绑定(嵌入式核心优化)

嵌入式业务固定,通过亲和性绑定把任务固定在指定核心,比EAS动态调度更稳定、延迟更低,是工业、边缘网关场景的首选方案。

(1)单进程快速绑定:taskset
# 示例1:后台日志进程绑定到小核CPU0~CPU3taskset-c0-3 /usr/sbin/rsyslogd# 示例2:实时数据采集线程绑定到大核CPU4~CPU5taskset-c4-5 ./data_collect_daemon# 查看已有进程的CPU亲和性taskset-p<PID>
(2)批量分组管理:cpuset子系统

针对多进程业务,用cgroup的cpuset子系统做分级分组管理,实现「系统服务跑小核,核心业务跑大核」。

分步操作:

# 1. 挂载cpuset文件系统mkdir-p/sys/fs/cgroup/cpusetmount-tcgroup-ocpuset cpuset /sys/fs/cgroup/cpuset# 2. 创建后台任务分组(绑定小核)mkdir/sys/fs/cgroup/cpuset/backgroundecho0-3>/sys/fs/cgroup/cpuset/background/cpuset.cpusecho0>/sys/fs/cgroup/cpuset/background/cpuset.mems# 低优先级,允许使用的CPU份额更低echo0>/sys/fs/cgroup/cpuset/background/cpuset.cpu_exclusive# 3. 创建核心业务分组(绑定大核)mkdir/sys/fs/cgroup/cpuset/foregroundecho4-7>/sys/fs/cgroup/cpuset/foreground/cpuset.cpusecho0>/sys/fs/cgroup/cpuset/foreground/cpuset.mems# 4. 将进程移入对应分组# 后台进程移入backgroundecho<后台服务PID>>/sys/fs/cgroup/cpuset/background/cgroup.procs# 核心业务移入foregroundecho<业务进程PID>>/sys/fs/cgroup/cpuset/foreground/cgroup.procs

进阶:可再创建realtime分组,绑定单个大核并设置CPU独占,用于硬实时任务,彻底消除调度抖动。

步骤4:EAS调度参数精细化调优

通过/proc/sys/kernel下的调度参数调整EAS的迁移阈值,适配嵌入式业务特性:

# 1. 调大任务迁移成本,减少大小核之间的频繁切换(适合负载稳定的嵌入式场景)echo5000000>/proc/sys/kernel/sched_migration_cost_ns# 默认500000ns,单位纳秒# 2. 调整大核上迁阈值:负载超过小核容量的80%才迁到大核,优先用满小核性能echo80>/proc/sys/kernel/sched_upmigrate_pct# 3. 调整大核下迁阈值:负载低于大核容量的30%就迁回小核echo30>/proc/sys/kernel/sched_downmigrate_pct# 4. 开启iowait boost:IO等待后唤醒的任务临时拉高频率,提升响应速度echo1>/sys/devices/system/cpu/cpufreq/policy0/schedutil/iowait_boost_enableecho1>/sys/devices/system/cpu/cpufreq/policy4/schedutil/iowait_boost_enable

步骤5:空闲功耗与CPUIdle优化

低负载场景下,通过CPUIdle与热插拔进一步降低待机功耗:

# 1. 设置cpuidle调度器为menu(tickless模式,深度休眠)echomenu>/sys/devices/system/cpu/cpu0/cpuidle/governor# 2. 空闲时自动关闭部分大核(手动热插拔示例)# 关闭CPU6、CPU7,仅保留2个大核应对突发负载echo0>/sys/devices/system/cpu/cpu6/onlineecho0>/sys/devices/system/cpu/cpu7/online# 3. 验证当前CPU在线状态ls/sys/devices/system/cpu/online

工业场景可结合业务负载曲线,做定时热插拔策略:业务高峰期全开8核,闲时仅开2个小核值守。

步骤6:配置效果验证

(1)调度分布验证

查看任务实际运行的CPU核心,确认绑定与调度策略生效:

# 实时查看各CPU的负载与进程分布top-H# 按1键展开所有CPU核心# 用perf查看调度事件(需安装perf工具)perf sched recordsleep5perf sched latency# 查看任务调度延迟与运行CPU
(2)性能与功耗验证
  • 性能测试:用sysbench验证大小核算力差异
    # 小核单线程性能taskset-c0sysbench cpu--threads=1run# 大核单线程性能taskset-c4sysbench cpu--threads=1run
  • 功耗测试:通过直流功率计测量整机功耗,对比不同配置下的待机/满载功耗差值;也可读取RK3588内部PMU的功耗寄存器。

四、嵌入式典型场景配置示例

场景1:工业边缘网关(低功耗优先)

  • 小核0-3:运行网络协议栈、日志、配置管理、数据上报等常驻后台服务,最高频率限制1.0GHz;
  • 大核4-5:仅用于周期性数据计算、协议解析,平时处于热待机,负载触发时自动拉高频率;
  • 大核6-7:默认关闭,仅在批量升级、固件解压时临时开启。

场景2:AI视觉推理(性能优先)

  • 大核4-7:全部锁定2.0GHz以上,绑定AI推理线程与视频解码线程,保证帧率稳定;
  • 小核0-3:运行Web服务、日志、外设驱动等辅助业务,锁定800MHz低频,不占用大核资源;
  • 配合NPU调度,CPU仅做预处理与后处理,核心推理卸载到NPU,进一步降低CPU功耗。

五、注意事项

  1. 实时任务隔离:若使用PREEMPT_RT实时内核,建议通过isolcpus内核启动参数隔离大核,避免内核线程与用户态实时任务抢占资源。
  2. 散热约束:RK3588大核全核满负载时功耗较高,长时间运行需配合散热片/风扇,否则会触发温控降频。
  3. 设备树适配:自定义底板需确保电源域配置正确,否则EAS的能量模型会失准,导致调度异常。

六、补充: 查看各类 cpu 调度策略的频率

RK3588 采用三簇独立调频的硬件设计,所有频率与调度策略均通过 Linux 标准cpufreq子系统暴露在 sysfs 节点中,无需额外工具即可查看。以下按「基础信息→深度统计→实时监控」分步讲解,覆盖所有调度相关的频率维度。

6.1先明确:RK3588 调频簇划分

RK3588 的 8 个 CPU 核心分为 3 个独立调频域(同簇内核心硬件同频),对应 3 个 policy 节点:

策略节点对应核心核心类型
policy0CPU0 ~ CPU3Cortex-A55 小核簇(4核)
policy4CPU4 ~ CPU5Cortex-A76 大核簇0(2核)
policy6CPU6 ~ CPU7Cortex-A76 大核簇1(2核)

所有频率操作均以「簇」为单位,下文命令均基于这 3 个节点。


6.2 基础信息查看(原生 sysfs,无需安装工具)

1. 查看各簇当前运行频率

scaling_cur_freq表示调频调度器当前设定的运行频率,单位为 kHz。

# 小核簇当前频率cat/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq# 大核簇0当前频率cat/sys/devices/system/cpu/cpufreq/policy4/scaling_cur_freq# 大核簇1当前频率cat/sys/devices/system/cpu/cpufreq/policy6/scaling_cur_freq

批量一键查看所有簇:

forpin/sys/devices/system/cpu/cpufreq/policy*;doecho"$(basename$p):$(cat$p/scaling_cur_freq)kHz"done

输出示例:

policy0: 816000 kHz policy4: 408000 kHz policy6: 408000 kHz
2. 查看硬件支持的全部频率档位

查看当前调度器可切换的所有合法频率点(由设备树 OPP 表定义):

# 查看小核支持的频率cat/sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies# 查看大核簇0支持的频率cat/sys/devices/system/cpu/cpufreq/policy4/scaling_available_frequencies

典型输出(RK3588 官方固件):

408000 600000 816000 1008000 1200000 1416000 1608000 1800000
3. 查看当前调频调度策略(Governor)

即当前 CPU 采用的调频算法,直接决定频率变化的逻辑:

# 查看单个簇的调度策略cat/sys/devices/system/cpu/cpufreq/policy0/scaling_governor# 批量查看所有簇cat/sys/devices/system/cpu/cpufreq/policy*/scaling_governor

RK3588 官方固件默认调度器为schedutil(配合 EAS 能量感知调度),可选策略通常包括:performancepowersaveondemandconservativeuserspaceschedutil

4. 查看当前频率上下限

调度器只会在scaling_min_freq~scaling_max_freq范围内调节频率,可用于验证你之前设置的频率限制是否生效:

# 查看小核频率上下限cat/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freqcat/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq

6.3 深度频率信息查看

1. 硬件实际运行频率(更精准)

scaling_cur_freq是调度器的设定值,cpuinfo_cur_freq从硬件寄存器直接读取的实际运行频率,更能反映真实状态:

cat/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freqcat/sys/devices/system/cpu/cpufreq/policy4/cpuinfo_cur_freq
2. 各频率档位运行时长统计

查看系统启动以来,CPU 在每个频率档位上的累计运行时间(单位:毫秒),可用于分析负载分布与调度合理性:

# 查看小核簇的频率时长统计cat/sys/devices/system/cpu/cpufreq/policy0/stats/time_in_state

输出示例(第一列频率kHz,第二列运行时长ms):

408000 125600 600000 34200 816000 18900 ...
3. 逐个 CPU 核心查看

同簇核心硬件同频,但也可单独查看每个核心的频率节点:

# 查看所有 8 个核心的当前频率cat/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

输出 8 个数值,前 4 个为小核,后 4 个为大核。


6.4 实时监控频率变化

1. 原生 watch 命令(无依赖)

每秒自动刷新一次,实时观察调度器的频率跳转:

# 同时监控三个簇的当前频率watch-n1'echo "=== CPU Frequency (kHz) ===" && \ echo -n "小核 policy0: " && cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq && \ echo -n "大核 policy4: " && cat /sys/devices/system/cpu/cpufreq/policy4/scaling_cur_freq && \ echo -n "大核 policy6: " && cat /sys/devices/system/cpu/cpufreq/policy6/scaling_cur_freq'
2. 专用工具查看
(1)cpufreq-info(系统信息汇总)

安装cpufrequtils包后,一键查看所有簇的驱动、策略、频率范围:

# Debian/Ubuntu 安装aptinstallcpufrequtils# 查看全部信息cpufreq-info
(2)rktop(RK3588 专属监控脚本)

瑞芯微社区常用的轻量监控脚本,可同时显示 CPU/NPU/GPU 频率、负载、温度:

# 下载运行wgethttps://raw.githubusercontent.com/YeWenxuan64/rktop/master/rktop.shchmod+x rktop.sh ./rktop.sh

6.5 补充:查看温控降频与调度约束

当芯片温度过高时,温控模块会强制拉低最高频率,此时调度器无法突破限制。可通过以下节点查看:

# 查看所有温控区域ls/sys/class/thermal/# 查看大核/小核对应的温度# thermal_zone3 对应小核簇温度,thermal_zone1/2 对应两个大核簇cat/sys/class/thermal/thermal_zone3/temp

若实际最高频率低于你设置的scaling_max_freq,大概率是温控触发了降频,需加强散热。

← 返回列表