Linux Process Scheduling 学习计划
🎯 学习目标
- 理解 Linux 内核的进程调度机制
- 掌握不同调度策略:CFS、实时调度、Deadline
- 学会使用工具分析调度情况:
top
,htop
,ps
,perf
,ftrace
- 能够定位调度瓶颈和优化进程调度性能
-
[Linux Process Scheduling 学习计划](#Linux Process Scheduling 学习计划 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92")
-
[🎯 学习目标](#🎯 学习目标 "#dart-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87")
-
[📅 学习计划(约 10 天)](#📅 学习计划(约 10 天) "#date-%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92%E7%BA%A6-10-%E5%A4%A9")
- [Day 1 -- Linux 进程模型概述](#Day 1 – Linux 进程模型概述 "#day-1-linux-%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9E%8B%E6%A6%82%E8%BF%B0")
- [Day 2 -- 调度器概念](#Day 2 – 调度器概念 "#day-2-%E8%B0%83%E5%BA%A6%E5%99%A8%E6%A6%82%E5%BF%B5")
- [Day 3 -- CFS (Completely Fair Scheduler)](#Day 3 – CFS (Completely Fair Scheduler) "#day-3-cfs-completely-fair-scheduler")
- [Day 4 -- 实时调度策略](#Day 4 – 实时调度策略 "#day-4-%E5%AE%9E%E6%97%B6%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5")
- [Day 5 -- 时间片与优先级](#Day 5 – 时间片与优先级 "#day-5-%E6%97%B6%E9%97%B4%E7%89%87%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7")
- [Day 6 -- 调度统计工具](#Day 6 – 调度统计工具 "#day-6-%E8%B0%83%E5%BA%A6%E7%BB%9F%E8%AE%A1%E5%B7%A5%E5%85%B7")
- [Day 7 -- ftrace 调度追踪](#Day 7 – ftrace 调度追踪 "#day-7-ftrace-%E8%B0%83%E5%BA%A6%E8%BF%BD%E8%B8%AA")
- [Day 8 -- 多核调度](#Day 8 – 多核调度 "#day-8-%E5%A4%9A%E6%A0%B8%E8%B0%83%E5%BA%A6")
- [Day 9 -- 调度调优](#Day 9 – 调度调优 "#day-9-%E8%B0%83%E5%BA%A6%E8%B0%83%E4%BC%98")
- [Day 10 -- 综合案例](#Day 10 – 综合案例 "#day-10-%E7%BB%BC%E5%90%88%E6%A1%88%E4%BE%8B")
-
[✅ 学习成果](#✅ 学习成果 "#white_check_mark-%E5%AD%A6%E4%B9%A0%E6%88%90%E6%9E%9C")
-
-
[Linux Process Scheduling 学习手册 - Day 1](#Linux Process Scheduling 学习手册 - Day 1 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-1")
-
[主题:Linux 进程模型概述](#主题:Linux 进程模型概述 "#%E4%B8%BB%E9%A2%98linux-%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9E%8B%E6%A6%82%E8%BF%B0")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3")
- [2.1 进程 vs 线程](#2.1 进程 vs 线程 "#21-%E8%BF%9B%E7%A8%8B-vs-%E7%BA%BF%E7%A8%8B")
- [2.2 task_struct](#2.2 task_struct "#22-task_struct")
- [2.3 用户态 vs 内核态](#2.3 用户态 vs 内核态 "#23-%E7%94%A8%E6%88%B7%E6%80%81-vs-%E5%86%85%E6%A0%B8%E6%80%81")
-
[3. 图解:进程与线程](#3. 图解:进程与线程 "#3-%E5%9B%BE%E8%A7%A3%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4")
- [4.1 查看进程信息](#4.1 查看进程信息 "#41-%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E4%BF%A1%E6%81%AF")
- [4.2 查看进程树](#4.2 查看进程树 "#42-%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E6%A0%91")
- [4.3 查看 task_struct 信息(可选)](#4.3 查看 task_struct 信息(可选) "#43-%E6%9F%A5%E7%9C%8B-task_struct-%E4%BF%A1%E6%81%AF%E5%8F%AF%E9%80%89")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98")
-
[7. Day 1 总结](#7. Day 1 总结 "#7-day-1-%E6%80%BB%E7%BB%93")
-
-
[Linux Process Scheduling 学习手册 - Day 2](#Linux Process Scheduling 学习手册 - Day 2 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-2")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-2")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-2")
- [2.1 调度器作用](#2.1 调度器作用 "#21-%E8%B0%83%E5%BA%A6%E5%99%A8%E4%BD%9C%E7%94%A8")
- [2.2 调度决策](#2.2 调度决策 "#22-%E8%B0%83%E5%BA%A6%E5%86%B3%E7%AD%96")
- [2.3 时间片(Timeslice)](#2.3 时间片(Timeslice) "#23-%E6%97%B6%E9%97%B4%E7%89%87timeslice")
- [2.4 进程状态](#2.4 进程状态 "#24-%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81")
-
[3. 图解:调度流程](#3. 图解:调度流程 "#3-%E5%9B%BE%E8%A7%A3%E8%B0%83%E5%BA%A6%E6%B5%81%E7%A8%8B")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-2")
- [4.1 查看系统调度信息](#4.1 查看系统调度信息 "#41-%E6%9F%A5%E7%9C%8B%E7%B3%BB%E7%BB%9F%E8%B0%83%E5%BA%A6%E4%BF%A1%E6%81%AF")
- [4.2 使用 top/htop 观察](#4.2 使用 top/htop 观察 "#42-%E4%BD%BF%E7%94%A8-tophtop-%E8%A7%82%E5%AF%9F")
- [4.3 模拟 CPU 负载](#4.3 模拟 CPU 负载 "#43-%E6%A8%A1%E6%8B%9F-cpu-%E8%B4%9F%E8%BD%BD")
- [4.4 清理实验](#4.4 清理实验 "#44-%E6%B8%85%E7%90%86%E5%AE%9E%E9%AA%8C")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-2")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-2")
-
[7. Day 2 总结](#7. Day 2 总结 "#7-day-2-%E6%80%BB%E7%BB%93")
-
[Linux Process Scheduling 学习手册 - Day 3](#Linux Process Scheduling 学习手册 - Day 3 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-3")
-
[主题:CFS (Completely Fair Scheduler)](#主题:CFS (Completely Fair Scheduler) "#%E4%B8%BB%E9%A2%98cfs-completely-fair-scheduler")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-3")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-3")
- [2.1 CFS 调度器概述](#2.1 CFS 调度器概述 "#21-cfs-%E8%B0%83%E5%BA%A6%E5%99%A8%E6%A6%82%E8%BF%B0")
- [2.2 vruntime](#2.2 vruntime "#22-vruntime")
- [2.3 CFS 红黑树](#2.3 CFS 红黑树 "#23-cfs-%E7%BA%A2%E9%BB%91%E6%A0%91")
- [2.4 调度周期](#2.4 调度周期 "#24-%E8%B0%83%E5%BA%A6%E5%91%A8%E6%9C%9F")
-
[3. 图解:CFS 调度流程](#3. 图解:CFS 调度流程 "#3-%E5%9B%BE%E8%A7%A3cfs-%E8%B0%83%E5%BA%A6%E6%B5%81%E7%A8%8B")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-3")
-
[4.1 查看调度策略](#4.1 查看调度策略 "#41-%E6%9F%A5%E7%9C%8B%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5")
-
[4.2 修改进程调度策略](#4.2 修改进程调度策略 "#42-%E4%BF%AE%E6%94%B9%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5")
- [4.2.1 CFS 默认调度](#4.2.1 CFS 默认调度 "#421-cfs-%E9%BB%98%E8%AE%A4%E8%B0%83%E5%BA%A6")
- [4.2.2 修改 nice 值](#4.2.2 修改 nice 值 "#422-%E4%BF%AE%E6%94%B9-nice-%E5%80%BC")
-
[4.3 创建 CPU 占用进程](#4.3 创建 CPU 占用进程 "#43-%E5%88%9B%E5%BB%BA-cpu-%E5%8D%A0%E7%94%A8%E8%BF%9B%E7%A8%8B")
-
[4.4 查看 vruntime(可选内核调试)](#4.4 查看 vruntime(可选内核调试) "#44-%E6%9F%A5%E7%9C%8B-vruntime%E5%8F%AF%E9%80%89%E5%86%85%E6%A0%B8%E8%B0%83%E8%AF%95")
-
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-3")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-3")
-
[7. Day 3 总结](#7. Day 3 总结 "#7-day-3-%E6%80%BB%E7%BB%93")
-
-
[Linux Process Scheduling 学习手册 - Day 4](#Linux Process Scheduling 学习手册 - Day 4 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-4")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-4")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-4")
- [2.1 Linux 实时调度概览](#2.1 Linux 实时调度概览 "#21-linux-%E5%AE%9E%E6%97%B6%E8%B0%83%E5%BA%A6%E6%A6%82%E8%A7%88")
- [2.2 SCHED_FIFO 特性](#2.2 SCHED_FIFO 特性 "#22-sched_fifo-%E7%89%B9%E6%80%A7")
- [2.3 SCHED_RR 特性](#2.3 SCHED_RR 特性 "#23-sched_rr-%E7%89%B9%E6%80%A7")
- [2.4 SCHED_DEADLINE 特性](#2.4 SCHED_DEADLINE 特性 "#24-sched_deadline-%E7%89%B9%E6%80%A7")
-
[3. 图解:实时调度示意](#3. 图解:实时调度示意 "#3-%E5%9B%BE%E8%A7%A3%E5%AE%9E%E6%97%B6%E8%B0%83%E5%BA%A6%E7%A4%BA%E6%84%8F")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-4")
-
[4.1 查看当前调度策略](#4.1 查看当前调度策略 "#41-%E6%9F%A5%E7%9C%8B%E5%BD%93%E5%89%8D%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5")
-
[4.2 设置实时任务](#4.2 设置实时任务 "#42-%E8%AE%BE%E7%BD%AE%E5%AE%9E%E6%97%B6%E4%BB%BB%E5%8A%A1")
- [4.2.1 SCHED_FIFO](#4.2.1 SCHED_FIFO "#421-sched_fifo")
- [4.2.2 SCHED_RR](#4.2.2 SCHED_RR "#422-sched_rr")
- [4.2.3 查看修改结果](#4.2.3 查看修改结果 "#423-%E6%9F%A5%E7%9C%8B%E4%BF%AE%E6%94%B9%E7%BB%93%E6%9E%9C")
-
[4.3 创建 CPU 占用任务](#4.3 创建 CPU 占用任务 "#43-%E5%88%9B%E5%BB%BA-cpu-%E5%8D%A0%E7%94%A8%E4%BB%BB%E5%8A%A1")
-
[4.4 使用 SCHED_DEADLINE(可选,高版本内核)](#4.4 使用 SCHED_DEADLINE(可选,高版本内核) "#44-%E4%BD%BF%E7%94%A8-sched_deadline%E5%8F%AF%E9%80%89%E9%AB%98%E7%89%88%E6%9C%AC%E5%86%85%E6%A0%B8")
-
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-4")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-4")
-
[7. Day 4 总结](#7. Day 4 总结 "#7-day-4-%E6%80%BB%E7%BB%93")
-
[Linux Process Scheduling 学习手册 - Day 5](#Linux Process Scheduling 学习手册 - Day 5 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-5")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-5")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-5")
- [2.1 静态优先级与动态优先级](#2.1 静态优先级与动态优先级 "#21-%E9%9D%99%E6%80%81%E4%BC%98%E5%85%88%E7%BA%A7%E4%B8%8E%E5%8A%A8%E6%80%81%E4%BC%98%E5%85%88%E7%BA%A7")
- [2.2 nice 值与权重](#2.2 nice 值与权重 "#22-nice-%E5%80%BC%E4%B8%8E%E6%9D%83%E9%87%8D")
- [2.3 时间片计算(CFS)](#2.3 时间片计算(CFS) "#23-%E6%97%B6%E9%97%B4%E7%89%87%E8%AE%A1%E7%AE%97cfs")
-
[3. 图解:nice 值对 CPU 分配的影响](#3. 图解:nice 值对 CPU 分配的影响 "#3-%E5%9B%BE%E8%A7%A3nice-%E5%80%BC%E5%AF%B9-cpu-%E5%88%86%E9%85%8D%E7%9A%84%E5%BD%B1%E5%93%8D")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-5")
- [4.1 查看进程优先级](#4.1 查看进程优先级 "#41-%E6%9F%A5%E7%9C%8B%E8%BF%9B%E7%A8%8B%E4%BC%98%E5%85%88%E7%BA%A7")
- [4.2 调整 nice 值](#4.2 调整 nice 值 "#42-%E8%B0%83%E6%95%B4-nice-%E5%80%BC")
- [4.3 创建多进程 CPU 占用实验](#4.3 创建多进程 CPU 占用实验 "#43-%E5%88%9B%E5%BB%BA%E5%A4%9A%E8%BF%9B%E7%A8%8B-cpu-%E5%8D%A0%E7%94%A8%E5%AE%9E%E9%AA%8C")
- [4.4 分配不同 nice 值观察](#4.4 分配不同 nice 值观察 "#44-%E5%88%86%E9%85%8D%E4%B8%8D%E5%90%8C-nice-%E5%80%BC%E8%A7%82%E5%AF%9F")
- [4.5 使用 top 观察调度情况](#4.5 使用 top 观察调度情况 "#45-%E4%BD%BF%E7%94%A8-top-%E8%A7%82%E5%AF%9F%E8%B0%83%E5%BA%A6%E6%83%85%E5%86%B5")
- [4.6 清理实验](#4.6 清理实验 "#46-%E6%B8%85%E7%90%86%E5%AE%9E%E9%AA%8C")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-5")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-5")
-
[7. Day 5 总结](#7. Day 5 总结 "#7-day-5-%E6%80%BB%E7%BB%93")
-
[Linux Process Scheduling 学习手册 - Day 6](#Linux Process Scheduling 学习手册 - Day 6 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-6")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-6")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-6")
- [2.1 常用工具概览](#2.1 常用工具概览 "#21-%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E6%A6%82%E8%A7%88")
- [2.2 调度指标解释](#2.2 调度指标解释 "#22-%E8%B0%83%E5%BA%A6%E6%8C%87%E6%A0%87%E8%A7%A3%E9%87%8A")
-
[3. 图解:调度统计观察](#3. 图解:调度统计观察 "#3-%E5%9B%BE%E8%A7%A3%E8%B0%83%E5%BA%A6%E7%BB%9F%E8%AE%A1%E8%A7%82%E5%AF%9F")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-6")
- [4.1 top / htop](#4.1 top / htop "#41-top-htop")
- [4.2 ps 静态快照](#4.2 ps 静态快照 "#42-ps-%E9%9D%99%E6%80%81%E5%BF%AB%E7%85%A7")
- [4.3 vmstat / sar](#4.3 vmstat / sar "#43-vmstat-sar")
- [4.4 perf sched](#4.4 perf sched "#44-perf-sched")
- [4.5 ftrace sched_switch](#4.5 ftrace sched_switch "#45-ftrace-sched_switch")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-6")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-6")
-
[7. Day 6 总结](#7. Day 6 总结 "#7-day-6-%E6%80%BB%E7%BB%93")
-
[Linux Process Scheduling 学习手册 - Day 7](#Linux Process Scheduling 学习手册 - Day 7 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-7")
-
[主题:ftrace 调度追踪](#主题:ftrace 调度追踪 "#%E4%B8%BB%E9%A2%98ftrace-%E8%B0%83%E5%BA%A6%E8%BF%BD%E8%B8%AA")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-7")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-7")
- [2.1 ftrace 概述](#2.1 ftrace 概述 "#21-ftrace-%E6%A6%82%E8%BF%B0")
- [2.2 调度相关事件](#2.2 调度相关事件 "#22-%E8%B0%83%E5%BA%A6%E7%9B%B8%E5%85%B3%E4%BA%8B%E4%BB%B6")
- [2.3 调度分析意义](#2.3 调度分析意义 "#23-%E8%B0%83%E5%BA%A6%E5%88%86%E6%9E%90%E6%84%8F%E4%B9%89")
-
[3. 图解:ftrace 调度追踪](#3. 图解:ftrace 调度追踪 "#3-%E5%9B%BE%E8%A7%A3ftrace-%E8%B0%83%E5%BA%A6%E8%BF%BD%E8%B8%AA")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-7")
- [4.1 打开 ftrace](#4.1 打开 ftrace "#41-%E6%89%93%E5%BC%80-ftrace")
- [4.2 设置追踪事件](#4.2 设置追踪事件 "#42-%E8%AE%BE%E7%BD%AE%E8%BF%BD%E8%B8%AA%E4%BA%8B%E4%BB%B6")
- [4.3 创建 CPU 占用任务](#4.3 创建 CPU 占用任务 "#43-%E5%88%9B%E5%BB%BA-cpu-%E5%8D%A0%E7%94%A8%E4%BB%BB%E5%8A%A1-2")
- [4.4 查看 trace](#4.4 查看 trace "#44-%E6%9F%A5%E7%9C%8B-trace")
- [4.5 关闭 trace](#4.5 关闭 trace "#45-%E5%85%B3%E9%97%AD-trace")
- [4.6 分析 trace](#4.6 分析 trace "#46-%E5%88%86%E6%9E%90-trace")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-7")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-7")
-
[7. Day 7 总结](#7. Day 7 总结 "#7-day-7-%E6%80%BB%E7%BB%93")
-
-
[Linux Process Scheduling 学习手册 - Day 8](#Linux Process Scheduling 学习手册 - Day 8 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-8")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-8")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-8")
- [2.1 多核调度概览](#2.1 多核调度概览 "#21-%E5%A4%9A%E6%A0%B8%E8%B0%83%E5%BA%A6%E6%A6%82%E8%A7%88")
- [2.2 CPU local vs global](#2.2 CPU local vs global "#22-cpu-local-vs-global")
- [2.3 多核调度挑战](#2.3 多核调度挑战 "#23-%E5%A4%9A%E6%A0%B8%E8%B0%83%E5%BA%A6%E6%8C%91%E6%88%98")
-
[3. 图解:多核调度与负载均衡](#3. 图解:多核调度与负载均衡 "#3-%E5%9B%BE%E8%A7%A3%E5%A4%9A%E6%A0%B8%E8%B0%83%E5%BA%A6%E4%B8%8E%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-8")
- [4.1 查看每个 CPU runqueue](#4.1 查看每个 CPU runqueue "#41-%E6%9F%A5%E7%9C%8B%E6%AF%8F%E4%B8%AA-cpu-runqueue")
- [4.2 创建多核 CPU 占用任务](#4.2 创建多核 CPU 占用任务 "#42-%E5%88%9B%E5%BB%BA%E5%A4%9A%E6%A0%B8-cpu-%E5%8D%A0%E7%94%A8%E4%BB%BB%E5%8A%A1")
- [4.3 使用 top / htop 观察多核负载](#4.3 使用 top / htop 观察多核负载 "#43-%E4%BD%BF%E7%94%A8-top-htop-%E8%A7%82%E5%AF%9F%E5%A4%9A%E6%A0%B8%E8%B4%9F%E8%BD%BD")
- [4.4 使用 perf sched 或 ftrace 观察任务迁移](#4.4 使用 perf sched 或 ftrace 观察任务迁移 "#44-%E4%BD%BF%E7%94%A8-perf-sched-%E6%88%96-ftrace-%E8%A7%82%E5%AF%9F%E4%BB%BB%E5%8A%A1%E8%BF%81%E7%A7%BB")
- [4.5 优化观察](#4.5 优化观察 "#45-%E4%BC%98%E5%8C%96%E8%A7%82%E5%AF%9F")
- [4.6 清理实验](#4.6 清理实验 "#46-%E6%B8%85%E7%90%86%E5%AE%9E%E9%AA%8C-2")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-8")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-8")
-
[7. Day 8 总结](#7. Day 8 总结 "#7-day-8-%E6%80%BB%E7%BB%93")
-
[Linux Process Scheduling 学习手册 - Day 9](#Linux Process Scheduling 学习手册 - Day 9 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-9")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-9")
-
[2. 理论讲解](#2. 理论讲解 "#2-%E7%90%86%E8%AE%BA%E8%AE%B2%E8%A7%A3-9")
- [2.1 性能瓶颈来源](#2.1 性能瓶颈来源 "#21-%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88%E6%9D%A5%E6%BA%90")
- [2.2 调度优化策略](#2.2 调度优化策略 "#22-%E8%B0%83%E5%BA%A6%E4%BC%98%E5%8C%96%E7%AD%96%E7%95%A5")
- [2.3 结合工具分析](#2.3 结合工具分析 "#23-%E7%BB%93%E5%90%88%E5%B7%A5%E5%85%B7%E5%88%86%E6%9E%90")
-
[3. 图解:调度优化流程](#3. 图解:调度优化流程 "#3-%E5%9B%BE%E8%A7%A3%E8%B0%83%E5%BA%A6%E4%BC%98%E5%8C%96%E6%B5%81%E7%A8%8B")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-9")
- [4.1 创建高 CPU 占用任务](#4.1 创建高 CPU 占用任务 "#41-%E5%88%9B%E5%BB%BA%E9%AB%98-cpu-%E5%8D%A0%E7%94%A8%E4%BB%BB%E5%8A%A1")
- [4.2 观察基线](#4.2 观察基线 "#42-%E8%A7%82%E5%AF%9F%E5%9F%BA%E7%BA%BF")
- [4.3 调整 nice 值](#4.3 调整 nice 值 "#43-%E8%B0%83%E6%95%B4-nice-%E5%80%BC")
- [4.4 CPU 绑定实验](#4.4 CPU 绑定实验 "#44-cpu-%E7%BB%91%E5%AE%9A%E5%AE%9E%E9%AA%8C")
- [4.5 实时任务优先级](#4.5 实时任务优先级 "#45-%E5%AE%9E%E6%97%B6%E4%BB%BB%E5%8A%A1%E4%BC%98%E5%85%88%E7%BA%A7")
- [4.6 分析 perf / ftrace 输出](#4.6 分析 perf / ftrace 输出 "#46-%E5%88%86%E6%9E%90-perf-ftrace-%E8%BE%93%E5%87%BA")
- [4.7 清理实验](#4.7 清理实验 "#47-%E6%B8%85%E7%90%86%E5%AE%9E%E9%AA%8C")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-9")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-9")
-
[7. Day 9 总结](#7. Day 9 总结 "#7-day-9-%E6%80%BB%E7%BB%93")
-
[Linux Process Scheduling 学习手册 - Day 10](#Linux Process Scheduling 学习手册 - Day 10 "#linux-process-scheduling-%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C-day-10")
-
[1. 学习目标](#1. 学习目标 "#1-%E5%AD%A6%E4%B9%A0%E7%9B%AE%E6%A0%87-10")
-
[2. 理论回顾](#2. 理论回顾 "#2-%E7%90%86%E8%AE%BA%E5%9B%9E%E9%A1%BE")
-
[3. 图解:综合实验示意](#3. 图解:综合实验示意 "#3-%E5%9B%BE%E8%A7%A3%E7%BB%BC%E5%90%88%E5%AE%9E%E9%AA%8C%E7%A4%BA%E6%84%8F")
-
[4. 实验步骤](#4. 实验步骤 "#4-%E5%AE%9E%E9%AA%8C%E6%AD%A5%E9%AA%A4-10")
- [4.1 创建实验任务](#4.1 创建实验任务 "#41-%E5%88%9B%E5%BB%BA%E5%AE%9E%E9%AA%8C%E4%BB%BB%E5%8A%A1")
- [4.2 分配不同调度策略和优先级](#4.2 分配不同调度策略和优先级 "#42-%E5%88%86%E9%85%8D%E4%B8%8D%E5%90%8C%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7")
- [4.3 CPU 绑定实验](#4.3 CPU 绑定实验 "#43-cpu-%E7%BB%91%E5%AE%9A%E5%AE%9E%E9%AA%8C")
- [4.4 启动调度追踪](#4.4 启动调度追踪 "#44-%E5%90%AF%E5%8A%A8%E8%B0%83%E5%BA%A6%E8%BF%BD%E8%B8%AA")
- [4.5 运行实验并收集数据](#4.5 运行实验并收集数据 "#45-%E8%BF%90%E8%A1%8C%E5%AE%9E%E9%AA%8C%E5%B9%B6%E6%94%B6%E9%9B%86%E6%95%B0%E6%8D%AE")
- [4.6 分析结果](#4.6 分析结果 "#46-%E5%88%86%E6%9E%90%E7%BB%93%E6%9E%9C")
- [4.7 优化策略](#4.7 优化策略 "#47-%E4%BC%98%E5%8C%96%E7%AD%96%E7%95%A5")
- [4.8 再次观察](#4.8 再次观察 "#48-%E5%86%8D%E6%AC%A1%E8%A7%82%E5%AF%9F")
- [4.9 清理实验](#4.9 清理实验 "#49-%E6%B8%85%E7%90%86%E5%AE%9E%E9%AA%8C")
-
[5. 输出解析](#5. 输出解析 "#5-%E8%BE%93%E5%87%BA%E8%A7%A3%E6%9E%90-10")
-
[6. 思考题](#6. 思考题 "#6-%E6%80%9D%E8%80%83%E9%A2%98-10")
-
[7. Day 10 总结](#7. Day 10 总结 "#7-day-10-%E6%80%BB%E7%BB%93")
📅 学习计划(约 10 天)
Day 1 -- Linux 进程模型概述
目标:理解进程、线程和任务结构
-
理论:
task_struct
结构体- PID, TGID, thread group
- 用户态 vs 内核态
-
实验:
ps -efT
查看线程信息pstree -p
查看进程树
-
思考题:
- Linux 线程和进程的区别?
- 线程共享哪些资源?
Day 2 -- 调度器概念
目标:理解调度器基本概念
-
理论:
- 调度目标:公平性、响应性、吞吐量
- 调度决策:选择哪个进程运行
- 时间片、优先级
-
图解:
- Run Queue、Task States (RUNNABLE, RUNNING, SLEEPING, etc.)
-
思考题:
- 什么是可抢占性?
- Linux 如何保证实时进程优先?
Day 3 -- CFS (Completely Fair Scheduler)
目标:掌握 Linux 默认调度器
-
理论:
- 虚拟运行时间 (
vruntime
) - 红黑树 (RB tree) 管理可运行任务
- 时间片计算
- 虚拟运行时间 (
-
实验:
chrt -p
查看/修改调度策略- 使用
schedtool
观察调度行为
-
思考题:
- CFS 如何实现"公平"?
- vruntime 如何影响任务调度顺序?
Day 4 -- 实时调度策略
目标:理解 SCHED_FIFO、SCHED_RR、SCHED_DEADLINE
-
理论:
- FIFO:先到先服务
- RR:循环分配时间片
- DEADLINE:保证截止时间
-
实验:
chrt -f -p <pid>
设置 FIFOchrt -r -p <pid>
设置 RR
-
思考题:
- 实时策略的优先级规则是什么?
- 若实时任务长时间占用 CPU,普通任务会怎样?
Day 5 -- 时间片与优先级
目标:理解静态优先级 vs 动态优先级
-
理论:
- nice 值与调度优先级
- CFS 对 nice 的处理
- 实时任务优先级范围
-
实验:
- 使用
nice
调整普通任务优先级 - 使用
top
观察调度变化
- 使用
-
思考题:
- nice 值为 -20 的进程和 +19 的进程谁更先运行?为什么?
Day 6 -- 调度统计工具
目标:掌握观察调度行为的工具
-
工具:
top
/htop
ps -eo pid,comm,ni,pri,rtprio,stat
vmstat
/sar -q
perf sched
分析调度事件
-
实验:
- 监控高 CPU 负载下的进程调度
- 使用
perf sched record
+perf sched latency
-
思考题:
- 如何判断 CPU 负载是由哪个进程主导的?
Day 7 -- ftrace 调度追踪
目标:内核层面跟踪调度事件
-
理论:
sched_switch
,sched_wakeup
tracepoints- ftrace buffer 及过滤方法
-
实验:
- 打开 ftrace sched_switch trace
cat /sys/kernel/debug/tracing/trace
查看输出
-
思考题:
- 调度切换延迟高的原因可能有哪些?
Day 8 -- 多核调度
目标:理解 SMP 系统上的调度
-
理论:
- Per-CPU runqueue
- load balancing
- CPU affinity (
taskset
)
-
实验:
taskset -c <cpu>
绑定进程到特定 CPUhtop
观察 CPU 使用情况
-
思考题:
- 绑定 CPU 对多线程程序性能的影响?
- load balancing 如何决定任务迁移?
Day 9 -- 调度调优
目标:学习调度参数调整
-
理论:
- CFS tunables (
sched_latency_ns
,sched_min_granularity_ns
) - 实时调度优先级调整
- CFS tunables (
-
实验:
- 修改
/proc/sys/kernel/sched_*
参数 - 观察高负载进程调度变化
- 修改
-
思考题:
- 调度参数如何影响响应时间和吞吐量?
Day 10 -- 综合案例
目标:分析真实调度瓶颈
-
实验:
- 制造 CPU 饱和负载
- 使用 ftrace + perf 观察调度切换
- 调整优先级或绑定 CPU,观察改进
-
思考题:
- 如何定位调度瓶颈?
- 哪些场景需要修改调度策略?
✅ 学习成果
- 理解 Linux 进程调度原理
- 熟悉 CFS 与实时调度策略
- 掌握调度优先级、时间片和负载均衡
- 会使用内核 trace、perf、top 等工具分析调度瓶颈
Linux Process Scheduling 学习手册 - Day 1
主题:Linux 进程模型概述
1. 学习目标
- 理解 Linux 进程和线程结构
- 掌握
task_struct
基本字段 - 能查看进程与线程信息
- 理解用户态与内核态的区别
2. 理论讲解
2.1 进程 vs 线程
特性 | 进程 | 线程 |
---|---|---|
独立地址空间 | ✔ | ✖(共享) |
文件描述符 | ✔ | 共享 |
PID | ✔ | TID/线程号 |
调度 | 由调度器独立管理 | 线程作为任务调度单元 |
2.2 task_struct
-
内核表示进程的数据结构
-
关键字段:
pid
→ 进程号tgid
→ 线程组 IDstate
→ 当前状态(TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE)prio
/static_prio
/rt_priority
→ 优先级sched_class
→ 调度策略类别
2.3 用户态 vs 内核态
- 用户态:执行应用程序指令,受限访问硬件
- 内核态:执行系统调用,直接访问硬件
- 调度器在内核态控制进程切换
3. 图解:进程与线程
sql
+--------------------+
| 进程 A |
|--------------------|
| PID: 1000 |
| tgid: 1000 |
| state: RUNNING |
+---------+----------+
|
+--> 线程 1 (TID: 1000)
+--> 线程 2 (TID: 1001)
+--> 线程 3 (TID: 1002)
4. 实验步骤
4.1 查看进程信息
bash
ps -efT | head -n 20
-T
显示线程- 输出示例:
objectivec
UID PID PPID LWP C STIME TTY TIME CMD
root 1 0 1 0 08:00 ? 00:00:02 systemd
root 1 0 2 0 08:00 ? 00:00:00 kthreadd
4.2 查看进程树
bash
pstree -p | head -n 20
-p
显示 PID- 可以观察线程与子进程关系
4.3 查看 task_struct 信息(可选)
bash
sudo cat /proc/<pid>/status
- 查看状态、优先级等字段
5. 输出解析
-
LWP → 线程 ID
-
PID → 进程号
-
STAT → 进程状态:
- R: 运行中
- S: 可中断睡眠
- D: 不可中断睡眠
- Z: 僵尸进程
-
TIME → 累计 CPU 时间
6. 思考题
- 进程和线程共享哪些资源?
- 如果一个线程阻塞,其他线程会受到影响吗?为什么?
- 用户态和内核态切换会产生开销吗?
7. Day 1 总结
- 熟悉 Linux 进程和线程的基本概念
- 掌握
ps
和pstree
等工具查看进程信息 - 理解用户态/内核态的区别,为调度学习打基础
Linux Process Scheduling 学习手册 - Day 2
主题:调度器概念
1. 学习目标
- 理解 Linux 调度器的作用和基本概念
- 掌握调度决策、时间片和优先级的基本原理
- 能观察进程在运行队列中的状态
- 理解调度策略对系统性能的影响
2. 理论讲解
2.1 调度器作用
-
Linux 调度器负责:
- 决定哪个可运行进程获得 CPU
- 分配 CPU 时间片
- 保证公平性、吞吐量和响应性
-
调度器主要目标:
- 公平性(Fairness) → 各进程公平获得 CPU
- 响应性(Responsiveness) → 用户交互任务优先
- 吞吐量(Throughput) → 最大化系统总体工作量
2.2 调度决策
- 可运行任务(RUNNABLE)进入 Run Queue
- 调度器根据策略和优先级选择任务执行
- 时间片结束或任务阻塞 → 调度下一任务
2.3 时间片(Timeslice)
- 为每个进程分配固定时间片
- 时间片结束 → 可抢占任务切换
- CFS 中使用
vruntime
代替固定时间片概念
2.4 进程状态
状态 | 描述 |
---|---|
RUNNING | 正在运行 |
RUNNABLE | 可运行,等待 CPU |
SLEEPING | 阻塞等待 I/O 或事件 |
UNINTERRUPTIBLE | 不可中断等待 |
ZOMBIE | 已终止,等待父进程收尸 |
3. 图解:调度流程
lua
+----------------+
| Run Queue |
+----------------+
| ^ ^
v | |
+--------+ +--------+
| Process A| | Process B |
+--------+ +--------+
| CPU |
v v
调度器选择 → 执行
- 可运行队列中的任务由调度器选择
- 时间片结束或任务阻塞 → 下一个任务运行
4. 实验步骤
4.1 查看系统调度信息
bash
cat /proc/sched_debug | head -n 20
-
输出包含 runqueue 长度、各 CPU 调度信息
-
示例字段:
nr_running
→ 当前可运行任务数load
→ CPU load 指标
4.2 使用 top/htop 观察
bash
top -d 1
-
观察 CPU 使用率、任务状态
-
STAT 列:
- R → 运行
- S → 可中断睡眠
- D → 不可中断睡眠
4.3 模拟 CPU 负载
bash
# 前台占用 CPU
yes > /dev/null &
# 后台再起一个占用 CPU
yes > /dev/null &
- 使用
top
或htop
观察调度器如何分配 CPU
4.4 清理实验
bash
killall yes
5. 输出解析
top
中 CPU% 表示进程实际使用的 CPU 时间- RUNNABLE 状态的进程可能在等待调度
- nr_running > CPU 核数 → 说明有任务排队等待
6. 思考题
- 调度器在选择哪个进程运行时考虑哪些因素?
- 如果系统有 8 个核,nr_running = 16,说明什么?
- 时间片过长或过短会对系统响应性和吞吐量有什么影响?
- 如何判断某个 CPU 是否被调度器过载?
7. Day 2 总结
- 理解 Linux 调度器的作用和目标
- 掌握可运行队列、时间片和进程状态
- 学会使用
top
、htop
和/proc/sched_debug
观察调度情况 - 为 Day 3 的 CFS 学习打下基础
Linux Process Scheduling 学习手册 - Day 3
主题:CFS (Completely Fair Scheduler)
1. 学习目标
- 理解 Linux 默认调度器 CFS 的原理
- 掌握虚拟运行时间(vruntime)和红黑树管理机制
- 学会观察进程在 CFS 下的调度行为
- 能使用命令调整和查看调度策略
2. 理论讲解
2.1 CFS 调度器概述
-
Linux 默认调度器,自 2.6.23 引入
-
目标:保证每个任务公平获取 CPU
-
主要思想:
- 每个可运行任务都有 虚拟运行时间(vruntime)
- 使用 红黑树 (RB tree) 管理可运行任务
- 选择 vruntime 最小的任务执行
2.2 vruntime
-
虚拟运行时间 = 实际运行时间 / 权重
-
权重由 nice 值 决定
- nice 值越小,权重越大 → vruntime 增长慢 → 优先运行
-
用 vruntime 来平衡任务 CPU 占用
2.3 CFS 红黑树
- 可运行任务按 vruntime 排序存储在 RB tree
- 左子节点 → vruntime 更小 → 下一个被调度
- 插入、删除、选择最小 vruntime → O(log N)
2.4 调度周期
- 每个任务在一个 调度周期(sched_latency_ns) 内获得时间片
- 时间片 = 调度周期 × (任务权重 / 总权重)
3. 图解:CFS 调度流程
lua
+-----------------------+
| CFS Run Queue |
| (红黑树按 vruntime 排序) |
+-----------------------+
|
v
+----------------+
| select min vruntime |
+----------------+
|
v
CPU 执行任务
|
v
vruntime += 实际运行时间 / 权重
|
v
RB tree 更新位置
4. 实验步骤
4.1 查看调度策略
bash
ps -eo pid,comm,ni,pri,rtprio,stat | head -n 20
- PRI → 内核优先级
- NI → nice 值
- RT → 实时优先级
- STAT → 进程状态
4.2 修改进程调度策略
4.2.1 CFS 默认调度
- 普通任务就是 CFS
bash
chrt -p 0 <pid> # 查看 PID 调度策略
4.2.2 修改 nice 值
bash
# 提高优先级
sudo renice -n -10 -p <pid>
# 降低优先级
sudo renice -n 10 -p <pid>
- nice 值越小,CPU 分配越多
4.3 创建 CPU 占用进程
bash
# 前台 CPU 占用
yes > /dev/null &
# 后台多个进程
yes > /dev/null & yes > /dev/null &
- 使用
top
查看每个进程的 %CPU - 调整 nice 值,观察 CFS 对 CPU 分配的变化
4.4 查看 vruntime(可选内核调试)
bash
sudo cat /proc/<pid>/sched
-
字段:
se.vruntime
→ 任务 vruntimenr_running
→ 当前 CPU 可运行任务数
5. 输出解析
- nice 值小 → 进程 vruntime 增长慢 → 优先运行
- nice 值大 → vruntime 增长快 → 先被调度器推迟
- 多进程运行时,CFS 通过 vruntime 平衡 CPU 使用
6. 思考题
- CFS 如何保证公平性?
- nice 值对 vruntime 的影响是什么?
- 多核 CPU 下,CFS 如何平衡不同核心的负载?
- 如果一个任务一直占用 CPU,其他任务的 vruntime 会发生什么变化?
7. Day 3 总结
- 理解 CFS 调度器原理、虚拟运行时间和红黑树机制
- 掌握 nice 值对调度的影响
- 能创建 CPU 占用进程,观察 CFS 调度行为
- 为 Day 4 实时调度策略学习做基础
Linux Process Scheduling 学习手册 - Day 4
主题:实时调度策略
1. 学习目标
- 理解 Linux 实时调度策略:SCHED_FIFO、SCHED_RR、SCHED_DEADLINE
- 掌握实时任务的优先级与 CPU 调度行为
- 学会使用
chrt
和schedtool
管理实时任务 - 能观察实时任务对普通任务的调度影响
2. 理论讲解
2.1 Linux 实时调度概览
策略 | 描述 | 特点 |
---|---|---|
SCHED_FIFO | 先到先服务 | 不可时间片轮转,任务运行直到阻塞或完成 |
SCHED_RR | 循环分配时间片 | 可抢占,同优先级任务轮流执行 |
SCHED_DEADLINE | 保证截止时间 | 通过 runtime, period, deadline 控制任务执行 |
-
实时任务优先于 CFS 普通任务
-
优先级范围:
- SCHED_FIFO / SCHED_RR:1--99
- nice 值仅影响 CFS
2.2 SCHED_FIFO 特性
- 先到先服务(First-In-First-Out)
- 不可时间片轮转
- 同优先级任务先运行的先执行完
2.3 SCHED_RR 特性
- Round-Robin 时间片轮转
- 同优先级任务轮流执行
- 时间片结束 → 调度器切换到下一个任务
2.4 SCHED_DEADLINE 特性
- 任务声明 runtime / period / deadline
- 调度器保证在 deadline 前运行完成
- 对于硬实时系统非常重要
3. 图解:实时调度示意
ini
Run Queue (按优先级排序)
+---------------------------+
| P1 (FIFO, pri=80) |
| P2 (RR, pri=70) |
| P3 (CFS) |
+---------------------------+
调度器执行顺序:
1. P1 -> 占用 CPU,直到阻塞或完成
2. P2 -> 轮流时间片执行
3. P3 -> 只有 CPU 空闲时才运行
4. 实验步骤
4.1 查看当前调度策略
bash
chrt -p <pid>
输出示例:
vbnet
pid 1234's current scheduling policy: SCHED_OTHER
pid 1234's current scheduling priority: 0
4.2 设置实时任务
4.2.1 SCHED_FIFO
bash
# 设置 PID 1234 为 FIFO,优先级 80
sudo chrt -f -p 80 1234
4.2.2 SCHED_RR
bash
# 设置 PID 1235 为 RR,优先级 70
sudo chrt -r -p 70 1235
4.2.3 查看修改结果
bash
chrt -p 1234
chrt -p 1235
4.3 创建 CPU 占用任务
bash
yes > /dev/null &
yes > /dev/null &
- 使用
top
观察实时任务优先运行情况
4.4 使用 SCHED_DEADLINE(可选,高版本内核)
bash
sudo chrt --deadline -p --runtime 50000 --deadline 100000 --period 100000 1236
- runtime / period / deadline 单位为微秒
- 查看实时 deadline 任务执行情况
5. 输出解析
- 实时任务优先于 CFS 任务运行
- FIFO 同优先级任务按先到先服务
- RR 同优先级任务按时间片轮转
- CFS 任务只有在无实时任务时才被调度
6. 思考题
- 如果多个 FIFO 实时任务同优先级,会发生什么?
- SCHED_RR 的时间片过短或过长会对系统响应性有什么影响?
- 什么时候使用 SCHED_DEADLINE 比 FIFO 或 RR 更合适?
- 实时任务过多会对普通任务产生什么影响?
7. Day 4 总结
- 掌握 Linux 实时调度策略:FIFO、RR、DEADLINE
- 学会使用
chrt
设置和查看实时任务 - 理解实时任务对普通任务调度的优先影响
- 为 Day 5(时间片与优先级)做铺垫
好的 👍 我来把 Day 5(时间片与优先级) 做成详细讲义版,保持 目标 → 图解 → 实验步骤 → 输出解析 → 思考题 的风格。
Linux Process Scheduling 学习手册 - Day 5
主题:时间片与优先级
1. 学习目标
- 理解静态优先级与动态优先级
- 掌握 nice 值与 CFS 调度的关系
- 学会调整普通任务和实时任务的优先级
- 能观察不同优先级任务在 CPU 上的调度情况
2. 理论讲解
2.1 静态优先级与动态优先级
-
静态优先级:任务创建时确定,不随时间变化
- 实时任务:RT priority 1--99
- 普通 CFS 任务:默认静态优先级 120
-
动态优先级:随 CPU 使用情况变化
- CFS 根据 vruntime 调整任务运行顺序
2.2 nice 值与权重
-
nice 值范围:-20(最高优先)~ +19(最低优先)
-
nice 值影响 CFS 任务的权重
- 权重越高 → CPU 时间分配越多
- 通过 vruntime 计算时间片
2.3 时间片计算(CFS)
- 调度周期:
sched_latency_ns
- 时间片 = 调度周期 × (任务权重 / 总权重)
- nice 值越小 → 权重越大 → 时间片分配越多
3. 图解:nice 值对 CPU 分配的影响
ini
调度周期: 20ms
----------------------------------
任务A (nice=-10) | 时间片≈8ms
任务B (nice=0) | 时间片≈6ms
任务C (nice=10) | 时间片≈3ms
----------------------------------
CPU 总时间 = 20ms
- 结果:优先级高的任务运行时间更多
4. 实验步骤
4.1 查看进程优先级
bash
ps -eo pid,comm,ni,pri,rtprio,stat | head -n 20
- NI → nice 值
- PRI → 内核优先级
- RT → 实时优先级
4.2 调整 nice 值
bash
# 提高优先级(nice 值降低)
sudo renice -n -10 -p <pid>
# 降低优先级(nice 值增加)
sudo renice -n 10 -p <pid>
4.3 创建多进程 CPU 占用实验
bash
# 启动三个 CPU 占用进程
yes > /dev/null &
yes > /dev/null &
yes > /dev/null &
4.4 分配不同 nice 值观察
bash
sudo renice -n -10 -p <pid1>
sudo renice -n 0 -p <pid2>
sudo renice -n 10 -p <pid3>
4.5 使用 top 观察调度情况
bash
top -d 1 -o %CPU
- 观察 %CPU 随 nice 值变化的分配
4.6 清理实验
bash
killall yes
5. 输出解析
- nice 值小的任务占用 CPU 时间多
- nice 值大任务运行被延迟
- 多核 CPU 时,不同核上可能观察到负载均衡情况
6. 思考题
- nice 值为 -20 的任务和 +19 的任务,谁先运行?为什么?
- 调整 nice 值对实时任务有影响吗?
- 动态优先级如何保证交互任务响应性?
- 如果所有任务 nice 值相同,CFS 如何分配 CPU?
7. Day 5 总结
- 理解静态优先级与动态优先级
- 掌握 nice 值对 CPU 分配的影响
- 会创建实验进程并观察不同优先级调度行为
- 为 Day 6(调度统计工具)学习做基础
Linux Process Scheduling 学习手册 - Day 6
主题:调度统计工具
1. 学习目标
-
掌握 Linux 中常用调度观察工具
top
/htop
/ps
vmstat
/sar
perf sched
/ ftrace
-
能监控系统 CPU 负载、任务状态和调度延迟
-
学会分析调度统计数据
2. 理论讲解
2.1 常用工具概览
工具 | 功能 | 输出关键字段 |
---|---|---|
top / htop | 实时查看进程和 CPU 使用 | %CPU, STAT, PRI, NI |
ps | 静态快照进程状态 | PID, NI, PRI, RT, STAT |
vmstat | CPU 和进程队列统计 | r, b, us, sy, id |
sar | 历史系统负载 | runq-sz, plist-sz, %user, %system |
perf sched | 调度事件分析 | sched_switch, latency |
ftrace | 内核 trace | sched_switch, sched_wakeup |
2.2 调度指标解释
- nr_running / r → 可运行任务数
- run queue → 排队等待 CPU 的任务
- CPU 使用率 → user / system / idle
- sched_switch → 调度切换事件
- latency → 任务从唤醒到实际执行时间
3. 图解:调度统计观察
diff
+-----------------------+
| Run Queue (nr_running)|
+-----------------------+
| CPU0 CPU1 CPU2 ...|
| RQ0 RQ1 RQ2 |
+-----------------------+
|
v
CPU 执行任务
|
v
top / htop / perf 观察
- 每个 CPU 的 Run Queue 单独维护
- 工具通过 /proc 或内核 trace 读取状态
4. 实验步骤
4.1 top / htop
bash
# top 排序 %CPU
top -d 1 -o %CPU
# htop 图形化查看
htop
- 观察 CPU 使用、进程状态、负载情况
4.2 ps 静态快照
bash
ps -eo pid,comm,ni,pri,rtprio,stat,%cpu | head -n 20
- 查看 nice 值、优先级、CPU 占用
4.3 vmstat / sar
bash
# 实时查看
vmstat 1 5
# sar 查看 CPU 和队列统计
sar -q 1 5
- r → 可运行队列长度
- b → 阻塞队列长度
4.4 perf sched
bash
# 记录调度事件
sudo perf sched record -a sleep 10
# 查看调度延迟
sudo perf sched latency
- 输出各进程调度切换延迟
- 可用于分析 CPU 负载下调度瓶颈
4.5 ftrace sched_switch
bash
# 打开 trace
sudo su -c 'echo 1 > /sys/kernel/debug/tracing/tracing_on'
sudo su -c 'echo sched_switch > /sys/kernel/debug/tracing/set_event'
# 查看 trace
cat /sys/kernel/debug/tracing/trace | head -n 20
# 关闭 trace
echo 0 > /sys/kernel/debug/tracing/tracing_on
- 追踪每次调度切换
- 结合 CPU 负载观察任务切换频率
5. 输出解析
- top / htop:%CPU 高的任务是占用 CPU 的主导进程
- vmstat r 值高 → CPU 饱和,存在排队
- perf sched latency 输出延迟 → 可发现调度瓶颈
- ftrace sched_switch 输出 → 可分析任务切换顺序和频率
6. 思考题
- 如何判断 CPU 负载是由哪个进程主导的?
- nr_running > CPU 核数时,会发生什么?
- perf sched latency 输出中延迟高的原因可能有哪些?
- 在高负载系统中,哪些工具最适合快速排查调度问题?
7. Day 6 总结
- 掌握 top / htop / ps / vmstat / sar / perf / ftrace 等调度统计工具
- 能实时或历史观察 CPU 使用、可运行队列、调度延迟
- 能分析系统调度瓶颈,为多核调度优化提供依据
- 为 Day 7(ftrace 调度追踪)和 Day 8(多核调度)打基础
Linux Process Scheduling 学习手册 - Day 7
主题:ftrace 调度追踪
1. 学习目标
- 理解 ftrace 调度追踪原理
- 掌握
sched_switch
、sched_wakeup
等 trace 事件 - 学会捕获多核 CPU 调度情况
- 能分析任务切换顺序与调度延迟
2. 理论讲解
2.1 ftrace 概述
- 内核自带轻量级 tracing 框架
- 用于分析调度、函数调用、内核事件等
- trace 文件位于:
/sys/kernel/debug/tracing/
2.2 调度相关事件
事件 | 描述 |
---|---|
sched_switch | 任务切换事件 |
sched_wakeup | 任务被唤醒,准备进入 Run Queue |
sched_wakeup_new | 新任务第一次唤醒 |
- 可用于分析调度延迟、任务阻塞情况
- 多核系统,每个 CPU 有独立 runqueue
2.3 调度分析意义
- 找出 CPU 饱和或调度瓶颈
- 分析任务优先级与调度顺序
- 优化多核负载均衡
3. 图解:ftrace 调度追踪
arduino
CPU0 Run Queue CPU1 Run Queue
+---------+ +---------+
| Task A | | Task D |
| Task B | | Task E |
+---------+ +---------+
| |
v v
sched_switch / sched_wakeup sched_switch / sched_wakeup
| |
+------> ftrace 收集事件 ------+
- 每次任务切换或唤醒 ftrace 都会记录事件
- 可用于可视化 CPU 调度情况
4. 实验步骤
4.1 打开 ftrace
bash
sudo su
# 清空 trace buffer
echo > /sys/kernel/debug/tracing/trace
# 打开 tracing
echo 1 > /sys/kernel/debug/tracing/tracing_on
4.2 设置追踪事件
bash
# 追踪调度事件
echo sched_switch > /sys/kernel/debug/tracing/set_event
echo sched_wakeup > /sys/kernel/debug/tracing/set_event
4.3 创建 CPU 占用任务
bash
yes > /dev/null &
yes > /dev/null &
yes > /dev/null &
4.4 查看 trace
bash
cat /sys/kernel/debug/tracing/trace | head -n 20
输出示例:
less
CPU#0 PID#1234 (taskA): sched_switch: prev_comm=taskA prev_pid=1234 prev_prio=120 prev_state=R ==> next_comm=taskB next_pid=1235
CPU#1 PID#2345 (taskC): sched_wakeup: comm=taskD pid=2346 prio=120 success=1 target_cpu=1
4.5 关闭 trace
bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
4.6 分析 trace
sched_switch
→ 当前 CPU 哪个任务切换到哪个任务sched_wakeup
→ 哪个任务被唤醒,准备加入 runqueue- 可用
trace-cmd
或KernelShark
可视化分析
5. 输出解析
- CPU#0, CPU#1 → 多核 CPU 调度情况
- prev_comm / next_comm → 任务切换顺序
- prev_state → 切换前任务状态(R/S/D)
- target_cpu → 被唤醒任务分配 CPU
6. 思考题
- sched_switch 输出中的 prev_state 各值表示什么?
- 多核 CPU 下,任务为什么可能被调度到不同核心?
- 如果调度延迟较高,可能原因有哪些?
- 如何利用 ftrace 分析特定进程的 CPU 占用情况?
7. Day 7 总结
- 掌握 ftrace 的基本使用方法
- 能追踪 sched_switch、sched_wakeup 等调度事件
- 能分析多核系统任务切换顺序和调度延迟
- 为 Day 8(多核调度与负载均衡)奠定基础
Linux Process Scheduling 学习手册 - Day 8
主题:多核调度与负载均衡
1. 学习目标
- 理解多核 CPU 的调度机制
- 掌握 runqueue、CPU local 和 global load balance
- 学会观察多核任务调度和负载迁移
- 能分析负载不均衡原因并提出优化策略
2. 理论讲解
2.1 多核调度概览
-
Linux 每个 CPU 都有独立 runqueue
-
调度器在本地 runqueue 上选择任务执行
-
负载均衡(Load Balancing):
- CPU 之间迁移任务,防止某些核心过载
- 通过周期性检查 runqueue 长度和负载
2.2 CPU local vs global
-
Local scheduling:
- 优先在本 CPU 上调度任务
- 减少缓存失效,提高性能
-
Global balancing:
- 监测其他 CPU runqueue
- 迁移任务到负载较低 CPU
2.3 多核调度挑战
- 任务迁移增加缓存失效
- 实时任务可能打破平衡
- 高负载系统容易出现 CPU 饱和和队列堆积
3. 图解:多核调度与负载均衡
arduino
CPU0 Run Queue CPU1 Run Queue CPU2 Run Queue
+---------+ +---------+ +---------+
| Task A | | Task D | | Task G |
| Task B | | Task E | | Task H |
+---------+ +---------+ +---------+
| | |
v v v
Local scheduling Local scheduling Local scheduling
| | |
+--------负载均衡检查 & 任务迁移--------+
v v v
Task B -> CPU1 Task E -> CPU2 Task H -> CPU0
- 负载均衡通过周期性迁移任务,使 CPU 闲置/繁忙趋于均衡
- 避免某个 CPU 长时间过载
4. 实验步骤
4.1 查看每个 CPU runqueue
bash
cat /proc/sched_debug | grep "cpu0\|cpu1\|cpu2"
- 输出每个 CPU 可运行任务数和负载
- nr_running → 当前 runqueue 长度
4.2 创建多核 CPU 占用任务
bash
# 在后台创建多个 CPU 占用进程
yes > /dev/null & yes > /dev/null & yes > /dev/null &
4.3 使用 top / htop 观察多核负载
bash
htop
- 打开 F2 → Setup → Columns → CPU% per core
- 观察不同核心的负载是否均衡
4.4 使用 perf sched 或 ftrace 观察任务迁移
bash
sudo perf sched record -a sleep 10
sudo perf sched latency
- 可看到任务在不同 CPU 间切换
- ftrace 也可追踪
sched_migrate_task
事件
4.5 优化观察
- 使用
taskset
将任务绑定到特定 CPU
bash
taskset -c 0 yes > /dev/null &
- 对比绑定 CPU 与未绑定 CPU 的调度差异
4.6 清理实验
bash
killall yes
5. 输出解析
- 观察 nr_running / CPU%,判断负载均衡情况
- perf sched 或 ftrace 输出显示任务迁移情况
- taskset 固定 CPU 任务 → 可减少跨核迁移,提高缓存命中率
6. 思考题
- 多核系统中,为什么要优先进行 local scheduling?
- 负载均衡策略在高实时任务下会受到什么影响?
- CPU 绑定任务和动态负载均衡各自的优缺点是什么?
- 如何判断系统存在 CPU 负载不均衡的问题?
7. Day 8 总结
- 理解多核调度原理和负载均衡机制
- 能观察 runqueue、CPU 占用和任务迁移情况
- 掌握使用 taskset 绑定 CPU、perf/ftrace 分析多核调度
- 为 Day 9(调度性能调优与案例分析)打基础
Linux Process Scheduling 学习手册 - Day 9
主题:调度性能调优与案例分析
1. 学习目标
- 学会通过调度统计和 trace 数据分析性能瓶颈
- 掌握调度优化方法:nice 调整、CPU 绑定、实时策略
- 能结合实验案例提出优化策略
- 熟悉多工具联合分析(top / vmstat / perf / ftrace)
2. 理论讲解
2.1 性能瓶颈来源
- CPU 饱和:nr_running 高,CPU 排队等待
- 调度延迟:任务唤醒到执行的延迟过高
- 任务迁移过多:多核频繁迁移降低缓存命中率
- 优先级不合理:普通任务被高优先级任务长期抢占
2.2 调度优化策略
优化方法 | 描述 | 适用场景 |
---|---|---|
nice 调整 | 提高或降低普通任务优先级 | CPU 资源有限,普通任务可延迟 |
CPU 绑定 | 使用 taskset 固定任务核心 | 高频缓存访问,减少跨核迁移 |
实时策略 | 使用 SCHED_FIFO / SCHED_RR | 延迟敏感任务,如音视频处理、控制系统 |
调整调度参数 | 调整 CFS sched_latency_ns 、sched_min_granularity_ns |
多任务小时间片场景 |
2.3 结合工具分析
- top / htop → CPU 使用、任务优先级
- vmstat / sar → 队列长度、系统负载
- perf sched / ftrace → 调度延迟、迁移情况
3. 图解:调度优化流程
diff
+-------------------+
| 观察系统指标 |
| top, vmstat, sar |
+-------------------+
|
v
+-------------------+
| 分析调度瓶颈 |
| CPU饱和 / 延迟高 |
+-------------------+
|
v
+-------------------+
| 选择优化策略 |
| nice / CPU绑定 / RT|
+-------------------+
|
v
+-------------------+
| 评估优化效果 |
| 再次观察指标 |
+-------------------+
4. 实验步骤
4.1 创建高 CPU 占用任务
bash
# 后台三个任务
yes > /dev/null &
yes > /dev/null &
yes > /dev/null &
4.2 观察基线
bash
top -d 1 -o %CPU
vmstat 1 5
perf sched record -a sleep 10
perf sched latency
- 记录 CPU 占用、队列长度和调度延迟
4.3 调整 nice 值
bash
# 降低第一个任务优先级
sudo renice -n 10 -p <pid1>
# 提高第二个任务优先级
sudo renice -n -5 -p <pid2>
- 再次观察 CPU 占用变化
4.4 CPU 绑定实验
bash
taskset -c 0 yes > /dev/null &
taskset -c 1 yes > /dev/null &
- 对比绑定 CPU 与未绑定 CPU 的调度延迟和缓存命中率
4.5 实时任务优先级
bash
# 将任务设置为 SCHED_FIFO
sudo chrt -f -p 80 <pid3>
- 再次观察普通任务 CPU 分配是否下降
4.6 分析 perf / ftrace 输出
- 找出调度延迟高的任务
- 找出频繁迁移的任务
- 对比优化前后的变化
4.7 清理实验
bash
killall yes
5. 输出解析
- nice 调整 → 优先级低任务 CPU 分配减少
- CPU 绑定 → 减少任务迁移,提高缓存命中
- 实时任务 → 占用 CPU 高,普通任务可能被延迟
- perf sched / ftrace → 量化调度延迟变化
6. 思考题
- 如果 CPU 已饱和,nice 调整能完全解决性能问题吗?
- CPU 绑定任务与负载均衡冲突时应该如何处理?
- 实时任务设置过多会对系统整体性能有什么影响?
- 如何结合 perf / ftrace 输出判断调度优化是否有效?
7. Day 9 总结
- 能分析 CPU 占用和调度延迟,找出性能瓶颈
- 掌握 nice、CPU 绑定、实时策略等优化方法
- 能使用 perf / ftrace 量化优化效果
- 为实际生产环境调度优化提供经验与工具支持
Linux Process Scheduling 学习手册 - Day 10
主题:调度综合实验与案例分析
1. 学习目标
- 综合运用前 9 天的调度知识
- 能设计并执行多核、高负载、不同优先级任务的实验
- 学会识别调度瓶颈并提出优化方案
- 能量化分析优化效果
2. 理论回顾
- Linux 调度策略:CFS、SCHED_FIFO、SCHED_RR、SCHED_DEADLINE
- 任务优先级:静态优先级、动态优先级、nice 值
- 多核调度:CPU runqueue、local vs global scheduling、负载均衡
- 调度观察工具:top、htop、vmstat、sar、perf、ftrace
3. 图解:综合实验示意
arduino
实验环境:4 核 CPU
+---------+---------+---------+---------+
| CPU0 | CPU1 | CPU2 | CPU3 |
| Task A | Task D | Task G | Task J |
| Task B | Task E | Task H | Task K |
+---------+---------+---------+---------+
| | |
Local Scheduling Local Scheduling Local Scheduling
| | |
+----负载均衡 & 任务迁移-----------+
| | |
+----perf / ftrace 记录调度事件---+
- 多核任务创建不同优先级和策略
- 观察调度、迁移、CPU 占用
- 通过工具分析瓶颈并优化
4. 实验步骤
4.1 创建实验任务
bash
# 生成 CPU 高占用任务
yes > /dev/null & # PID A
yes > /dev/null & # PID B
yes > /dev/null & # PID C
yes > /dev/null & # PID D
4.2 分配不同调度策略和优先级
bash
# Task A → SCHED_FIFO, pri=80
sudo chrt -f -p 80 <pidA>
# Task B → SCHED_RR, pri=70
sudo chrt -r -p 70 <pidB>
# Task C → CFS, nice=-5
sudo renice -n -5 -p <pidC>
# Task D → CFS, nice=10
sudo renice -n 10 -p <pidD>
4.3 CPU 绑定实验
bash
# Task A, B 绑定 CPU0
taskset -c 0 <pidA>
taskset -c 0 <pidB>
# Task C, D 绑定 CPU1
taskset -c 1 <pidC>
taskset -c 1 <pidD>
4.4 启动调度追踪
bash
sudo su
echo > /sys/kernel/debug/tracing/trace
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo sched_switch > /sys/kernel/debug/tracing/set_event
echo sched_wakeup > /sys/kernel/debug/tracing/set_event
4.5 运行实验并收集数据
bash
# 运行 30 秒
sleep 30
# 停止 trace
echo 0 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace > experiment_trace.txt
4.6 分析结果
- 使用
perf sched latency
或KernelShark
分析调度延迟 - 比较 CPU 占用率、runqueue 长度、任务切换频率
- 找出调度瓶颈或负载不均衡
4.7 优化策略
- 调整 nice 值,降低低优先级任务 CPU 占用
- CPU 绑定减少任务跨核迁移
- 必要时调整调度策略(SCHED_RR / FIFO / DEADLINE)
4.8 再次观察
- 记录优化前后调度延迟和 CPU 占用差异
- 输出报告总结优化效果
4.9 清理实验
bash
killall yes
5. 输出解析
- perf / ftrace trace → 显示调度延迟和任务迁移情况
- top / htop → 不同策略任务的 CPU 占用
- vmstat / sar → runqueue 长度和 CPU 平衡
- 对比优化前后,可量化 CPU 占用和调度延迟改善
6. 思考题
- 在多核、高负载下,如何判断实时任务是否影响普通任务?
- CPU 绑定和负载均衡策略冲突时,如何选择?
- nice 调整和实时策略结合使用有什么注意事项?
- 如果调度延迟仍然高,可能的系统瓶颈有哪些?
7. Day 10 总结
- 综合应用调度策略、优先级、多核调度、nice 值和 CPU 绑定
- 能通过 perf / ftrace / top / vmstat 分析调度瓶颈
- 能针对不同问题设计优化方案
- 完成一个多核、高负载、混合调度策略的完整实验流程
- 为实际生产系统调度优化提供实践经验