进程调度器
进程调度器可粗略分为两类:
-
实时调度器,系统中重要的进程由实时调度器调度,获得CPU能力强。
SCHED_RR ,roundrobin 轮询调度策略。相同优先级的进程轮流获取相同的CPU时间。
SCHED_FIFO ,先入先出调度策略。被分配到的CPU时间的进程会一直运行,直到被IO阻塞(也称为sched_yield),会被高优先级进程抢占。
-
非实时调度器,系统中大部分进程由非实时调度器调度,获得CPU能力弱。
SCHED_NORMAL ,标准的轮询方式时间共享调度,也称为SCHED_OTHER 。
SCHED_BATCH ,针对批量方式执行的进程策略。不像 SCHED_NORMAL 频繁竞争,任务可以长时间运行。
SCHED_IDLE ,用于执行非常低的优先级应用。使用 SCHED_IDLE 调度策略运行的进程比nice 19运行的进程优先级还低。
管理进程优先级
非实时调度策略
nice 值
- nice 值越高,代表优先级越低,获取CPU能力越弱。
- nice 值越低,代表优先级越高,获取CPU能力越强。
注意: 当不存在CPU资源竞争时,即使nice值高的进程也可以获得足够CPU资源。
nice 值查看
top 命令

ps命令
ps 是 Linux 下用于查看进程状态的核心工具,默认输出有限的进程信息,通过选项可自定义输出内容。
bash
[root@server ~ 10:52:00]# ps -o nice,cmd $(pgrep systemd)
#ps -o nice,cmd 自定义输出格式,仅展示进程的 nice 静态优先级(-20~+19)和完整命令行
#$(...) 命令替换,将 pgrep 的输出(PID 列表)作为参数传给 ps 命令
#pgrep systemd 提取系统中所有 systemd 进程的 PID(进程唯一标识)
#整条命令是查询所有 systemd 进程的 nice 优先级和对应的命令行信息
NI CMD
0 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
0 /usr/lib/systemd/systemd-journald
0 /usr/lib/systemd/systemd-udevd
0 /usr/lib/systemd/systemd-logind
0 /usr/bin/systemd-tty-ask-password-agent --watch
默认情况下,子进程将继承父进程的nice值,通常为0。
bash
[root@server ~ 11:05:38]# md5sum /dev/zero &
[10] 1643
[root@server ~ 11:22:13]# ps -o pid,nice,command $$ 1643
PID NI COMMAND
1502 0 -bash
1643 0 md5sum /dev/zero
# $$ 代表当前终端中运行的 shell 程序 PID
实时调度器进程优先级和非实时调度器进程优先级对比如下:

结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。
nice 命令
==注意:==nice值默认是10
bash
[root@server ~ 16:53:54]# nice md5sum /dev/zero &
[1] 1209
[root@server ~ 16:56:05]# ps -o pid,nice,command
#-o --format 的缩写,自定义输出字段(仅显示指定的列)
PID NI COMMAND
1187 0 -bash
1209 10 md5sum /dev/zero
1210 0 ps -o pid,nice,command
#pid 进程唯一标识符(Process ID),核心字段
#nice 进程的静态优先级值(范围:-20 ~ 19)
#command 启动进程的完整命令行(包括参数,部分系统可能缩写为 cmd)
普通用户仅允许使用正数的nice值运行程序。
bash
# 设置一个负数优先级
[laoma@centos7 ~]$ nice -n -2 md5sum /dev/zero &
[2] 1239
[laoma@centos7 ~]$ ps -o pid,nice,command 1239
PID NI COMMAND
1239 0 md5sum /dev/zero
# 设置一个正数优先级
[laoma@centos7 ~]$ nice -n 2 md5sum /dev/zero &
[3] 1239
[laoma@centos7 ~]$ ps -o pid,nice,command 1239
PID NI COMMAND
1239 2 md5sum /dev/zero
renice 命令
修改上面示例中产生的进程的优先级。
bash
[root@server ~ 17:13:58]# renice -n 2 1239
1239 (process ID) old priority -2, new priority 2
[root@server ~ 17:15:02]# ps -o pid,nice,command 1239
PID NI COMMAND
1239 2 md5sum /dev/zero
普通用户只能升高进程nice值,不能降低。
bash
[laoma@centos7 ~]$ renice -n -2 1239
renice: failed to set priority for 1239 (process ID): Permission
denied
[laoma@centos7 ~]$ ps -o pid,nice,command 1239
PID NI COMMAND
1239 2 md5sum /dev/zero
# 使用root用户调整
[root@server ~ 17:15:32]# renice -n -2 1239
1239 (process ID) old priority 2, new priority -2
[root@server ~ 17:18:29]# ps -o pid,nice,command 1239
PID NI COMMAND
1239 -2 md5sum /dev/zero
top 命令
top 界面查看进程CPU使用率:1239和1263,CPU使用率非常接近,因为优先级一致。

top界面的核心快捷键
| 快捷键 | 功能描述 |
|---|---|
| r | 设置进程nice值 |
| q | 退出 top(最常用) |
| 1 | 切换 CPU 核心显示(单核心 / 多核心分别显示,多核机器必备) |
| P | 按 CPU 使用率 降序排序(默认排序,大写 P) |
| M | 按 内存使用率 降序排序(大写 M) |
| T | 按 累计运行时间 降序排序(大写 T) |
| k | 终止进程(输入 PID + 回车,默认信号 15,强制终止用信号 9) |
| u | 过滤指定用户的进程(输入用户名,如 root/ubuntu) |
| p | 过滤指定 PID 的进程(输入进程 ID,精准查看单个进程) |
| f | 自定义显示字段(按上下键选择字段,按空格勾选 / 取消,回车保存) |
| o | 调整排序字段(按字段对应字母,如 %MEM 按 m,回车确认) |
| s | 修改刷新间隔(输入秒数,如 1 表示每秒刷新,默认 3 秒) |
| h | 查看帮助文档(所有快捷键说明) |
| z | 高亮显示(区分不同状态进程,更易读) |
| x | 高亮排序字段(当前排序的列会标亮,如 CPU 排序则 %CPU 列高亮) |
终止之前创建的2个md5sum进程。
bash
[root@server ~ 17:33:17]# pkill md5sum
[3] Terminated md5sum /dev/zero
[2] Terminated nice -n -2 md5sum /dev/zero
实时调度策略
chrt命令
chrt 命令用于获取和设置实时调度器进程优先级,以及更改进程调度器。
注意:总的来说chrt调整成的优先级是最高的,参考下图

该图越往左优先级越高
| 优先级类型 | 范围 | 优先级逻辑 |
|---|---|---|
| 实时优先级(Real-time Priority) | 1~99 | 数值越大,优先级越高(99 为最高实时优先级) |
| 普通优先级(Nice Level) | -20~19 | 数值越小,优先级越高(-20 为普通进程最高优先级,19 为最低) |
| Top 工具 PR 列(Top [PR]) | RT(对应实时优先级)、-3~39 | 1. RT:对应实时优先级(0~99) 2. 数值(-3~39):对应普通 Nice 优先级(-20~19) |
bash
# 查看进程优先级范围,chrt不能用于调整非实时进程nice值优先级。
[root@server ~ 17:33:25]# 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
# 以SCHED_RR调度器和优先级为5运行md5sum进程
[root@server ~ 17:38:18]# chrt -r 5 md5sum /dev/zero &
[6] 11178
[root@server ~ 17:55:06]# ps -o pid,cls,rtprio,command 11178
PID CLS RTPRIO COMMAND
11178 RR 5 md5sum /dev/zero
# 修改进程调度器和优先级
[root@server ~ 17:55:39]# chrt -f --pid 10 11178
[root@server ~ 17:56:30]# ps -o pid,cls,rtprio,command 11178
#CLS 进程调度类别(关键字段!区分实时 / 非实时)TS(是 Time-Sharing(分时) 的缩写)。FF:对应 SCHED_FIFO 调度策略(先进先出实时调度);RR:对应 SCHED_RR 调度策略(轮转实时调度)。
#RTPRIO 实时优先级(只有实时进程会显示 1~99 的数值,非实时进程显示 -)
#COMMAND 进程的启动命令(比如 /usr/bin/xxx 或脚本路径,能看出进程是做什么的)
PID CLS RTPRIO COMMAND
11178 FF 10 md5sum /dev/zero
# 修改进程调度器为非实时
[root@server ~ 17:56:54]# chrt -o --pid 0 11178
#-o 表示设置为「非实时调度」(SCHED_OTHER,即 CFS 调度器,默认策略);
[root@server ~ 17:57:20]# ps -o pid,cls,rtprio,command 11178
PID CLS RTPRIO COMMAND
11178 TS - md5sum /dev/zero
#RTPRIO 列显示 -:代表不是实时进程(实时进程会显示 1~99 的优先级数值)。
178
#-o 表示设置为「非实时调度」(SCHED_OTHER,即 CFS 调度器,默认策略);
[root@server ~ 17:57:20]# ps -o pid,cls,rtprio,command 11178
PID CLS RTPRIO COMMAND
11178 TS - md5sum /dev/zero
#RTPRIO 列显示 -:代表不是实时进程(实时进程会显示 1~99 的优先级数值)。