news 2026/4/15 12:16:40

【飞腾平台实时Linux方案系列】第十九篇 - 飞腾平台实时Linux多核心调度优化方案。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【飞腾平台实时Linux方案系列】第十九篇 - 飞腾平台实时Linux多核心调度优化方案。

一、简介:为什么国产多核必须“自己调”?

  • 背景:飞腾芯片(ARMv8 架构)已批量应用于能源、矿山、轨道交通等关键基础设施,核心数从 4 核到 64 核不等。

  • 痛点:默认调度器侧重吞吐,实时任务(<1 ms 控制环)常被负载均衡算法“搬来搬去”,导致:

    • 中断延迟抖动 > 200 µs

    • 双核同时访问外设寄存器 → 总线争用

    • 非实时任务污染 L2 Cache,实时任务命中率下降

  • 价值:掌握“核心绑定+隔离+负载均衡”三件套,同等硬件下实时抖动下降 70%,为后续 SIL/PL 认证打下量化基础。


二、核心概念:5 个关键词先搞懂

名词一句话飞腾平台差异
CPU Affinity把任务钉在指定核心运行飞腾 L3 共享,绑定时需考虑 Cluster
isolcpus内核启动参数,隔离核心不参与调度飞腾 GICv3 支持,irqbalance 需手动关
taskset用户态绑定工具与 x86 用法完全一致
sched_setaffinity代码级绑定同 ARM Generic
PREEMPT_RT实时补丁,使内核可完全抢占飞腾官方已发布 rt 分支

三、环境准备:10 分钟搭好“飞腾多核实验室”

1. 硬件

  • FT-2000/4 工业板卡(4 核 Cortex-A53 @1.5 GHz)

  • 串口线 ×1(115200 8N1)

2. 软件

组件版本获取方式
实时内核linux-5.15-ft-rt30飞腾 Git 开源
根文件系统Ubuntu 20.04 arm64官方 prebuild
交叉工具链gcc-linaro-11.3sudo apt install gcc-aarch64-linux-gnu

3. 一键编译内核(可复制)

#!/bin/bash # build_ft_rt.sh git clone https://gitee.com/phytium/linux.git -b v5.15-ft-rt cd linux export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- make phytium_defconfig ./scripts/config -e CONFIG_PREEMPT_RT make -j$(nproc) Image dtbs # 输出:arch/arm64/boot/Image

4. 部署

  • 通过tftpboot或烧写到 eMMC,串口进入系统。


四、应用场景(300 字)

某矿山 5G+远程掘进系统采用 FT-2000/4 做车载控制器:

  • Core0 运行 EtherCAT 主站,周期 250 µs;

  • Core1 跑 5G TSN 协议栈,中断密集;

  • Core2/3 负责数据上云与本地 HMI。
    现场出现 EtherCAT 偶发延迟 > 800 µs → 导致液压臂抖动。经分析,Linux 负载均衡将 Core0 的实时任务短暂迁移到 Core1,与 5G 中断冲突。使用本文“isolcpus + irqbalance 关闭 + taskset”方案后,Core0 专核专用,中断延迟稳定在 65 µs 以内,抖动下降 70%,通过矿山安全监察局验收。


五、实际案例与步骤:从“默认调度”到“专核专用”

实验目标:把周期 500 µs 实时任务固定在 Core2,禁止调度器迁移。

5.1 隔离核心(boot 阶段完成)

编辑/boot/grub/grub.cfg追加:

linux /boot/Image isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3

解释:

  • isolcpus=2,3→ 内核不再将普通任务放到 2/3 核

  • nohz_full→ 动态 tick 关闭,减少时钟中断

  • rcu_nocbs→ RCU 回调卸载,避免实时核被 RCU 打扰

保存后sudo reboot,串口确认:

cat /proc/cmdline | grep isolcpus

5.2 关闭 irqbalance(防止中断漂移)

sudo systemctl stop irqbalance sudo systemctl disable irqbalance

5.3 将外设中断绑到非实时核

查看 EtherCAT 网卡中断号:

grep eth0 /proc/interrupts # 示例: 40: 0 GICv3 40 eth0

绑到 Core0:

echo 1 > /proc/irq/40/smp_affinity # 位0 = Core0

5.4 用户态启动实时任务并绑核

/* cyclic_task.c */ #define _GNU_SOURCE #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <sys/mman.h> void *rt_loop(void *arg) { /* 绑到 Core2 */ cpu_set_t set; CPU_ZERO(&set); CPU_SET(2, &set); pthread_setaffinity_np(pthread_self(), sizeof(set), &set); /* 内存锁页 */ mlockall(MCL_CURRENT | MCL_FUTURE); /* 500 µs 循环 */ for (int i = 0; i < 10000; i++) { usleep(500); /* 实际用 timerfd 更精准 */ } return NULL; } int main() { pthread_t tid; pthread_attr_t attr; struct sched_param param = { .sched_priority = 90 }; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_FIFO); pthread_attr_setschedparam(&attr, &param); pthread_create(&tid, &attr, rt_loop, NULL); pthread_join(tid, NULL); return 0; }

交叉编译:

aarch64-linux-gnu-gcc cyclic_task.c -o cyclic_task -pthread

板端运行:

sudo ./cyclic_task

5.5 验证效果

  1. 调度迁移检查

    ps -eo pid,psr,comm | grep cyclic_task # 应始终显示 Core2
  2. 延迟 histogram

    sudo cyclictest -p90 -Sp90 -i200 -d60s -m \ -a2 -A2 # 只在 Core2 运行

    典型结果:

    Min: 8 µs Avg: 14 µs Max: 38 µs ← 未隔离前 Max=210 µs

六、常见问题与解答(FAQ)

问题现象解决
isolcpus 后 SSH 无法登录所有任务挤到 Core0,负载 100%保留 Core0 给系统,隔离 2,3 即可
中断 affinity 写入失败提示“Invalid argument”确认 irq 号存在;某些 GIC 虚拟中断不可绑
cyclictest Max 仍 > 100 µsBIOS 电源管理未关进 BIOS 关闭 Dynamic Turbo、CPU C6
任务偶尔飘到 Core0代码未 mlockall,缺页异常加 mlockall(MCL_CURRENT | MCL_FUTURE)
热插拔 USB 导致延迟尖峰USB 中断共享在 Core2把 USB 中断绑回 Core0:echo 1 > /proc/irq/XX/smp_affinity

七、实践建议与最佳实践

  1. “系统核 + 实时核”分区
    Core0/1 跑 OS + 网络中断,Core2/3 专跑实时任务,永不重叠。

  2. IRQ 亲和度脚本化
    /proc/irq/*/smp_affinity设置写成 systemd 服务,开机自启,防止板卡更换后遗忘。

  3. 用 cgroups v2 限带宽
    对非实时组限制cpu.max=50%,确保实时核满载时系统核仍可响应。

  4. 双核锁步安全场景
    若需 SIL 2,可把 Core2/3 跑相同任务,硬件比较器逐周期校验,诊断覆盖率 > 99%。

  5. 版本锁定
    内核、设备树、U-Boot 哈希值写入《安全配置清单》,任何升级走变更流程。

  6. 热升级
    使用 kexec 快速加载新 RT 内核,<30 s 完成重启,矿山 24 h 连续生产不中断。


八、总结:一张脑图带走全部要点

飞腾多核实时调度优化 ├─ 隔离:isolcpus + nohz_full + rcu_nocbs ├─ 绑中断:/proc/irq/*/smp_affinity ├─ 绑任务:taskset / pthread_setaffinity_np ├─ 测延迟:cyclictest -aCoreID └─ 文档:affinity 脚本 + 版本清单

国产芯 + 实时系统 = 自主可控的工业底座。
掌握本文“隔离-绑定-测量”三步法,你就能:

  • 让 EtherCAT 周期抖动 < 50 µs,机械臂平稳无颤抖

  • 让 5G TSN 与实时控制同芯片共存,互不干扰

  • 让 auditor 看到 99.9% 任务稳在指定核,审计一次通过

立刻登录你的飞腾板卡,复制/proc/cmdline加上isolcpus=2,3,重启后跑一遍cyclictest——实时性提升肉眼可见,国产多核真正“服服帖帖”!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 15:05:09

性能测试新纪元:AI模拟真实用户行为

从脚本到智能的范式转移 在软件测试领域&#xff0c;性能测试一直是确保系统稳定性、可扩展性和用户体验的核心环节。传统的性能测试方法&#xff0c;如基于脚本的工具&#xff08;如JMeter或LoadRunner&#xff09;&#xff0c;通过预设的用户行为模式模拟负载&#xff0c;但…

作者头像 李华
网站建设 2026/4/12 8:25:51

游戏客户端Steam,Epic安装在C盘,怎么移到其他盘?

theme: default themeName: 默认主题将steam或epic games从你的c盘移动到另一个位置并不像拖拽文件夹那么简单,如果你尝试那样做,启动器很可能会损坏,丢失你的游戏和设置,steam和epic的官方工具是你最安全的选择,但两者的过程略有不同,本指南解释了每个平台的分步方法,确保你的…

作者头像 李华
网站建设 2026/4/9 17:34:16

【2026】 LLM 大模型系统学习指南 (8)

解剖大型语言模型&#xff1a;从架构到核心机制的 “拆机器” 指南我们每天用的大模型&#xff08;比如聊天、写代码的 AI&#xff09;&#xff0c;看似是 “黑盒子”&#xff0c;其实像一台精密的智能机器 —— 有负责接收信息的 “输入接口”、处理数据的 “核心芯片”、输出…

作者头像 李华
网站建设 2026/4/15 10:28:29

计算机毕业设计Hadoop+Spark+Hive小红书评论情感分析 小红书笔记可视化 小红书舆情分析预测系统 大数据毕业设计(源码+LW+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 技术范围&#xff1a;Sprin…

作者头像 李华