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 显示为 FF 或 RR
- 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防止系统管理进程被饿死