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核心,核心组件包括:
- 能量模型(Energy Model, EM):设备树中预置每个CPU在不同频率档位下的算力(capacity)与功耗值,调度器可精确计算「把任务放在某核某频」的能耗成本。
- PELT负载跟踪:按实体(进程/线程)维度统计负载,区分CPU密集型与IO密集型任务,预测任务后续的算力需求。
- 任务放置策略 :
- 轻负载、后台任务优先放置在小核,尽可能压低功耗;
- 当任务负载超过小核算力上限,或高优先级任务唤醒时,迁移到大核执行;
- 负载下降后,逐步迁回小核,避免频繁切换带来的开销。
- schedutil调频器协同:调频策略直接对接调度器的负载信息,任务迁到大核时同步拉高频率,迁到小核时降低频率,实现调度与调频的一体化决策。
3. 嵌入式场景的能效平衡核心思路
嵌入式场景业务固定、可预测性强,相比消费电子的纯动态调度,更适合「静态分区+动态辅助」的混合模式:
- 任务分级绑定:核心业务、实时任务绑定大核;后台守护、日志、网络等轻负载进程绑定小核,避免调度器误判。
- 分簇精细化调频:大核簇按需冲高,小核簇锁定低频区间,减少无意义的频率波动。
- 空闲深度休眠:低负载场景下关闭部分大核,仅保留小核运行,降低待机功耗。
- 实时性保障:硬实时任务绑定固定大核并锁频,消除调度迁移与调频带来的延迟抖动。
二、RK3588 硬件拓扑与环境准备
1. RK3588 CPU硬件拓扑
RK3588采用 4核Cortex-A55 + 4核Cortex-A76 的八核设计,电源与调频按3个簇独立管理:
| 调频策略节点 | 对应CPU编号 | 核心类型 | 典型主频范围 |
|---|---|---|---|
| policy0 | CPU0~CPU3 | Cortex-A55(小核) | 408MHz ~ 1.8GHz |
| policy4 | CPU4~CPU5 | Cortex-A76(大核簇0) | 408MHz ~ 2.4GHz |
| policy6 | CPU6~CPU7 | Cortex-A76(大核簇1) | 408MHz ~ 2.4GHz |
注:两个A76子簇共享L2缓存,可独立调频,也可合并为一个大核域统一调度。
2. 环境确认命令
先验证系统的CPU拓扑与基础能力:
bash
# 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相关选项,若自行裁剪内核,需确保以下配置开启:
bash
# 进入内核配置界面
make ARCH=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调度器
bash
# 所有簇统一切换为schedutil(EAS推荐)
echo schedutil | tee /sys/devices/system/cpu/cpufreq/policy*/scaling_governor
# 验证当前策略
cat /sys/devices/system/cpu/cpufreq/policy*/scaling_governor
(2)分簇设置频率上下限
根据业务场景限制频率范围,平衡性能与功耗:
bash
# === 小核簇(A55,policy0):锁定中低频,处理后台任务 ===
# 最低频率408MHz,最高限制1.2GHz(轻负载场景)
echo 408000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
echo 1200000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq
# === 大核簇0(A76,policy4):性能优先,允许冲高 ===
echo 1000000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_min_freq
echo 2200000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_max_freq
# === 大核簇1(A76,policy6):均衡模式,限制最高频降功耗 ===
echo 800000 > /sys/devices/system/cpu/cpufreq/policy6/scaling_min_freq
echo 1800000 > /sys/devices/system/cpu/cpufreq/policy6/scaling_max_freq
(3)极端场景:定频配置
-
性能优先模式 (如满负载AI推理):大核锁定最高频
bashecho performance | tee /sys/devices/system/cpu/cpufreq/policy4/scaling_governor echo performance | tee /sys/devices/system/cpu/cpufreq/policy6/scaling_governor -
功耗优先模式 (如待机值守):小核低频运行,关闭大核
bashecho powersave > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
步骤3:任务CPU亲和性绑定(嵌入式核心优化)
嵌入式业务固定,通过亲和性绑定把任务固定在指定核心,比EAS动态调度更稳定、延迟更低,是工业、边缘网关场景的首选方案。
(1)单进程快速绑定:taskset
bash
# 示例1:后台日志进程绑定到小核CPU0~CPU3
taskset -c 0-3 /usr/sbin/rsyslogd
# 示例2:实时数据采集线程绑定到大核CPU4~CPU5
taskset -c 4-5 ./data_collect_daemon
# 查看已有进程的CPU亲和性
taskset -p <PID>
(2)批量分组管理:cpuset子系统
针对多进程业务,用cgroup的cpuset子系统做分级分组管理,实现「系统服务跑小核,核心业务跑大核」。
分步操作:
bash
# 1. 挂载cpuset文件系统
mkdir -p /sys/fs/cgroup/cpuset
mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset
# 2. 创建后台任务分组(绑定小核)
mkdir /sys/fs/cgroup/cpuset/background
echo 0-3 > /sys/fs/cgroup/cpuset/background/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/background/cpuset.mems
# 低优先级,允许使用的CPU份额更低
echo 0 > /sys/fs/cgroup/cpuset/background/cpuset.cpu_exclusive
# 3. 创建核心业务分组(绑定大核)
mkdir /sys/fs/cgroup/cpuset/foreground
echo 4-7 > /sys/fs/cgroup/cpuset/foreground/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/foreground/cpuset.mems
# 4. 将进程移入对应分组
# 后台进程移入background
echo <后台服务PID> > /sys/fs/cgroup/cpuset/background/cgroup.procs
# 核心业务移入foreground
echo <业务进程PID> > /sys/fs/cgroup/cpuset/foreground/cgroup.procs
进阶:可再创建
realtime分组,绑定单个大核并设置CPU独占,用于硬实时任务,彻底消除调度抖动。
步骤4:EAS调度参数精细化调优
通过/proc/sys/kernel下的调度参数调整EAS的迁移阈值,适配嵌入式业务特性:
bash
# 1. 调大任务迁移成本,减少大小核之间的频繁切换(适合负载稳定的嵌入式场景)
echo 5000000 > /proc/sys/kernel/sched_migration_cost_ns # 默认500000ns,单位纳秒
# 2. 调整大核上迁阈值:负载超过小核容量的80%才迁到大核,优先用满小核性能
echo 80 > /proc/sys/kernel/sched_upmigrate_pct
# 3. 调整大核下迁阈值:负载低于大核容量的30%就迁回小核
echo 30 > /proc/sys/kernel/sched_downmigrate_pct
# 4. 开启iowait boost:IO等待后唤醒的任务临时拉高频率,提升响应速度
echo 1 > /sys/devices/system/cpu/cpufreq/policy0/schedutil/iowait_boost_enable
echo 1 > /sys/devices/system/cpu/cpufreq/policy4/schedutil/iowait_boost_enable
步骤5:空闲功耗与CPUIdle优化
低负载场景下,通过CPUIdle与热插拔进一步降低待机功耗:
bash
# 1. 设置cpuidle调度器为menu(tickless模式,深度休眠)
echo menu > /sys/devices/system/cpu/cpu0/cpuidle/governor
# 2. 空闲时自动关闭部分大核(手动热插拔示例)
# 关闭CPU6、CPU7,仅保留2个大核应对突发负载
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online
# 3. 验证当前CPU在线状态
ls /sys/devices/system/cpu/online
工业场景可结合业务负载曲线,做定时热插拔策略:业务高峰期全开8核,闲时仅开2个小核值守。
步骤6:配置效果验证
(1)调度分布验证
查看任务实际运行的CPU核心,确认绑定与调度策略生效:
bash
# 实时查看各CPU的负载与进程分布
top -H # 按1键展开所有CPU核心
# 用perf查看调度事件(需安装perf工具)
perf sched record sleep 5
perf sched latency # 查看任务调度延迟与运行CPU
(2)性能与功耗验证
-
性能测试:用
sysbench验证大小核算力差异bash# 小核单线程性能 taskset -c 0 sysbench cpu --threads=1 run # 大核单线程性能 taskset -c 4 sysbench cpu --threads=1 run -
功耗测试:通过直流功率计测量整机功耗,对比不同配置下的待机/满载功耗差值;也可读取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功耗。
五、注意事项
- 实时任务隔离 :若使用PREEMPT_RT实时内核,建议通过
isolcpus内核启动参数隔离大核,避免内核线程与用户态实时任务抢占资源。 - 散热约束:RK3588大核全核满负载时功耗较高,长时间运行需配合散热片/风扇,否则会触发温控降频。
- 设备树适配:自定义底板需确保电源域配置正确,否则EAS的能量模型会失准,导致调度异常。
六、补充: 查看各类 cpu 调度策略的频率
RK3588 采用三簇独立调频 的硬件设计,所有频率与调度策略均通过 Linux 标准 cpufreq 子系统暴露在 sysfs 节点中,无需额外工具即可查看。以下按「基础信息→深度统计→实时监控」分步讲解,覆盖所有调度相关的频率维度。
6.1先明确:RK3588 调频簇划分
RK3588 的 8 个 CPU 核心分为 3 个独立调频域(同簇内核心硬件同频),对应 3 个 policy 节点:
| 策略节点 | 对应核心 | 核心类型 |
|---|---|---|
| policy0 | CPU0 ~ CPU3 | Cortex-A55 小核簇(4核) |
| policy4 | CPU4 ~ CPU5 | Cortex-A76 大核簇0(2核) |
| policy6 | CPU6 ~ CPU7 | Cortex-A76 大核簇1(2核) |
所有频率操作均以「簇」为单位,下文命令均基于这 3 个节点。
6.2 基础信息查看(原生 sysfs,无需安装工具)
1. 查看各簇当前运行频率
scaling_cur_freq 表示调频调度器当前设定的运行频率,单位为 kHz。
bash
# 小核簇当前频率
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
批量一键查看所有簇:
bash
for p in /sys/devices/system/cpu/cpufreq/policy*; do
echo "$(basename $p): $(cat $p/scaling_cur_freq) kHz"
done
输出示例:
policy0: 816000 kHz
policy4: 408000 kHz
policy6: 408000 kHz
2. 查看硬件支持的全部频率档位
查看当前调度器可切换的所有合法频率点(由设备树 OPP 表定义):
bash
# 查看小核支持的频率
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 采用的调频算法,直接决定频率变化的逻辑:
bash
# 查看单个簇的调度策略
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
# 批量查看所有簇
cat /sys/devices/system/cpu/cpufreq/policy*/scaling_governor
RK3588 官方固件默认调度器为 schedutil(配合 EAS 能量感知调度),可选策略通常包括:performance、powersave、ondemand、conservative、userspace、schedutil。
4. 查看当前频率上下限
调度器只会在 scaling_min_freq ~ scaling_max_freq 范围内调节频率,可用于验证你之前设置的频率限制是否生效:
bash
# 查看小核频率上下限
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq
6.3 深度频率信息查看
1. 硬件实际运行频率(更精准)
scaling_cur_freq 是调度器的设定值,cpuinfo_cur_freq 是从硬件寄存器直接读取的实际运行频率,更能反映真实状态:
bash
cat /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq
cat /sys/devices/system/cpu/cpufreq/policy4/cpuinfo_cur_freq
2. 各频率档位运行时长统计
查看系统启动以来,CPU 在每个频率档位上的累计运行时间(单位:毫秒),可用于分析负载分布与调度合理性:
bash
# 查看小核簇的频率时长统计
cat /sys/devices/system/cpu/cpufreq/policy0/stats/time_in_state
输出示例(第一列频率kHz,第二列运行时长ms):
408000 125600
600000 34200
816000 18900
...
3. 逐个 CPU 核心查看
同簇核心硬件同频,但也可单独查看每个核心的频率节点:
bash
# 查看所有 8 个核心的当前频率
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
输出 8 个数值,前 4 个为小核,后 4 个为大核。
6.4 实时监控频率变化
1. 原生 watch 命令(无依赖)
每秒自动刷新一次,实时观察调度器的频率跳转:
bash
# 同时监控三个簇的当前频率
watch -n 1 '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 包后,一键查看所有簇的驱动、策略、频率范围:
bash
# Debian/Ubuntu 安装
apt install cpufrequtils
# 查看全部信息
cpufreq-info
(2)rktop(RK3588 专属监控脚本)
瑞芯微社区常用的轻量监控脚本,可同时显示 CPU/NPU/GPU 频率、负载、温度:
bash
# 下载运行
wget https://raw.githubusercontent.com/YeWenxuan64/rktop/master/rktop.sh
chmod +x rktop.sh
./rktop.sh
6.5 补充:查看温控降频与调度约束
当芯片温度过高时,温控模块会强制拉低最高频率,此时调度器无法突破限制。可通过以下节点查看:
bash
# 查看所有温控区域
ls /sys/class/thermal/
# 查看大核/小核对应的温度
# thermal_zone3 对应小核簇温度,thermal_zone1/2 对应两个大核簇
cat /sys/class/thermal/thermal_zone3/temp
若实际最高频率低于你设置的 scaling_max_freq,大概率是温控触发了降频,需加强散热。