4. Linux 进程调度管理

进程调度器

进程调度器可粗略分为两类:

  • 实时调度器,系统中重要的进程由实时调度器调度,获得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 调整排序字段(按字段对应字母,如 %MEMm,回车确认)
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 的优先级数值)。
相关推荐
longerxin20203 小时前
在 Linux 上使用 SCP 将文件传输到 Windows(已开启 SSH)
linux·运维·ssh
zhaotiannuo_19985 小时前
渗透测试之docker
运维·docker·容器
王正南6 小时前
kali-linux 虚拟机连接安卓模拟器
android·linux·运维·虚拟机连接模拟器·安卓模拟器,linux虚拟机
Web极客码6 小时前
如何在Ubuntu服务器上安装和配置BIND9
服务器·数据库·ubuntu
三不原则6 小时前
故障案例:容器启动失败排查(AI运维场景)——从日志分析到根因定位
运维·人工智能·kubernetes
吳所畏惧6 小时前
Linux环境/麒麟V10SP3下离线安装Redis、修改默认密码并设置Redis开机自启动
linux·运维·服务器·redis·中间件·架构·ssh
yueguangni7 小时前
sysstat 版本 10.1.5 是 CentOS 7 的默认版本,默认情况下确实不显示 %wait 字段。需要升级到新版sysstat
linux·运维·centos
funfan05177 小时前
【运维】MySQL数据库全量备份与恢复实战指南:从入门到精通
运维·数据库·mysql
西***63477 小时前
全兼容・高安全:KVM 一站式服务器远程监控与管理指南
服务器
-dcr7 小时前
49.python自动化
运维·python·自动化