4.4.4 调度策略与实时进程

调度策略与实时进程#

Linux 进程调度策略决定 CPU 时间片分配与抢占行为,直接影响吞吐与时延。实时调度用于对时延敏感场景,但配置不当会导致系统“饿死”。

原理草图#

文章图片

调度策略速览与命令解释#

  • SCHED_OTHER/CFS:默认策略,公平分配时间片
  • SCHED_BATCH:适合批处理,减少抢占
  • SCHED_IDLE:仅在 CPU 空闲时运行
  • SCHED_FIFO:实时先入先出,无时间片
  • SCHED_RR:实时轮转,有时间片

关键字段解释:
- cls:调度类(TS=普通/FF=FIFO/RR=RR/ID=IDLE)
- rtprio:实时优先级(1-99)
- pri:内核优先级
- ni:nice 值(-20~19)

# 查看调度策略与优先级
ps -eo pid,cls,rtprio,pri,ni,cmd | head -n 5
chrt -p 1   # 查看 PID=1 的调度策略

安装与环境准备#

chrt 属于 util-linux 套件,大多数发行版已预装。

# Debian/Ubuntu
sudo apt update && sudo apt install -y util-linux

# RHEL/CentOS
sudo yum install -y util-linux

实时调度示例(FIFO 与 RR)#

# 1) 以 FIFO 方式启动一个实时任务
sudo chrt -f 80 /usr/bin/yes > /dev/null &

# 2) 以 RR 方式启动实时任务
sudo chrt -r 60 /usr/bin/yes > /dev/null &

# 3) 查看其调度策略和优先级
ps -eo pid,cls,rtprio,pri,ni,cmd | grep yes

# 4) 修改已运行进程为 RR 70
sudo chrt -p -r 70 <PID>

预期效果
- cls 显示为 FFRR
- rtprio 为 60/70/80

资源与安全限制(防止系统饿死)#

配置实时优先级与锁内存上限:

# /etc/security/limits.conf
* soft rtprio  90
* hard rtprio  90
* soft memlock 65536
* hard memlock 65536

允许实时任务占用 CPU 比例(默认 95%):

# /etc/sysctl.conf
kernel.sched_rt_runtime_us = 950000
kernel.sched_rt_period_us  = 1000000

# 生效
sudo sysctl -p

典型排错步骤#

# 问题1:设置实时策略失败 "Operation not permitted"
# 原因:缺少 CAP_SYS_NICE 或 limits 配置
sudo getcap /usr/bin/chrt
# 解决:用 sudo 或设置 limits.conf 并重新登录

# 问题2:系统无响应、ssh 卡死
# 原因:高优先级 FIFO 占满 CPU
# 解决:登录控制台 kill 进程或降低 rtprio
sudo chrt -p -r 1 <PID>   # 降级
sudo kill -9 <PID>        # 强制终止

练习:验证 RR 时间片与可抢占性#

# 1) 启动两个 RR 实时任务
sudo chrt -r 50 /usr/bin/yes > /dev/null &
sudo chrt -r 50 /usr/bin/yes > /dev/null &

# 2) 观察 CPU 竞争与切换(top 中观察)
top -H -p <PID1>,<PID2>

# 3) 降低其中一个实时优先级
sudo chrt -p -r 20 <PID1>

检查点
- 同优先级 RR 任务轮转,CPU 使用率接近均衡
- 降级后高优先级任务获得更多 CPU

实战建议#

  • 生产环境优先选择 SCHED_RR,避免 FIFO 独占
  • 为实时任务预留 CPU(CPU 亲和或隔离)
  • 配置 sched_rt_runtime_us 防止系统管理进程被饿死