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编号 核心类型 典型主频范围
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推理):大核锁定最高频

    bash 复制代码
    echo performance | tee /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
    echo performance | tee /sys/devices/system/cpu/cpufreq/policy6/scaling_governor
  • 功耗优先模式 (如待机值守):小核低频运行,关闭大核

    bash 复制代码
    echo 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功耗。

五、注意事项

  1. 实时任务隔离 :若使用PREEMPT_RT实时内核,建议通过isolcpus内核启动参数隔离大核,避免内核线程与用户态实时任务抢占资源。
  2. 散热约束:RK3588大核全核满负载时功耗较高,长时间运行需配合散热片/风扇,否则会触发温控降频。
  3. 设备树适配:自定义底板需确保电源域配置正确,否则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 能量感知调度),可选策略通常包括:performancepowersaveondemandconservativeuserspaceschedutil

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,大概率是温控触发了降频,需加强散热。

相关推荐
badhope2 小时前
MCP协议:号称要统一AI工具调用,但大多数人连第一步都走不对
后端·架构
小林ixn3 小时前
从混乱到清晰:项目架构与自定义 Hook 的双重实践
react.js·架构·前端框架
@insist1233 小时前
系统集成项目管理工程师-架构基础与系统架构
架构·系统架构·软考·系统集成项目管理工程师·软考中项·软件水平考试
Dr.kangder4 小时前
嵌入式处理器虚拟化仿真技术(九)——SimpleScalar原理与应用
嵌入式硬件·架构·嵌入式·虚拟化·仿真
星火跨境XINGHUOS4 小时前
独立站建站技术栈全景拆解:从小白到能自己建站需要学什么?
架构
Dr.kangder7 小时前
嵌入式处理器架构解析(十)——DSP+FPGA
fpga开发·架构·嵌入式
ltl13 小时前
高可用设计模式:冗余、故障转移与仲裁
架构
Dawson Zhu15 小时前
基于Palantir Foundry构建半导体制造AI友好型数据中台:从良率分析场景谈起
人工智能·语言模型·架构·制造·agi
2401_8432537019 小时前
Agent消息降级矩阵:当告警卡片遇到纯文本SMS渠道
架构