进程调度器可粗略分为两类:
实时调度器(kernel),系统中重要的进程由实时调度器调度,获得CPU能力强。
非实时调度器(user),系统中大部分进程由非实时调度器调度,获得CPU能力弱。
实时调度器
实时调度器支持的调度策略:数字越大优先级越高
非实时调度器
非实时调度器支持的调度策略:
SCHED_NORMAL,标准的轮询方式时间共享调度,也称为SCHED_OTHER。
SCHED_BATCH,针对批量方式执行的进程策略。不像 SCHED_NORMAL 频繁竞争,任务可以长时间运行。
SCHED_IDLE,用于执行非常低的优先级应用。使用 SCHED_IDLE 调度策略运行的进程比nice 19运行的进程优先级还低。
常规系统上运行的大多数进程都使用 SCHED_OTHER 调度策略。由于并非所有进程都同等重要,因此可以为使用SCHED_OTHER调度策略运行的程序指定相对优先级,称为nice值。
有40种不同级别的nice值,范围 -20(最高优先级)到 19(最低优先级):
nice 值越高,代表优先级越低,获取CPU能力越弱。
nice 值越低,代表优先级越高,获取CPU能力越强。
注意: 当不存在CPU资源竞争时,即使nice值高的进程也可以获得足够CPU资源。
ps命令
[root@server ~ 13:54:23]# ps -o nice,cmd $(pgrep systemd)NI CMD0 /usr/lib/systemd/systemd --switched-root --system --deserialize 220 /usr/lib/systemd/systemd-journald0 /usr/lib/systemd/systemd-udevd0 /usr/lib/systemd/systemd-logind
默认情况下,子进程将继承父进程的nice值,通常为0。
[lyk@centos7 ~]$ md5sum /dev/zero &[1] 55725[lyk@centos7 ~]$ ps -o pid,nice,command $$ 55725PID NI COMMAND52751 0 -bash55725 0 md5sum /dev/zero# $$ 代表当前终端中运行的 shell 程序 PID
结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。
以下示例通过top命令查看进程
nice 命令
# nice值默认是10[root@server ~ 18:42:32]# nice md5sum /dev/zero &[1] 2255[root@server ~ 18:43:13]# ps -o pid,nice,commandPID NI COMMAND2163 0 -bash2255 10 md5sum /dev/zero2256 0 ps -o pid,nice,command
普通用户仅允许使用正数的nice值运行程序。
#正数的nice值普通用户可以设置[lyk@server ~ 18:44:04]$ nice -n 2 md5sum /dev/zero &[1] 2309[lyk@server ~ 18:45:54]$ ps -o pid,nice,command 2255PID NI COMMAND2255 10 md5sum /dev/zero[lyk@server ~ 18:44:19]$ nice -n -2 md5sum /dev/zero &[2] 2311#无法设置负数的优先级[lyk@server ~ 18:44:24]$ nice: 无法设置优先级: 权限不够
renice 命令
#普通用户只能 降低优先级(提高nice值)[lyk@server ~ 18:51:47]$ sleep 300 &[4] 2436[lyk@server ~ 18:54:45]$ ps -l -p 2436F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 1000 2436 2266 0 80 0 - 27013 hrtime pts/0 00:00:00 sleep[lyk@server ~ 18:54:56]$ renice -n 5 24362436 (进程 ID) 旧优先级为 0,新优先级为 5#普通用户改其他拥有者创建的进程失败2436 (进程 ID) 旧优先级为 0,新优先级为 5[lyk@server ~ 18:55:12]$ renice -n -2 2255renice: 设置 2255 的优先级失败(进程 ID): 不允许的操作[lyk@server ~ 18:57:06]$ ps -o pid,nice,command 2255PID NI COMMAND2255 10 md5sum /dev/zero#进入root修改优先级[root@server ~ 18:57:22]# renice -n -2 22552255 (进程 ID) 旧优先级为 10,新优先级为 -2[root@server ~ 18:57:28]# ps -o pid,nice,command 2255PID NI COMMAND2255 -2 md5sum /dev/zero[root@centos7 ~]$ pkill md5sum[1] 已终止 nice md5sum /dev/zero[2]- 已终止 nice -n -2 md5sum /dev/zero[3]+ 已终止 nice -n 2 md5sum /dev/zero
管理进程优先级-实时调度策略
chrt 命令用于获取和设置实时调度器进程优先级,以及更改进程调度器。
示例
# 查看进程优先级范围,chrt不能用于调整非实时进程nice值优先级。[root@centos7 ~]# chrt -mSCHED_OTHER min/max priority : 0/0SCHED_FIFO min/max priority : 1/99SCHED_RR min/max priority : 1/99SCHED_BATCH min/max priority : 0/0SCHED_IDLE min/max priority : 0/0SCHED_DEADLINE min/max priority : 0/0# 以SCHED_RR调度器和优先级为5运行md5sum进程[root@server ~ 14:20:59]# chrt -r 5 md5sum /dev/zero &[1] 2020[root@server ~ 14:24:10]# ps -o pid,cls,rtprio,command 2020PID CLS RTPRIO COMMAND2020 RR 5 md5sum /dev/zero# 修改进程调度器和优先级[root@server ~ 14:21:53]# chrt -f --pid 10 2020[root@server ~ 14:23:16]# ps -o pid,cls,rtprio,command 2020PID CLS RTPRIO COMMAND2020 FF 10 md5sum /dev/zero# 修改进程调度器为非实时[root@server ~ 14:23:25]# chrt -o --pid 0 2020[root@server ~ 14:24:03]# ps -o pid,cls,rtprio,command 2020PID CLS RTPRIO COMMAND2020 TS - md5sum /dev/zero