插件窝 干货文章 深入理解Linux中的进程优先级

深入理解Linux中的进程优先级

优先级 进程 调度 实时 1042    来源:    2025-04-09

Linux进程优先级详解

基本概念

在Linux系统中,进程优先级决定了进程获取CPU资源的顺序和频率。Linux采用两种优先级机制:

  1. Nice值:范围从-20(最高优先级)到19(最低优先级),默认值为0
  2. 实时优先级:范围从1(最低)到99(最高),用于实时进程

查看进程优先级

使用ps -l命令查看进程优先级:

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1234  1233  0  80   0 -  1234 wait   pts/0    00:00:00 bash
0 R  1000  5678  1234  0  80   0 -  5678 -      pts/0    00:00:00 ps

其中: - PRI:进程的实时优先级(Linux中表示动态优先级) - NI:Nice值

调整进程优先级

1. 使用nice命令启动进程

# 以较低优先级启动进程
nice -n 10 command

# 以较高优先级启动进程
nice -n -10 command

2. 使用renice调整运行中进程

# 调整PID为1234的进程nice值为5
renice 5 -p 1234

# 调整用户user1的所有进程nice值为10
renice 10 -u user1

3. 实时优先级调整

# 设置实时优先级(需要root权限)
chrt -f 99 command  # 设置FIFO调度,优先级99
chrt -r 50 command  # 设置RR调度,优先级50

调度策略

Linux支持多种调度策略:

  1. SCHED_OTHER:默认分时调度策略(使用nice值)
  2. SCHED_FIFO:先进先出的实时调度策略
  3. SCHED_RR:轮转的实时调度策略
  4. SCHED_BATCH:批处理调度
  5. SCHED_IDLE:极低优先级调度

查看进程调度策略:

chrt -p <PID>

优先级计算

Linux内核实际使用的动态优先级计算公式:

动态优先级 = max(100, min(静态优先级 - bonus + 5, 139))

其中: - 静态优先级 = 120 + nice值 - bonus取决于进程的交互性

最佳实践

  1. 普通用户只能降低优先级(增加nice值)
  2. 需要root权限才能提高优先级或设置实时优先级
  3. 实时优先级进程会抢占普通进程,需谨慎使用
  4. 对于CPU密集型任务,可适当降低优先级
  5. 对于交互式任务,可适当提高优先级

常见问题解决

问题1:无法设置负nice值

$ nice -n -10 command
nice: cannot set niceness: Permission denied

解决方案:需要root权限才能设置负nice值

问题2:实时优先级不生效

$ chrt -f 99 command
chrt: failed to set pid 0's policy: Operation not permitted

解决方案:需要root权限,且内核配置需支持实时调度

问题3:进程优先级自动变化 原因:Linux内核会根据进程行为动态调整优先级 解决方案:使用实时调度策略或调整/proc/sys/kernel/sched_child_runs_first等参数