Linux内核调度优先级详解:如何优化你的系统性能

个人主页:chian-ocean

文章专栏-Linux

前言:

进程优先级调度是操作系统中的一种调度机制,其核心是为每个进程分配一个 优先级(Priority),然后根据优先级的高低决定进程执行的顺序和时间。这种机制确保了关键任务(优先级高)能够及时执行,而不那么重要的任务(优先级低)可能需要等待。

优先级调度

进程优先级调度是操作系统用来决定 哪个进程优先占用 CPU 的机制。它通过给每个进程分配一个 优先级值 ,优先级高的进程比优先级低的进程更早被调度运行。这种机制在 资源有限 的情况下,能够确保关键任务及时完成,同时提高系统的运行效率。

  • **优先级:**就是对资源访问优先的问题。
  • **存在的理由:**是由于CPU的资源不足。

Linux 中的PRI和NI

在 Linux 系统中,PRI(Priority)NI(Nice 值) 是两个与进程优先级相关的重要参数。它们共同影响进程在调度器中的调度顺序。以下是它们的关系和区别的详细说明:

bash 复制代码
ps -al | head - 1 ; ps ajx | grep <进程名>

PRI(Priority,优先级)

PRI 是进程的最终优先级值,由内核计算决定,直接影响调度器为进程分配 CPU 的顺序。

PRI 的范围
  • 实时任务:范围为 1 到 99,数值越小,优先级越高。
  • 普通任务:范围为 100 到 139,数值越小,优先级越高。
PRI 的计算公式

对于普通任务:

PRI=100+NI+动态调整值

  • NI 是进程的 Nice 值。
  • 动态调整值 是内核根据进程的运行情况动态计算的。
实时任务

实时任务的 PRI 只与其静态优先级有关,不会动态调整。

NI(Nice 值)

NI(Nice 值) 是用户空间设置的静态优先级,用于影响普通任务的 PRI。Nice 值的作用是调整进程的优先级,帮助用户控制某些任务的资源分配。

NI 的范围

Nice 值的范围为 -20 到 19

bash 复制代码
nice > -20   nice < 19
  • -20:最高优先级。
  • 19:最低优先级。
  • 默认值为 0
NI 的作用
  • Nice 值越低,进程优先级越高,进程更容易获得 CPU 时间。
  • Nice 值越高,进程优先级越低,进程更少占用 CPU。

**调整NI值(nice) **

在 Linux 系统中,可以通过 top 命令的交互模式来修改正在运行进程的 nice 值。这是一个方便的方式,无需退出 top 界面即可调整优先级。

启动 top 命令

bash 复制代码
top

你将看到系统中所有运行的进程列表。

找到目标进程

  • top 的输出中找到需要调整 nice 值的进程 PID
  • 使用快捷键 / 可以进行搜索。例如输入进程名称后按回车即可定位。

选择修改进程优先级的选项

  • 按下 r 键,top 会提示你输入目标进程的 PID。

输入目标进程的 PID

  • 根据提示,输入你需要修改的进程号(PID),然后按回车。

设置新的 nice

  • top 会提示你输入新的 nice 值。
  • 输入一个值(范围:-20 到 19),然后按回车。
  • 例如:
    • 输入 -10 提高优先级(需要 root 权限)。
    • 输入 10 降低优先级。
bash 复制代码
# 1. top
# 2. 按r
# 3. 输入基进程的PID
# 4. 输入修改的nice值

验证修改

  • top 界面中,找到对应的进程,检查其 NI 列(即 nice 值列)是否更新。
bash 复制代码
ps -al | head -1 && ps -al | grep <PID>or<进程名>

注意事项

  • 提高优先级(降低 nice 值)可能导致其他进程的响应变慢,因此要谨慎操作。

  • 普通用户尝试设置负值 nice(优先级提升)时,会提示权限不足。

执行

bash 复制代码
#普通用户的情况之下
1. top 2. r #设置nice值 
# 提示 permission denied

linux优先级调度策略

linux调度器的演变

Linux 调度器经历了多次改进,每次改进都更好地适应不同的应用场景:

  1. O(n) 调度器(早期 Linux 内核):简单但效率低。
  2. O(1) 调度器(Linux 2.6 引入):效率更高,但对实时性支持有限。
  3. 完全公平调度器(CFS)(Linux 2.6.23 引入):当前默认调度器,强调公平性和灵活性。

linux调度策略

Linux 内核为不同类型的任务设计了多种调度策略,分为实时调度策略普通调度策略

实时调度策略
  • SCHED_FIFO(先入先出)
    • 适用于高优先级、对时延敏感的任务。
    • 任务按照优先级依次调度,高优先级任务运行时不会被抢占,除非更高优先级任务出现。
  • SCHED_RR(轮转调度)
    • SCHED_FIFO基础上添加时间片机制,同一优先级的任务按时间片轮转。
    • 避免高优先级任务长期独占 CPU。
普通调度策略
  • SCHED_NORMAL(完全公平调度,CFS)
    • 默认调度策略,适用于大多数用户进程。
    • 核心是模拟"理想处理器",为每个任务公平分配 CPU 时间。
  • SCHED_BATCH
    • 针对批处理任务设计,减少交互性以提高 CPU 利用率。
  • SCHED_IDLE
    • 用于优先级最低的任务,仅在系统空闲时运行。

CFS 的核心机制(现行调度器)

CFS 的公平性由以下几个核心机制保证:

虚拟运行时间(vruntime)
  • vruntime 是 CFS 的关键指标,用于表示一个任务已经消耗的"虚拟 CPU 时间"。

  • 任务的 Nice 值

    决定 vruntime 的增长速度:

    • Nice 值低(优先级高):vruntime 增长慢,任务获得更多调度机会。
    • Nice 值高(优先级低):vruntime 增长快,任务获得较少调度机会。

计算公式:

math 复制代码
 \text{vruntime\_delta} = \text{实际运行时间} \times \text{权重因子} \

CFS 使用 红黑树 作为数据结构管理所有可运行的任务:

  • 红黑树的节点以任务的 vruntime 作为键值。
  • 树顶节点(vruntime 最小的任务)优先获得调度。
  • 任务完成一次时间片后,CFS 将更新该任务的 vruntime 并重新排序。
调度周期

CFS 按固定的时间间隔进行任务调度,每次调度会:

  1. 选择 vruntime 最小的任务运行。
  2. 更新任务的 vruntime。
  3. 将任务重新插入红黑树。

time 作为键值。

  • 树顶节点(vruntime 最小的任务)优先获得调度。
  • 任务完成一次时间片后,CFS 将更新该任务的 vruntime 并重新排序。
调度周期

CFS 按固定的时间间隔进行任务调度,每次调度会:

  1. 选择 vruntime 最小的任务运行。
  2. 更新任务的 vruntime。
  3. 将任务重新插入红黑树。
相关推荐
Jackey_Song_Odd24 分钟前
解决Ubuntu下无法装载 Windows D盘的问题
linux·ubuntu
Linux运维技术栈39 分钟前
Ansible(自动化运维)环境搭建及ansible-vault加密配置
运维·自动化·ansible
乔巴不是狸猫43 分钟前
第11周作业
linux
Bessssss2 小时前
centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!
linux·运维·centos
苹果醋32 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
jwensh2 小时前
【Jenkins】Declarative和Scripted两种脚本模式有什么具体的区别
运维·前端·jenkins
silver6872 小时前
Linux 下的 GPT 和 MBR 分区表详解
linux
R-sz3 小时前
14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误“
linux·python·centos
大熊程序猿3 小时前
xxl-job docker 安装
运维·docker·容器
code_abc3 小时前
Shell 脚本编程基础:变量
linux