当前位置: 首页 > article >正文

Linux RT 调度器的 rt_nr_running:RT 任务数量统计

一、核心概念解析1.1 RT 任务基础Linux 实时任务支持SCHED_FIFO先进先出与SCHED_RR时间片轮转两种策略优先级范围 1~99始终抢占 CFS 普通任务。可运行任务处于 TASK_RUNNING 状态、已入队 rt_rq、等待被调度执行的 RT 任务。rt_rq每个 CPU 独立的实时运行队列管理该 CPU 上所有 RT 任务。rt_nr_runningstruct rt_rq中的无符号整型计数器仅统计本 CPU 可运行 RT 任务数量不包含当前正在 CPU 上执行的 curr 任务部分内核版本统计口径包含 curr以源码为准。1.2 关键数据结构// 内核源码include/linux/sched/rt.h struct rt_rq { struct rt_prio_array active; // 按优先级组织的 RT 任务队列 unsigned int rt_nr_running; // 可运行 RT 任务总数核心字段 unsigned int rr_nr_running; // SCHED_RR 策略任务数 #ifdef CONFIG_SMP unsigned int rt_nr_migratory;// 可迁移 RT 任务数 unsigned int rt_nr_total; // 总 RT 任务数含不可迁移 #endif struct rt_bandwidth rt_bw; // 实时带宽控制 }; // 每个 CPU 的主运行队列包含 rt_rq struct rq { // ... struct rt_rq rt; // ... };1.3 核心作用调度决策pick_next_task_rt依据rt_nr_running 0判断是否有 RT 任务可调度。负载均衡SMP 场景下对比各 CPUrt_nr_running触发任务迁移平衡负载。过载检测rt_nr_running 2且存在可迁移任务时标记 CPU 为 RT 过载。带宽限流结合rt_bw控制 RT 任务总 CPU 占用防止饿死普通任务。二、环境准备2.1 软硬件环境CPUx86_64 4 核以上SMP 验证负载均衡内核版本Linux 5.4 / 5.10 / 6.1LTS 版本工业主流内核配置CONFIG_PREEMPTy抢占内核CONFIG_RT_GROUP_SCHEDy实时组调度CONFIG_SCHED_DEBUGy调度调试CONFIG_DEBUG_FSydebugfs 观测工具链gcc 9.3、make、git、trace-cmd、kernel-debuginfo、perf2.2 环境配置脚本#!/bin/bash # 安装依赖 yum install -y gcc make perf trace-cmd kernel-debuginfo kernel-devel # 挂载 debugfs观测 rt_nr_running 必备 mount -t debugfs debugfs /sys/kernel/debug/ # 开启调度统计 echo 1 /proc/sys/kernel/sched_schedstats # 检查 RT 配置 zcat /proc/config.gz | grep -E CONFIG_PREEMPT|CONFIG_RT_GROUP_SCHED|CONFIG_SCHED_DEBUG2.3 权限要求调试需 root 权限测试程序需设置CAP_SYS_NICE权限或直接 root 运行三、典型应用场景300 字在工业 EtherCAT 总线运动控制场景中主站周期任务1ms 周期SCHED_FIFO 优先级 90需稳定抢占 CPU。若系统同时运行多个 RT 任务如编码器采集、报警处理rt_nr_running会实时反映任务堆积情况。当该值持续 ≥2 时调度器触发 SMP 负载均衡将低优先级 RT 任务迁移至空闲 CPU若超过 RT 带宽阈值内核自动限流避免 CFS 任务完全无法运行。同时监控程序通过读取rt_nr_running实现过载告警当数值突增时触发日志记录与紧急停机保护保障产线设备安全。该计数器也是实时系统稳定性测试、论文实验数据采集的核心指标。四、实战案例与操作步骤4.1 案例 1内核态观测 rt_nr_running 源码实现4.1.1 RT 任务入队更新计数器// 内核源码kernel/sched/rt.c static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) { struct rt_rq *rt_rq rq-rt; if (WARN_ON_ONCE(p-policy ! SCHED_FIFO p-policy ! SCHED_RR)) return; add_nr_running(rq, 1); rt_rq-rt_nr_running; // 入队计数器 1 #ifdef CONFIG_SMP if (p-nr_cpus_allowed 1) rt_rq-rt_nr_migratory; #endif enqueue_rt_entity(rt_rq, p-rt); balance_rt(rq); // 依据 rt_nr_running 触发负载均衡 }4.1.2 RT 任务出队更新计数器static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) { struct rt_rq *rt_rq rq-rt; dequeue_rt_entity(rt_rq, p-rt); rt_rq-rt_nr_running--; // 出队计数器 -1 sub_nr_running(rq, 1); #ifdef CONFIG_SMP if (p-nr_cpus_allowed 1) rt_rq-rt_nr_migratory--; #endif balance_rt(rq); }4.2 案例 2用户态读取 rt_nr_running可直接用于论文实验4.2.1 基于 debugfs 读取每个 CPU 的 rt_nr_running#include stdio.h #include stdlib.h #include string.h #include unistd.h #define DEBUGFS_PATH /sys/kernel/debug/sched/rt_rq #define CPU_NUM 4 // 根据实际 CPU 核心数修改 int main(int argc, char *argv[]) { char path[128]; char buf[16]; FILE *fp; int cpu, ret; while (1) { system(clear); printf( RT Task Stat (rt_nr_running) \n); printf(CPU\t rt_nr_running\n); for (cpu 0; cpu CPU_NUM; cpu) { snprintf(path, sizeof(path), %s/cpu%d/rt_nr_running, DEBUGFS_PATH, cpu); fp fopen(path, r); if (!fp) { perror(fopen failed); continue; } memset(buf, 0, sizeof(buf)); ret fread(buf, 1, sizeof(buf)-1, fp); fclose(fp); printf(CPU%d\t %s, cpu, buf); } sleep(1); } return 0; }编译运行gcc rt_nr_running_monitor.c -o rt_mon chmod x rt_mon ./rt_mon4.3 案例 3创建 RT 任务观察计数器变化4.3.1 RT 任务测试程序#include pthread.h #include sched.h #include stdio.h #include stdlib.h #include unistd.h #define RT_PRIO 90 #define THREAD_NUM 3 // 创建 3 个 RT 线程 void *rt_thread_func(void *arg) { int id *(int *)arg; printf(RT Thread %d running...\n, id); while (1) pause(); // 保持可运行状态 return NULL; } int main() { pthread_t tid[THREAD_NUM]; struct sched_param param; cpu_set_t cpuset; int i, arg[THREAD_NUM]; // 绑定 CPU0集中观测 rt_nr_running CPU_ZERO(cpuset); CPU_SET(0, cpuset); // 设置 RT 调度策略 param.sched_priority RT_PRIO; if (sched_setscheduler(getpid(), SCHED_FIFO, param) -1) { perror(sched_setscheduler failed); exit(1); } // 绑定 CPU if (pthread_setaffinity_np(getpid(), sizeof(cpuset), cpuset) -1) { perror(pthread_setaffinity_np failed); exit(1); } // 创建 RT 线程 for (i 0; i THREAD_NUM; i) { arg[i] i; if (pthread_create(tid[i], NULL, rt_thread_func, arg[i]) -1) { perror(pthread_create failed); exit(1); } } while (1) pause(); return 0; }编译运行gcc rt_test.c -o rt_test -lpthread ./rt_test # root 权限运行观测结果CPU0 的rt_nr_running会变为 3。4.4 案例 4perf 跟踪 rt_nr_running 变化# 跟踪 RT 任务入队/出队事件 perf trace -e sched:sched_enqueue_task,sched:sched_dequeue_task -T # 跟踪 RT 负载均衡触发条件 perf probe -d rt_rq:rt_nr_running perf probe rt_rq:rt_nr_running perf record -e probe:rt_rq -aR sleep 10 perf report4.5 案例 5RT 过载检测内核逻辑// 内核源码kernel/sched/rt.c static int rt_overload(struct rt_rq *rt_rq) { // 条件1可运行 RT 任务数 ≥2 // 条件2存在可迁移任务 return rt_rq-rt_nr_running 2 rt_rq-rt_nr_migratory 0; }当rt_overload返回 1 时调度器触发任务迁移降低单 CPU RT 负载。五、常见问题与解答Q1debugfs 下找不到 rt_nr_running 文件A内核未开启CONFIG_SCHED_DEBUG或CONFIG_DEBUG_FS重新编译内核开启配置或执行mount -t debugfs debugfs /sys/kernel/debug。Q2rt_nr_running 为 0 但仍有 RT 任务在运行A部分内核版本rt_nr_running不统计 curr 任务仅统计就绪队列任务属于正常口径。Q3创建 RT 任务后 rt_nr_running 不增加A任务未进入 TASK_RUNNING 状态、被绑定至其他 CPU、或优先级设置错误使用ps -eo pid,pri,policy,cmd检查。Q4rt_nr_running 持续很高但 CPU 使用率低ART 任务处于自旋等待 / IO 阻塞实际未占用 CPU计数器仅统计可运行状态不反映执行时长。Q5SMP 场景下 rt_nr_running 分布不均ART 任务绑定 CPUpthread_setaffinity_np导致无法迁移负载均衡失效解除 CPU 绑定即可。六、实践建议与最佳实践6.1 调试技巧实时监控使用本文提供的rt_mon程序长期运行记录rt_nr_running波动曲线用于论文数据分析。阈值告警工业场景设置阈值rt_nr_running 3触发告警避免调度延迟。内核跟踪结合trace-cmd跟踪rt_nr_running变化与任务迁移的关联。6.2 性能优化CPU 隔离将核心业务 RT 任务绑定独立 CPU减少rt_nr_running波动。带宽控制通过/sys/fs/cgroup/cpu,cpuacct/rt/cpu.rt_runtime_us限制 RT 总 CPU 占用。避免过量 RT 任务单 CPUrt_nr_running建议 ≤2防止调度抖动。6.3 论文 / 实验数据采集记录不同 RT 任务数量下rt_nr_running与调度延迟的对应关系。对比 SMP 与单 CPU 下rt_nr_running负载均衡效果。分析rt_nr_running突增导致的系统响应延迟形成实验结论。七、总结与应用落地rt_nr_running是 Linux RT 调度器的核心状态指示器直接决定调度决策、负载均衡、过载保护与带宽限流逻辑。本文从内核源码实现、用户态观测工具、RT 任务测试、问题排查全维度提供实战内容所有代码可直接复制运行适用于课程实验、学术论文、工业项目落地。在实时系统开发中通过监控rt_nr_running可快速定位任务堆积、调度失效、负载不均等问题是 Linux 底层开发、内核调试、性能优化必备技能。建议结合实际业务场景将rt_nr_running纳入系统监控体系保障实时任务稳定运行。

相关文章:

Linux RT 调度器的 rt_nr_running:RT 任务数量统计

一、核心概念解析1.1 RT 任务基础Linux 实时任务支持 SCHED_FIFO(先进先出)与 SCHED_RR(时间片轮转)两种策略,优先级范围 1~99,始终抢占 CFS 普通任务。可运行任务:处于 TASK_RUNNING 状态、已入…...

鸣潮自动化工具终极指南:3步实现游戏时间自由,告别重复刷本

鸣潮自动化工具终极指南:3步实现游戏时间自由,告别重复刷本 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves …...

蓝桥杯Scratch真题避坑指南:绘制金字塔时,90%的人会算错砖块起始位置

蓝桥杯Scratch真题避坑指南:绘制金字塔时,90%的人会算错砖块起始位置 在Scratch编程的世界里,绘制几何图形是检验逻辑思维和数学计算能力的绝佳方式。蓝桥杯选拔赛中频繁出现的"绘制金字塔"题目,看似简单却暗藏玄机。许…...

哔哩下载姬DownKyi完整指南:3分钟学会免费下载B站高清视频

哔哩下载姬DownKyi完整指南:3分钟学会免费下载B站高清视频 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&a…...

Mac用户专属:12306购票助手如何帮你轻松抢到春运车票

Mac用户专属:12306购票助手如何帮你轻松抢到春运车票 【免费下载链接】12306ForMac An unofficial 12306 Client for Mac 项目地址: https://gitcode.com/gh_mirrors/12/12306ForMac 作为一名Mac用户,你是否曾为春运抢票而烦恼?当1230…...

BKS势函数详解:从石英玻璃到LAMMPS模拟,你的二氧化硅参数选对了吗?

BKS势函数深度解析:二氧化硅模拟中的参数选择与实战指南 在分子动力学模拟领域,势函数的选择往往决定了整个研究的成败。对于二氧化硅(SiO₂)这种在自然界和工业应用中无处不在的材料,BKS(Buckingham-Coulomb)势函数因其出色的平衡性和广泛的…...

Linux服务器开机自动挂载网络磁盘(NFS)完整配置流程与排错指南

Linux服务器NFS网络磁盘持久化挂载实战指南 在分布式架构与数据密集型应用场景中,网络文件系统(NFS)的稳定挂载直接关系到业务连续性。当服务器意外重启后,若共享存储未能自动恢复连接,可能导致应用服务雪崩式瘫痪。本…...

JasperReports生成PDF中文乱码?手把手教你搞定字体配置(附fonts.jar打包教程)

JasperReports中文PDF生成终极指南:从字体配置到生产环境部署 你是否遇到过这样的场景?在JasperStudio里精心设计的中文报表模板,预览时一切正常,但一旦集成到Java应用中生成PDF,中文内容就神秘消失了——要么变成乱码…...

从原理到调参:一文读懂CycleMorph在2D/3D图像配准中的核心技术与实践陷阱

从原理到调参:CycleMorph在2D/3D图像配准中的核心技术解析与实战避坑指南 医学影像分析中,精确的图像配准一直是影响诊断和治疗规划的关键技术。传统方法在处理复杂形变时往往面临拓扑结构破坏、计算效率低下等瓶颈。CycleMorph通过引入循环一致性约束和…...

用Python搞定电力系统潮流计算?手把手教你用PyPower跑通第一个OPF算例

从零开始用Python实现电力系统潮流计算:PyPower实战指南 电力系统潮流计算是电力工程师的必备技能之一。想象一下,你刚接手一个电网优化项目,领导要求你快速评估不同运行方案下的电压分布和功率流动。传统方法可能需要依赖商业软件&#xff…...

R语言实战:用RMST分析肝硬化患者生存数据,告别风险比依赖

R语言实战:用RMST解锁肝硬化患者生存分析新视角 当临床医生面对肝硬化患者的生存数据时,传统风险比分析常让人陷入解释困境——特别是当生存曲线交叉或删失严重时。限制平均生存时间(RMST)提供了一种直观的解决方案:它直接回答"治疗组患…...

避开这些坑!用STC15单片机做超声波测距时,定时器溢出和温度补偿到底该怎么处理?

STC15单片机超声波测距实战:定时器溢出与温度补偿的深度优化方案 当超声波测距模块在STC15F2K60S2单片机上运行时,你是否遇到过这些情况:测量数据偶尔出现异常跳变,远距离测量结果不稳定,甚至程序莫名其妙进入死循环&a…...

如何让音乐成为你的社交名片:3个神奇技巧让Discord好友实时看到你的播放列表 [特殊字符]

如何让音乐成为你的社交名片:3个神奇技巧让Discord好友实时看到你的播放列表 🎵 【免费下载链接】NetEase-Cloud-Music-DiscordRPC 在Discord上显示网抑云/QQ音乐. Enables Discord Rich Presence For Netease Cloud Music/Tencent QQ Music. 项目地址…...

别再死记硬背ACL规则了!用华为eNSP模拟器5分钟搞定防火墙基础配置

华为eNSP实战:5分钟可视化掌握ACL防火墙配置精髓 刚接触网络设备配置时,ACL规则总让人望而生畏——那些密密麻麻的命令行和抽象的五元组匹配逻辑,像一堵墙挡在初学者面前。但当我第一次用华为eNSP模拟器完成整个ACL实验流程后,突然…...

2026届必备的五大降AI率网站推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 有一类免费的 AI 论文工具,这些为学术写作起到了提供高效解决方案作用。这类系统…...

别再手抄谱了!用Sibelius把MIDI文件一键转成五线谱(附Cubase协作流程)

别再手抄谱了!用Sibelius把MIDI文件一键转成五线谱(附Cubase协作流程) 每次在DAW里完成编曲后,最头疼的就是把那些灵光一现的旋律变成规整的五线谱。传统的手动记谱不仅耗时费力,还容易出错。作为从业十年的游戏音效师…...

从刷题到项目:5个STL高阶函数(next_permutation/lower_bound/unique)的巧妙应用场景

从刷题到项目:5个STL高阶函数的实战应用场景 在算法面试和实际项目开发中,STL(Standard Template Library)的高阶函数往往能让我们写出更简洁高效的代码。很多开发者虽然熟悉sort、find这些基础函数,但对next_permutat…...

别再乱买随身WiFi了!手把手教你用手机App(Cellular-Z)查清本地运营商频段,精准避坑

手机秒变信号探测器:3步教你用Cellular-Z避开随身WiFi选购雷区 每次看到电商平台上那些标榜"全网通"的随身WiFi设备,总忍不住想问:它们真的能在你家客厅稳定上网吗?去年我表弟就踩过这个坑——花500多买的"全频段支…...

用STM32和DHT11做个智能温湿度计:从硬件接线到软件调试的全过程记录

STM32与DHT11打造智能温湿度监测系统:从硬件搭建到功能扩展全指南 在物联网和智能家居快速发展的今天,环境监测已成为许多项目的核心需求。本文将带你从零开始构建一个基于STM32和DHT11的智能温湿度监测系统,不仅实现基础数据采集&#xff0…...

别再只看RMS粗糙度了!用Huray模型手把手教你预测PCB铜箔高频损耗(附Python代码)

突破传统:用Huray雪球模型精准预测PCB铜箔高频损耗的工程实践 在高速PCB设计领域,GHz频段下的信号完整性分析一直是工程师们的痛点。传统基于RMS粗糙度的Hammerstad模型在低频段尚可应付,但当频率突破10GHz后,其预测误差往往高达3…...

TrendForge 精选 9 个热门开源项目:Python 最活跃,FinceptTerminal 获星最多

TrendForge 每日精选 9 个热门开源项目:Python 最活跃,FinceptTerminal 获星最多 TrendForge 每日都会精选最具潜力的开源项目,今日共收录 9 个热门项目,且提供了智能中文翻译版,方便大家理解项目描述。 今日最热项目 …...

从软木塞到工程泡沫:泊松比如何定义材料的变形世界

1. 泊松比:材料变形的"身份证" 第一次听说泊松比这个词,是在大学材料力学课上。当时教授拿着橡胶带用力拉扯,问我们:"为什么橡皮筋变细了?"这个看似简单的现象背后,藏着材料科学中最重…...

RWKV7-1.5B-world惊艳效果:输入‘画一只猫’→文本生成→‘Describe in English’→专业动物学描述

RWKV7-1.5B-world惊艳效果:输入画一只猫→文本生成→Describe in English→专业动物学描述 1. 模型概述 RWKV7-1.5B-world是基于第7代RWKV架构的轻量级双语对话模型,拥有15亿参数。该模型采用创新的线性注意力机制替代传统Transformer的自回归结构&…...

IIT海德拉巴与微软研究院联手揭开多模态推理模型的隐秘缺陷

这项由印度理工学院海德拉巴分校计算机科学与工程系与微软研究院(班加罗尔)联合开展的研究,以预印本形式于2026年4月9日发布在arXiv平台,编号为arXiv:2604.08476。感兴趣的读者可通过该编号检索完整论文。一、答对了,但…...

别再用Docker镜像打包Dify客户端了!C# 14原生AOT单文件部署正在重构云原生交付范式(限时开放压测数据集)

第一章:Dify客户端云原生交付范式的演进与重构动因在AI应用规模化落地的背景下,Dify客户端从单体打包部署逐步转向以Kubernetes为核心的云原生交付体系。这一转变并非单纯的技术升级,而是应对多租户隔离、边缘协同推理、热插拔插件治理及跨云…...

小白也能搞定:私有化Qwen3-VL:30B并接入飞书机器人完整教程

小白也能搞定:私有化Qwen3-VL:30B并接入飞书机器人完整教程 1. 准备工作与环境检查 1.1 确认上篇部署完成 在开始本教程前,请确保已完成以下准备工作: 已在CSDN星图AI云平台完成Qwen3-VL:30B的私有化部署获取了可正常访问的云服务器实例熟…...

Dify文档解析延迟超8秒?紧急上线前必做的6项性能压测与异步分片解析改造清单

第一章:Dify文档解析延迟超8秒?紧急上线前必做的6项性能压测与异步分片解析改造清单当Dify在生产环境遭遇文档解析平均延迟突破8秒(P95 > 8300ms),尤其在PDF/长Markdown批量导入场景下,常规同步解析已成…...

SecGPT-14B作品集:15个真实安全问答+5个日志溯源对话实录

SecGPT-14B作品集:15个真实安全问答5个日志溯源对话实录 1. SecGPT-14B网络安全大模型介绍 SecGPT-14B是由云起无垠团队开发的开源网络安全大模型,专注于提升安全防护的智能化水平。该模型基于vLLM框架部署,并通过Chainlit前端提供交互式体…...

终极指南:如何免安装Office快速预览Word、Excel和PPT文件

终极指南:如何免安装Office快速预览Word、Excel和PPT文件 【免费下载链接】QuickLook.Plugin.OfficeViewer Word, Excel, and PowerPoint plugin for QuickLook. 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook.Plugin.OfficeViewer 想要在不安装庞…...

STM32芯片‘身份证’读取指南:巧用ST-LINK Utility查看FLASH、芯片ID与版本信息

STM32芯片深度诊断:用ST-LINK Utility解锁硬件信息与固件分析 当一块来历不明的STM32开发板落到你手中,或者遇到一台"锁死"的设备需要修复时,如何快速获取芯片的关键信息?ST-LINK Utility这个看似简单的工具&#xff0c…...