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 的优先级数值)。
相关推荐
Skrrapper1 小时前
【计算机网络】ep1:物理层概述
服务器·网络·计算机网络
程序 代码狂人1 小时前
帆软-服务器器数据集权限配置
运维·服务器
博语小屋3 小时前
设计一个简单的网络计算器并将其守护进程化
linux·网络·tcp/ip
星火开发设计3 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识
喜欢吃燃面8 小时前
Linux:环境变量
linux·开发语言·学习
代码游侠8 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
Mr.朱鹏9 小时前
Nginx路由转发案例实战
java·运维·spring boot·nginx·spring·intellij-idea·jetty
java_logo9 小时前
OpenCode 企业级 Docker 部署完整指南
运维·docker·容器·opencode·opencode本地化部署·opencode部署手册·opencode部署方案
TTBIGDATA11 小时前
【knox】User: knox is not allowed to impersonate admin
大数据·运维·ambari·hdp·trino·knox·bigtop