在Linux系统中,进程优先级决定了进程获取CPU资源的顺序和频率。Linux采用两种优先级机制:
使用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值
# 以较低优先级启动进程
nice -n 10 command
# 以较高优先级启动进程
nice -n -10 command
# 调整PID为1234的进程nice值为5
renice 5 -p 1234
# 调整用户user1的所有进程nice值为10
renice 10 -u user1
# 设置实时优先级(需要root权限)
chrt -f 99 command # 设置FIFO调度,优先级99
chrt -r 50 command # 设置RR调度,优先级50
Linux支持多种调度策略:
查看进程调度策略:
chrt -p <PID>
Linux内核实际使用的动态优先级计算公式:
动态优先级 = max(100, min(静态优先级 - bonus + 5, 139))
其中: - 静态优先级 = 120 + nice值 - bonus取决于进程的交互性
问题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
等参数