linux chrt命令

简介: chrt命令用于操作进程的实时属性,可以设置或检索进程的实时调度策略和优先级。

命令语法

chrt [options] -p [priority] pid
chrt [options] -p pid
chrt [options] command [argument...]

常用选项

选项 说明
-p, --pid 操作已存在的进程ID
-m, --max 显示可用的最小和最大优先级
-o, --other 设置调度策略为SCHED_OTHER
-f, --fifo 设置调度策略为SCHED_FIFO
-r, --rr 设置调度策略为SCHED_RR
-d, --deadline 设置调度策略为SCHED_DEADLINE
-b, --batch 设置调度策略为SCHED_BATCH
-i, --idle 设置调度策略为SCHED_IDLE
-a, --all-tasks 操作所有任务(线程)
-v, --verbose 显示详细信息
-h, --help 显示帮助信息
-V, --version 显示版本信息

调度策略说明

调度策略 选项 说明
SCHED_OTHER -o 默认的公平分时调度策略(非实时)
SCHED_FIFO -f 先进先出的实时调度策略
SCHED_RR -r 时间片轮转的实时调度策略
SCHED_BATCH -b 批处理调度策略,用于非交互式任务
SCHED_IDLE -i 极低优先级调度策略,用于后台任务
SCHED_DEADLINE -d 截止时间调度策略(需要内核支持)

优先级范围

  • SCHED_OTHER/SCHED_BATCH/SCHED_IDLE: 优先级固定为0
  • SCHED_FIFO/SCHED_RR: 优先级范围为1-99(数值越高优先级越高)
  • SCHED_DEADLINE: 使用不同的参数配置(运行时、截止时间、周期)

常用示例

1. 查看进程的调度策略和优先级

# 查看PID为1234的进程的实时属性
chrt -p 1234

# 输出示例:
pid 1234's current scheduling policy: SCHED_OTHER
pid 1234's current scheduling priority: 0

2. 查看所有调度策略的最小和最大优先级

chrt -m

# 输出示例:
SCHED_OTHER min/max priority    : 0/0
SCHED_FIFO min/max priority     : 1/99
SCHED_RR min/max priority       : 1/99
SCHED_BATCH min/max priority    : 0/0
SCHED_IDLE min/max priority     : 0/0
SCHED_DEADLINE min/max priority : 0/0

3. 设置进程为SCHED_FIFO实时调度策略

# 将PID为1234的进程设置为SCHED_FIFO,优先级为90
chrt -f -p 90 1234

# 查看设置结果
chrt -p 1234
# 输出:
# pid 1234's current scheduling policy: SCHED_FIFO
# pid 1234's current scheduling priority: 90

4. 设置进程为SCHED_RR实时调度策略

# 将PID为1234的进程设置为SCHED_RR,优先级为80
chrt -r -p 80 1234

# 或者使用更简短的格式
chrt -r 80 -p 1234

5. 设置进程为SCHED_OTHER调度策略

# 将PID为1234的进程恢复为默认的SCHED_OTHER调度策略
chrt -o -p 0 1234

6. 启动新进程并设置调度策略

# 启动一个实时进程(SCHED_FIFO,优先级为99)
chrt -f 99 /path/to/realtime_app

# 启动一个批处理进程
chrt -b 0 /path/to/batch_job

# 启动一个低优先级进程
chrt -i 0 /path/to/background_task

7. 使用SCHED_DEADLINE调度策略

# 设置SCHED_DEADLINE调度策略(需要内核支持)
# 运行时=10ms,截止时间=30ms,周期=50ms
chrt -d --sched-runtime 10000000 --sched-deadline 30000000 --sched-period 50000000 -p 0 1234

实际应用场景

场景1:实时音频处理

# 设置音频服务器为高优先级实时进程
chrt -f 99 jackd -d alsa -r 48000 -p 1024

# 或设置已有的音频进程
chrt -f 99 -p $(pidof pulseaudio)

场景2:工业控制系统

# 设置PLC控制进程为实时优先级
chrt -r 90 /opt/plc/control_system

# 设置数据采集进程为中等实时优先级
chrt -r 70 /opt/plc/data_acquisition

场景3:批处理作业调度

# 将长时间运行的批处理作业设置为SCHED_BATCH
chrt -b 0 /opt/scripts/long_running_batch.sh

# 同时设置CPU亲和性和调度策略
taskset -c 2,3 chrt -b 0 ./batch_processor

注意事项

  • 设置实时调度策略需要root权限或具有CAP_SYS_NICE能力
  • SCHED_FIFO和SCHED_RR是实时调度策略,优先级高于普通进程
  • 不恰当地使用实时调度策略可能导致系统不稳定或响应缓慢
  • 实时进程不会自动让出CPU,需要程序自己调用sched_yield()或等待I/O
  • 在设置实时优先级前,建议先用chrt -m查看系统支持的优先级范围
  • SCHED_DEADLINE需要Linux内核3.14及以上版本支持
警告: 将进程设置为高优先级实时调度策略(特别是SCHED_FIFO)时,如果该进程进入死循环或长时间运行,可能会导致系统无法响应。建议仅在必要时使用,并确保实时进程设计合理。

结合其他工具使用

1. 结合taskset使用

# 同时设置CPU亲和性和实时调度策略
taskset -c 0 chrt -f 99 /path/to/realtime_app

# 或者先启动再设置
/path/to/app &
PID=$!
taskset -cp 0 $PID
chrt -f -p 99 $PID

2. 结合nice使用

# 对于非实时进程,可以结合nice调整优先级
nice -n -20 chrt -o 0 /path/to/important_app

3. 查看系统所有实时进程

# 使用ps命令查看实时进程
ps -eo pid,comm,cls,pri,rtprio | grep -E "FF|RR"

# 或者使用更详细的格式
ps -eo pid,comm,cls,pri,rtprio,ni,lwp,psr,pcpu,pmem --sort=-rtprio | head -20

故障排除

错误:无法设置调度策略

# 如果出现"Operation not permitted"错误
# 1. 检查是否以root用户运行
sudo chrt -f 99 -p 1234

# 2. 检查进程是否存在
ps -p 1234

# 3. 检查内核实时配置
cat /proc/sys/kernel/sched_rt_runtime_us

# 4. 检查用户资源限制
ulimit -a | grep "real-time priority"

检查实时调度配置

# 查看系统实时调度配置
cat /proc/sys/kernel/sched_rt_period_us
cat /proc/sys/kernel/sched_rt_runtime_us

# 通常配置为:周期=1,000,000微秒(1秒),运行时间=950,000微秒(0.95秒)
# 这意味着实时进程最多占用95%的CPU时间

相关命令

  • taskset - 设置进程CPU亲和性
  • nice/renice - 调整进程优先级(非实时)
  • ps - 查看进程状态,包括调度策略
  • top/htop - 实时查看进程状态和优先级
  • schedtool - 更高级的进程调度工具