news 2026/5/15 3:49:00

【飞腾平台实时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/5/13 15:28:53

科研绘图新次元:书匠策AI如何用“动态魔法”让数据开口说话

在学术江湖里&#xff0c;论文的“颜值”往往决定其传播力。一张信息密度高、视觉冲击力强的图表&#xff0c;能让复杂的研究结论瞬间“破圈”。然而&#xff0c;传统绘图工具的“三座大山”——数据孤岛、格式陷阱、静态局限&#xff0c;却让无数研究者陷入“做图两小时&#…

作者头像 李华
网站建设 2026/5/3 7:51:10

一呼百应 item_get - 获取商品详情接口对接全攻略:从入门到精通

一呼百应 item_get 接口&#xff08;官方标准命名 yhby.item.get&#xff09;是通过商品唯一标识&#xff08;product_id&#xff09; 获取工业品、原材料、批发商品全维度详情数据的核心接口&#xff0c;覆盖商品基础属性、价格体系、供应能力、资质认证、物流信息、商家详情等…

作者头像 李华
网站建设 2026/5/14 16:09:49

交易总是亏钱?别怪市场,问题出在这3个致命的“懒”

你知道为什么九成的人在市场里混一两年就被淘汰吗&#xff1f;别再归咎于技术不行&#xff0c;或是行情太难了。问题的根源不在市场&#xff0c;在你身上——在你那三个致命的“懒”上。这种懒惰并非身体上的懈怠&#xff0c;而是思维和行为上的惯性&#xff0c;它让你始终无法…

作者头像 李华
网站建设 2026/5/3 3:36:58

办公软件Office,WPS的缓存和文件默认在C盘,怎么更改路径?

theme: default themeName: 默认主题你是否曾注意到电脑的c盘越来越满,然后发现office或wps软件是罪魁祸首,那些临时文件,自动保存备份和文档缓存默认都堆积在系统主盘上,久而久之这会拖慢电脑速度,让你为空间发愁,好消息是你不必忍受这一点,改变这些程序存储文件的位置是个直接…

作者头像 李华
网站建设 2026/5/1 17:11:52

浏览器缓存文件Chrome,Edge,Firefox在C盘哪里?怎么批量清理?

theme: default themeName: 默认主题想知道chrome,edge和firefox把那些临时文件都藏在你c盘的哪里吗,不止你一个人有这疑问,这些浏览器的缓存文件夹会悄无声息地占用大量空间,拖慢你的电脑,找到它们并不总是那么简单,手动清理又很麻烦,本指南为你理清头绪,我们会展示windows上这…

作者头像 李华
网站建设 2026/5/6 3:04:37

当AI开始替人下单,CIO的安全与治理挑战才刚刚开始

谷歌发布通用商务协议&#xff08;UCP&#xff09;首份草案&#xff0c;旨在标准化智能体在零售领域的购物和支付流程&#xff0c;由Shopify、Etsy、Wayfair、Target、沃尔玛等巨头支持&#xff0c;并获得支付系统厂商协助&#xff0c;该协议有助于智能体直接销售商品、优化订单…

作者头像 李华