当前位置: 首页 > news >正文

【运维基础】Linux 进程调度管理

Linux 进程调度管理

进程调度器

现代计算机系统中既包含只有单个CPU且任何时候都只能处理单个指令的低端系统到具有几百个cpu、每个cpu有多个核心的高性能超级计算机,可以并行执行几百个指令。所有这些系统都有一个共同点:系统进程线程数量超出了CPU数量。

Linux系统看起来可以同时执行多个进程,多个进程轮流使用CPU。内核使用进程调度器决定如何分配CPU时间。为了更好地运行,进程调度器必须平衡不同的条件,快速决定下个执行的进程,确保进程获得公平的CPU时间:

  • 按时间片轮转(10-20ms为1个时间片 )
  • 按优先级调度,允许高优先级进程获取更多的共享CPU时间,低优先级进程获取更少的共享CPU时间。

在这里插入图片描述

在这里插入图片描述

实时调度器

实时调度器支持的调度策略:

  • SCHED_RR,roundrobin 轮训调度策略。相同优先级的进程轮流获取相同的CPU时间。
  • SCHED_FIFO,先入先出调度策略。被分配到的CPU时间的进程会一直运行,直到被IO阻塞(也称为sched_yield),会被高优先级进程抢占。

实时调度器管理的进程运行优先级范围如下:

在这里插入图片描述

即使系统运行实时调度程序,也要保持可响应状态,至少ssh可用。

管理员可以使用以下两个sysctl参数,阻止实时调度策略下运行的程序占用所有CPU时间:

  • kernel.sched_rt_runtime_us,在kernel.sched_rt_period_us内实时态进程可使用的共享CPU时间,默认值950000,也就是0.95秒。设置为0,实时调度进程将无法获取CPU时间。

  • kernel.sched_rt_period_us,CPU分配的周期时间,单位us,默认值1000000,也就是1秒。

    从kernel.sched_rt_period_us 中减去 kernel.sched_rt_runtime_us 后的剩余时间交给非实时调度器SCHED_NORMAL调度。

  • kernel.sched_rr_timeslice_ms,在SCHED_RR调度下的进程每次轮询获取的CPU时间,单位ms,默认值100,也就是0.1秒,有效范围1-100。

非实时调度器

非实时调度器支持的调度策略:

  • SCHED_NORMAL,标准的轮询方式时间共享调度,也称为SCHED_OTHER
  • SCHED_BATCH,针对批量方式执行的进程策略。不像 SCHED_NORMAL 频繁竞争,任务可以长时间运行。
  • SCHED_IDLE,用于执行非常低的优先级应用。使用 SCHED_IDLE 调度策略运行的进程比nice 19运行的进程优先级还低。

管理进程优先级-非实时调度策略

nice 值

常规系统上运行的大多数进程都使用 SCHED_OTHER 调度策略。由于并非所有进程都同等重要,因此可以为使用SCHED_OTHER调度策略运行的程序指定相对优先级,称为nice值。

有40种不同级别的nice值,范围 -20(最高优先级)到 19(最低优先级):

  • nice 值越高,代表优先级越低,获取CPU能力越弱。
  • nice 值越低,代表优先级越高,获取CPU能力越强。

注意: 当不存在CPU资源竞争时,即使nice值高的进程也可以获得足够CPU资源。

nice 值查看

top 命令

在这里插入图片描述

ps命令

[li@server ~ 19:10:58]$ 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。

[li@server ~ 19:23:39]$ md5sum /dev/zero &
[1] 68517
[li@server ~ 19:24:18]$ ps -o pid,nice,command $$ 68517PID  NI COMMAND60940   0 -bash68517   0 md5sum /dev/zero# $$ 代表当前终端中运行的 shell 程序 PID

实时调度器进程优先级和非实时调度器进程优先级对比如下:

在这里插入图片描述

结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。

nice 命令
[li@server ~ 19:24:34]$ nice --help
用法:nice [选项] [命令 [参数]...]
Run COMMAND with an adjusted niceness, which affects process scheduling.
With no COMMAND, print the current niceness.  Niceness values range from
-20 (most favorable to the process) to 19 (least favorable to the process).Mandatory arguments to long options are mandatory for short options too.-n, --adjustment=N   add integer N to the niceness (default 10)--help		显示此帮助信息并退出--version		显示版本信息并退出

示例:

# nice值默认是10
[li@server ~ 19:25:59]$ nice md5sum /dev/zero &
[2] 68730[li@server ~ 19:27:59]$ ps -o pid,nice,commandPID  NI COMMAND60940   0 -bash68517   0 md5sum /dev/zero68730  10 md5sum /dev/zero68736   0 ps -o pid,nice,command

普通用户仅允许使用正数的nice值运行程序。

# 设置一个负数优先级
[li@server ~ 19:28:05]$ nice -n -2 md5sum /dev/zero &
[3] 68797
[li@server ~ 19:29:09]$ nice: 无法设置优先级: 权限不够
^C
[li@server ~ 19:29:25]$ ps -o pid,nice,command 68797PID  NI COMMAND68797   0 md5sum /dev/zero# 设置一个正数优先级
[li@server ~ 19:29:35]$ nice -n 2 md5sum /dev/zero &
[4] 68869
[li@server ~ 19:30:02]$ ps -o pid,nice,command 68869PID  NI COMMAND68869   2 md5sum /dev/zero
renice 命令
[li@server ~ 19:30:19]$ renice --help用法:renice [-n] <优先级> [-p|--pid] <pid>...renice [-n] <优先级>  -g|--pgrp <pgid>...renice [-n] <优先级>  -u|--user <用户>...选项:-g, --pgrp <id>        将参数解释为进程组 ID-n, --priority <数字>  指定 nice 增加值-p, --pid <id>         将参数解释为进程 ID (默认)-u, --user <name|id>   将参数解释为用户名或用户 ID-h, --help             显示帮助文本并退出-V, --version          显示版本信息并退出

修改上面示例中产生的进程的优先级。

[li@server ~ 19:30:53]$ renice -n 2 68797
68797 (进程 ID) 旧优先级为 0,新优先级为 2
[li@server ~ 19:31:55]$ ps -o pid,nice,command 68797PID  NI COMMAND68797   2 md5sum /dev/zero# 使用root用户调整
[root@server ~ 19:12:42]# renice -n -2 68797
68797 (进程 ID) 旧优先级为 2,新优先级为 -2
[root@server ~ 19:32:57]# renice -n -2 68869
68869 (进程 ID) 旧优先级为 2,新优先级为 -2
[root@server ~ 19:33:30]# ps -o pid,nice,command 68797 68869PID  NI COMMAND68797  -2 md5sum /dev/zero68869  -2 md5sum /dev/zero
top 命令

top 界面查看进程CPU使用率:68797和68869,CPU使用率非常接近,因为优先级一致。

在这里插入图片描述

在该界面中使用 r 指令设置进程nice值。

终止之前创建的4个md5sum进程。

[li@server ~ 19:32:25]$ pkill md5sum
[1]   已终止               md5sum /dev/zero
[2]   已终止               nice md5sum /dev/zero
[4]+  已终止               nice -n 2 md5sum /dev/zero
[3]+  已终止               nice -n -2 md5sum /dev/zero

管理进程优先级-实时调度策略

chrt 命令用于获取和设置实时调度器进程优先级,以及更改进程调度器。

[root@server ~ 19:35:46]# chrt --help
Show or change the real-time scheduling attributes of a process.Set policy:chrt [options] <priority> <command> [<arg>...]chrt [options] --pid <priority> <pid>Get policy:chrt [options] -p <pid>Policy options:-b, --batch          set policy to SCHED_BATCH-d, --deadline       set policy to SCHED_DEADLINE-f, --fifo           set policy to SCHED_FIFO-i, --idle           set policy to SCHED_IDLE-o, --other          set policy to SCHED_OTHER-r, --rr             set policy to SCHED_RR (default)Scheduling options:-R, --reset-on-fork       set SCHED_RESET_ON_FORK for FIFO or RR-T, --sched-runtime <ns>  runtime parameter for DEADLINE-P, --sched-period <ns>   period parameter for DEADLINE-D, --sched-deadline <ns> deadline parameter for DEADLINEOther options:-a, --all-tasks      operate on all the tasks (threads) for a given pid-m, --max            show min and max valid priorities-p, --pid            operate on existing given pid-v, --verbose        display status information-h, --help     显示此帮助并退出-V, --version  输出版本信息并退出更多信息请参阅 chrt(1)

示例:

# 查看进程优先级范围,chrt不能用于调整非实时进程nice值优先级。
[root@server ~ 19:37:16]# 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 ~ 19:38:40]# chrt -r 5 md5sum /dev/zero &
[2] 69391
[root@server ~ 19:39:03]# ps -o pid,cls,rtprio,command 69391PID CLS RTPRIO COMMAND69391  RR      5 md5sum /dev/zero# 修改进程调度器和优先级
[root@server ~ 19:39:17]# chrt -f --pid 10 69391
[root@server ~ 19:39:55]# ps -o pid,cls,rtprio,command 69391PID CLS RTPRIO COMMAND69391  FF     10 md5sum /dev/zero# 修改进程调度器为非实时
[root@server ~ 19:40:05]# chrt -o --pid 0 69391
[root@server ~ 19:40:33]# ps -o pid,cls,rtprio,command 69391PID CLS RTPRIO COMMAND69391  TS      - md5sum /dev/zero
http://www.dtcms.com/a/308097.html

相关文章:

  • 异步I/O和同步I/O
  • USRP捕获手机/路由器数据传输信号波形(下)
  • 金融专题|某跨境支付机构:以榫卯企业云平台 VPC 功能保障业务主体安全
  • 文档识别算法-文字识别接口-表格还原-图表文字识别API
  • HCIA-Datacom认证笔记:IP路由基础——核心概念与路由分类
  • Amazon Aurora MySQL 8.0 完整指南
  • 一些利用AIOps工具进行云原生技术持续创新的成功案例
  • Python 元编程实战:动态属性与数据结构转换技巧
  • Pycaita二次开发基础代码解析:曲面法线生成、零件加载与材料应用
  • 基于LSTM-GRU混合网络的动态解析:美联储维稳政策与黄金单日跌1.5%的非线性关联
  • AI陪伴的发展现状
  • STM32——HAL 库MDK工程创建
  • 2000-2024年中国1KM分辨率年度植被指数(NDVI、EVI)数据集
  • 万物都有属于自己的律动
  • 公路坑槽检测分析原理和思路
  • 嵌入式开发学习———Linux环境下IO进程线程学习(一)
  • 【0基础PS】Photoshop (PS) 理论知识
  • linux线程互斥和同步
  • 操作系统系统面试常问(内存、快表、相关知识)
  • 中欧建交50周年,中硼医疗领衔中意BNCT合作月,中国尖端技术出海欧洲
  • main函数,常量指针与指针常量,野指针等,void与void的区别
  • Kubernetes 应用部署实战:为什么需要 Kubernetes?
  • Apache Tomcat样例目录session操纵漏洞解读
  • Import Maps 实战指南:无需打包器,浏览器原生模块路径重映射!
  • python 检查带有标题行,以逗号为分隔符的文本文件
  • Vue 的双向数据绑定原理
  • 自我学习----绘制Mark点
  • 解决Pycharm内存一直升高卡死、反应慢、CPU占用高
  • 《通信原理》学习笔记——第六章
  • IntelliJ IDEA 的常用快捷键