一、背景前提

在嵌入式 Linux、ROS 机器人、视觉 / 激光 / 红外多传感器融合系统中,多任务并发、高频率 IO 采集、数据处理线程争抢 CPU 与总线资源是最常见的性能瓶颈:

1.红外 / 深度相机、IMU、雷达、串口传感器同时高频读写,CPU 被占满、软中断飙高、关键任务被抢占

2.图像预处理、点云拼接、定位算法等高耗 CPU 任务,拖慢实时采集、导致丢帧、延迟抖动、数据不同步

3.无优先级管控时:非关键后台任务抢资源、硬实时采集任务饥饿、系统卡顿甚至死机

核心痛点:

普通 CFS 调度(默认 nice=0)只保证 “公平”,不保证实时性与关键任务优先级;高 IO / 高实时任务(如相机采集、IMU 读数据)容易被后台算法、日志、网络等任务 “饿死”。

本文核心讲解:

通过调整进程 nice 值(普通任务权重)+ 配置实时 SCHED_RR 调度(关键任务硬实时),二者效果如何以及如何取舍。

从内核调度层面分级管控 CPU/IO 资源

nice(-20~19):控制普通任务谦让度,低 nice 高权重、高 nice 低 CPU 占比

SCHED_RR(实时轮转):给传感器采集、硬中断处理等任务分配实时优先级(1~99)+ 时间片轮转,确保可抢占、不饥饿、低延迟

二、Linux 线程和进程的真实关系

在 Linux 内核里:没有真正的“线程”概念,只有 task_struct(任务)。

简单来说:进程 = 一组共享资源的 task  ;         线程 = 同一个 thread group 里的 task

也就是说:线程 ≈ 轻量级进程。这已经是老生常谈了,但是这个对于调度以及如何设置尤为关键。

★三、线程/进程设置nice 值的本质

Tips:设置nice值看似是某个线程本身,但是影响的是该组资源,后续会讲到。

nice 作用于:CFS(完全公平调度器,Completely Fair Scheduler)权重, 属于:SCHED_OTHER(普通调度类)。

1.关键点:

在 Linux 中:nice 是“线程级别”的属性,但调度是“线程组共享权重”的;

这就导致看到的现象:

假设:进程 P  
 ├ 线程 T1  
 ├ 线程 T2

如果Linux终端设置命令某个TID, renice -n  10  -p T1

 实际效果:整个进程的调度权重发生变化

原因:

-   CFS 会按 thread group 聚合计算权重
    
-   所有线程共享 CPU 时间分配策略

2.更底层一点讲:

CFS 里核心是:vruntime(虚拟运行时间)。nice 改变的是:weight(权重)。

而:线程组共享调度实体(sched_entity group)所以改一个线程,本质是在改 group 行为。

3.pthread nice 为什么“看起来像线程级”

我们无论再写C还是C++代码中设置nice值通常为:

setpriority(PRIO_PROCESS, tid, nice);

确实是针对 TID 设置的。调度器会在 group 层面使用这个权重。所以:看起来是线程级,实际上影响进程整体调度。

四、线程设置RR(实时调度的本质)

RR 属于SCHED_RR(实时调度类),优先级范围:1 ~ 99(越大越高)。

1.与nice设置的核心区别

实时调度是严格“线程级”的

情况分析:

还是:进程 P  
 ├ T1  
 ├ T2

如果

pthread_setschedparam(T1, SCHED_RR, priority=50);

结果:T1 → 实时线程  
           T2 → 仍然是普通线程(SCHED_OTHER)

2.调度行为

系统调度优先级:

SCHED_RR / SCHED_FIFO  >  SCHED_OTHER

所以: T1 会“碾压”整个系统的普通线程(包括同进程的 T2)

3.RR 对“进程”的影响

虽然 RR 是线程级,但会带来“间接进程影响”:

1. CPU 抢占:T1(RR)会优先运行   T2 可能长期拿不到 CPU

2.看起来像“整个进程变快了”:其实是因为只有一个线程在疯狂跑

3. 可能导致系统问题:CPU 100%  ;普通线程饥饿  ;系统卡顿

五、nice 与 RR 的本质对比

特性   nice  SCHED_RR
调度类  CFS 实时调度
作用范围 线程设置,但影响进程整体 严格线程级
是否共享   是(group)
抢占能力 强(优先级压制)
是否危险   低 高(可能卡系统)

六、实战建议

如果微调性能:nice / setpriority,适合——后台任务,降低优先级

如果强控制调度,强调抢占资源:SCHED_RR / SCHED_FIFO,

但必须: 设置时间片 ;避免死循环;最好配合 CPU affinity

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐