Linux 进程调度管理

一、进程调度基础认知

1. 调度器核心作用

Linux 通过进程调度器分配 CPU 时间,实现 "多进程并发",核心平衡两个关键:

  • 按时间片轮转(默认 10-20ms / 片),保证进程公平使用 CPU
  • 按优先级分级,让重要进程获得更多 CPU 资源

2. 调度器分类与策略

实时调度器(高优先级进程专用)
  • 适用场景:系统关键进程,需快速响应
  • 支持策略:
    • SCHED_RR:同优先级进程轮流占用 CPU,默认时间片 0.1 秒
    • SCHED_FIFO:进程一旦运行,直到 IO 阻塞或被高优先级抢占
  • 优先级范围:1-99(数值越大优先级越高)
非实时调度器(普通进程专用)
  • 适用场景:大部分日常进程(如 Shell、应用程序)
  • 支持策略:
    • SCHED_NORMAL(SCHED_OTHER):标准时间共享调度
    • SCHED_BATCH:批量处理进程,减少调度竞争
    • SCHED_IDLE:最低优先级,仅 CPU 空闲时运行
  • 优先级控制:通过nice值调整,范围 - 20(最高)到 19(最低)

3. 关键优先级规则

  • 实时进程优先级 > 非实时进程优先级(即使最低实时进程也比最高 nice 值的非实时进程优先)
  • 无 CPU 竞争时,低优先级进程也能占用全部 CPU 资源

二、核心命令语法教学(含实战示例)

1. nice 命令:启动进程时设置 nice 值

语法格式

bash

复制代码
nice [OPTION] [COMMAND [ARG]...]
关键参数
  • -n, --adjustment=N:指定 nice 值调整量(默认 + 10)
  • 无 COMMAND 时:打印当前 Shell 的 nice 值
权限限制
  • 普通用户:仅能设置非负 nice 值(优先级降低)
  • root 用户:可设置 - 20 到 19 的任意 nice 值
实战示例

bash

复制代码
# 1. 默认调整(+10)启动进程
nice md5sum /dev/zero &  # 新进程nice值=0+10=10

# 2. 普通用户设置+2优先级
nice -n 2 md5sum /dev/zero &  # 新进程nice值=2

# 3. root用户设置-2高优先级(普通用户执行会报错)
sudo nice -n -2 md5sum /dev/zero &  # 新进程nice值=-2

2. renice 命令:调整已运行进程的 nice 值

语法格式

bash

复制代码
renice [-n] <priority> [-p <pid> | -g <pgid> | -u <user>]
关键参数
  • -n <priority>:目标 nice 值(必填)
  • -p <pid>:指定进程 ID(默认选项)
  • -g <pgid>:按进程组 ID 调整
  • -u <user>:按用户名 / 用户 ID 批量调整
权限限制
  • 普通用户:仅能升高 nice 值(降低优先级)
  • root 用户:可任意调整 nice 值(升高 / 降低)
实战示例

bash

复制代码
# 1. 调整单个进程(PID=55782)的nice值为2
renice -n 2 55782

# 2. 调整用户laoma所有进程的nice值为5
sudo renice -n 5 -u laoma

# 3. 普通用户尝试降低优先级(报错示例)
renice -n -2 55782  # 输出:Permission denied

3. chrt 命令:配置实时调度策略与优先级

语法格式

bash

复制代码
# 1. 启动进程时设置实时调度属性
chrt [选项] <优先级> <命令> [参数...]

# 2. 调整已运行进程的调度属性
chrt [选项] --pid <优先级> <pid>

# 3. 查看进程调度属性
chrt -p <pid>
关键参数
  • 调度策略选项:
    • -r, --rr:设置为 SCHED_RR(默认实时策略)
    • -f, --fifo:设置为 SCHED_FIFO
    • -o, --other:切换为非实时 SCHED_NORMAL 策略
    • -m, --max:查看各策略的优先级范围
  • 操作选项:
    • --pid <pid>:针对已运行进程操作
    • -v, --verbose:显示详细执行结果
权限限制
  • 仅 root 用户可设置实时调度策略
实战示例

bash

复制代码
# 1. 查看各调度策略的优先级范围
chrt -m

# 2. 以SCHED_RR策略(优先级5)启动进程
sudo chrt -r 5 md5sum /dev/zero &

# 3. 将已运行进程(PID=56225)改为SCHED_FIFO策略(优先级10)
sudo chrt -f --pid 10 56225

# 4. 查看进程调度属性
chrt -p 56225

# 5. 将实时进程切换为非实时策略
sudo chrt -o --pid 0 56225

4. 监控命令:查看进程优先级

(1)top 命令:实时监控
  • 启动命令:top
  • 关键字段解读:
    • PR:进程优先级(实时进程显示 "rt",非实时进程对应 nice 值映射)
    • NI:nice 值(-20 到 19)
  • 交互操作:在 top 界面按r,输入 PID 可直接修改 nice 值
(2)ps 命令:精准查询

bash

复制代码
# 查看进程的nice值和命令
ps -o pid,nice,command <pid>

# 查看实时进程的调度策略和优先级
ps -o pid,cls,rtprio,command <pid>
# 字段说明:cls=调度类型(RR/FF=实时,TS=非实时),rtprio=实时优先级

三、实时调度器系统参数配置

核心 sysctl 参数(控制实时进程 CPU 占用)

  • kernel.sched_rt_runtime_us:1 秒周期内实时进程可占用的 CPU 时间(默认 950000us=0.95 秒)

    • 设为 0:实时进程无法获取 CPU 时间
  • kernel.sched_rt_period_us:CPU 分配周期(默认 1000000us=1 秒)

  • 配置方法(临时生效): bash

    复制代码
    sudo sysctl -w kernel.sched_rt_runtime_us=800000
相关推荐
ai_xiaogui13 小时前
私有化部署大模型实战:PanelAI 一键搭建、Token 计费与多用户隔离
运维·私有化部署·大模型部署·大模型 token 计费·api key 统一管理·多用户实例隔离·应用市场一键部署
企鹅侠客13 小时前
Linux CPU 负载平均值(Load Average)详解:从原理到实践
linux·运维·服务器·服务器负载
易点云徐源14 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
吃一碗粉只付一碗钱14 小时前
10-令牌里的用户主键不要明文
服务器·数据库·sql·sqlserver·c#
木雷坞14 小时前
Baserow Docker部署:导入设备借用CSV,再用表单新增登记
运维·docker·容器
第404号工位14 小时前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构
Linux运维技术栈14 小时前
WAF部署在防火墙后面,获取不到真实IP怎么办?
服务器·网络·tcp/ip·安全·防火墙·waf
程序员大雄学编程14 小时前
crontab 脚本不写日志?我把 7 个原因在 Ubuntu 上逐个复现了一遍
运维
就像楞次定律14 小时前
【Linux 学习记之二】C++ 构建体系与底层链接机制的深度透视(1)
linux·后端
广目软件14 小时前
HA分布式架构采集节点变更操作手册20261029
运维·服务器·ansible·zabbix·prometheus