命令是干什么的
chrt 是 util-linux 提供的调度策略工具:既能查看进程当前用的调度策略与优先级,也能按指定策略启动程序。Linux 里普通进程走 SCHED_OTHER 由内核按 nice 值分配 CPU,实时策略 FIFO 与 RR 则按固定优先级抢占普通进程;BATCH 适合不在意延迟的纯计算任务,IDLE 只在系统空闲时才拿到 CPU。实时策略用错会让包括 sshd 在内的普通进程拿不到 CPU,所以 chrt 是排障与实时性验证工具,不是日常调优手段。
基本信息
| 适用平台 | Linux,util-linux 提供的 chrt,主流发行版默认自带 |
|---|---|
| 查看语法 | chrt -p 进程号 查看单个进程;chrt -m 列出支持的策略与优先级范围 |
| 设置语法 | chrt -f 50 命令 启动时指定;chrt -f -p 50 进程号 改运行中的进程 |
| 策略选项 | -o OTHER、-f FIFO、-r RR、-b BATCH、-i IDLE、-d DEADLINE |
| 优先级范围 | 实时策略 1 到 99,越大越高;普通策略由 nice 值决定,范围 -20 到 19 |
| 权限要求 | 设置实时策略需要 root 或 CAP_SYS_NICE 能力 |
典型使用场景
- 实时性验证:让测试程序以 FIFO 高优先级运行,测量抖动与最坏延迟
- 把后台计算任务降到 BATCH 或 IDLE,避免和在线业务抢 CPU 时间片
- 排查进程卡顿:先确认是否有进程被设成实时策略,把普通进程压在后面
- 音频与工控类程序的调优基线,验证通过后把策略固化到服务单元里
- 性能对照实验:同一程序在不同策略下运行,量化调度带来的差异
- 处理 hung task 告警时,确认是否存在长期占满 CPU 的实时任务
常用示例
常用示例
chrt -p 1234 # 查看 1234 号进程的策略与优先级
chrt -p $$ # 查看当前 shell 自己的调度策略
ps -eo pid,cls,rtprio,ni,comm | head # 批量列出各进程的调度类与优先级
chrt -f 50 ./latency-test # 以 FIFO 优先级 50 运行测试程序(需 root)
chrt -f -p 50 1234 # 把运行中的进程改成 FIFO 优先级 50
chrt -b 0 ./batch-job # BATCH 适合纯计算、不在意延迟的任务
chrt -i 0 ./idle-task # IDLE 最低优先级,只在系统空闲时运行
chrt -o 0 -p 1234 # 改回普通策略 SCHED_OTHER
chrt -m # 列出本内核支持的各策略优先级范围ps 调度列逐列读法
| 列名 | 含义 | 正常与异常 |
|---|---|---|
| CLS | 调度类:TS 普通、FF FIFO、RR 轮转、B BATCH、IDL IDLE、DL DEADLINE | 普通服务的进程应是 TS,出现 FF 或 RR 要问清原因 |
| RTPRIO | 实时优先级 1 到 99 | 非实时进程这一列为空或 0 |
| NI | nice 值,范围 -20 到 19 | 普通服务默认 0,出现负值说明被提高过优先级 |
| PID 与 COMM | 进程号与命令名 | 用来定位是谁占着实时优先级 |
内核给实时任务留了带宽上限:sched_rt_runtime_us 与 sched_rt_period_us 默认约 950000 与 1000000,也就是实时任务最多用掉约 95% 的 CPU 时间。测实时性前先确认这两个参数,否则会把内核节流误判成程序性能不足。
chrt 的设置不持久,重启后回到默认。systemd 托管的服务可以在单元文件里写 CPUSchedulingPolicy 与 CPUSchedulingPriority,让策略随服务启动一起生效。
DEADLINE 策略要配合运行时间、周期、截止时间三个参数才有意义,配置复杂且需要内核支持;没有明确的实时性指标时不要贸然使用。