一步步深入学习Linux Process Scheduling

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> 设置 FIFO
    • chrt -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> 绑定进程到特定 CPU
    • htop 观察 CPU 使用情况
  • 思考题:

    • 绑定 CPU 对多线程程序性能的影响?
    • load balancing 如何决定任务迁移?

Day 9 -- 调度调优

目标:学习调度参数调整

  • 理论:

    • CFS tunables (sched_latency_ns, sched_min_granularity_ns)
    • 实时调度优先级调整
  • 实验:

    • 修改 /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 → 线程组 ID
    • state → 当前状态(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. 思考题

  1. 进程和线程共享哪些资源?
  2. 如果一个线程阻塞,其他线程会受到影响吗?为什么?
  3. 用户态和内核态切换会产生开销吗?

7. Day 1 总结

  • 熟悉 Linux 进程和线程的基本概念
  • 掌握 pspstree 等工具查看进程信息
  • 理解用户态/内核态的区别,为调度学习打基础

Linux Process Scheduling 学习手册 - Day 2

主题:调度器概念


1. 学习目标

  • 理解 Linux 调度器的作用和基本概念
  • 掌握调度决策、时间片和优先级的基本原理
  • 能观察进程在运行队列中的状态
  • 理解调度策略对系统性能的影响

2. 理论讲解

2.1 调度器作用

  • Linux 调度器负责:

    • 决定哪个可运行进程获得 CPU
    • 分配 CPU 时间片
    • 保证公平性、吞吐量和响应性
  • 调度器主要目标:

    1. 公平性(Fairness) → 各进程公平获得 CPU
    2. 响应性(Responsiveness) → 用户交互任务优先
    3. 吞吐量(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 &
  • 使用 tophtop 观察调度器如何分配 CPU

4.4 清理实验

bash 复制代码
killall yes

5. 输出解析

  • top 中 CPU% 表示进程实际使用的 CPU 时间
  • RUNNABLE 状态的进程可能在等待调度
  • nr_running > CPU 核数 → 说明有任务排队等待

6. 思考题

  1. 调度器在选择哪个进程运行时考虑哪些因素?
  2. 如果系统有 8 个核,nr_running = 16,说明什么?
  3. 时间片过长或过短会对系统响应性和吞吐量有什么影响?
  4. 如何判断某个 CPU 是否被调度器过载?

7. Day 2 总结

  • 理解 Linux 调度器的作用和目标
  • 掌握可运行队列、时间片和进程状态
  • 学会使用 tophtop/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

  • 主要思想:

    1. 每个可运行任务都有 虚拟运行时间(vruntime)
    2. 使用 红黑树 (RB tree) 管理可运行任务
    3. 选择 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 → 任务 vruntime
    • nr_running → 当前 CPU 可运行任务数

5. 输出解析

  • nice 值小 → 进程 vruntime 增长慢 → 优先运行
  • nice 值大 → vruntime 增长快 → 先被调度器推迟
  • 多进程运行时,CFS 通过 vruntime 平衡 CPU 使用

6. 思考题

  1. CFS 如何保证公平性?
  2. nice 值对 vruntime 的影响是什么?
  3. 多核 CPU 下,CFS 如何平衡不同核心的负载?
  4. 如果一个任务一直占用 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 调度行为
  • 学会使用 chrtschedtool 管理实时任务
  • 能观察实时任务对普通任务的调度影响

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. 思考题

  1. 如果多个 FIFO 实时任务同优先级,会发生什么?
  2. SCHED_RR 的时间片过短或过长会对系统响应性有什么影响?
  3. 什么时候使用 SCHED_DEADLINE 比 FIFO 或 RR 更合适?
  4. 实时任务过多会对普通任务产生什么影响?

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. 思考题

  1. nice 值为 -20 的任务和 +19 的任务,谁先运行?为什么?
  2. 调整 nice 值对实时任务有影响吗?
  3. 动态优先级如何保证交互任务响应性?
  4. 如果所有任务 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. 思考题

  1. 如何判断 CPU 负载是由哪个进程主导的?
  2. nr_running > CPU 核数时,会发生什么?
  3. perf sched latency 输出中延迟高的原因可能有哪些?
  4. 在高负载系统中,哪些工具最适合快速排查调度问题?

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_switchsched_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-cmdKernelShark 可视化分析

5. 输出解析

  • CPU#0, CPU#1 → 多核 CPU 调度情况
  • prev_comm / next_comm → 任务切换顺序
  • prev_state → 切换前任务状态(R/S/D)
  • target_cpu → 被唤醒任务分配 CPU

6. 思考题

  1. sched_switch 输出中的 prev_state 各值表示什么?
  2. 多核 CPU 下,任务为什么可能被调度到不同核心?
  3. 如果调度延迟较高,可能原因有哪些?
  4. 如何利用 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. 思考题

  1. 多核系统中,为什么要优先进行 local scheduling?
  2. 负载均衡策略在高实时任务下会受到什么影响?
  3. CPU 绑定任务和动态负载均衡各自的优缺点是什么?
  4. 如何判断系统存在 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_nssched_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. 思考题

  1. 如果 CPU 已饱和,nice 调整能完全解决性能问题吗?
  2. CPU 绑定任务与负载均衡冲突时应该如何处理?
  3. 实时任务设置过多会对系统整体性能有什么影响?
  4. 如何结合 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 latencyKernelShark 分析调度延迟
  • 比较 CPU 占用率、runqueue 长度、任务切换频率
  • 找出调度瓶颈或负载不均衡

4.7 优化策略

  1. 调整 nice 值,降低低优先级任务 CPU 占用
  2. CPU 绑定减少任务跨核迁移
  3. 必要时调整调度策略(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. 思考题

  1. 在多核、高负载下,如何判断实时任务是否影响普通任务?
  2. CPU 绑定和负载均衡策略冲突时,如何选择?
  3. nice 调整和实时策略结合使用有什么注意事项?
  4. 如果调度延迟仍然高,可能的系统瓶颈有哪些?

7. Day 10 总结

  • 综合应用调度策略、优先级、多核调度、nice 值和 CPU 绑定
  • 能通过 perf / ftrace / top / vmstat 分析调度瓶颈
  • 能针对不同问题设计优化方案
  • 完成一个多核、高负载、混合调度策略的完整实验流程
  • 为实际生产系统调度优化提供实践经验

相关推荐
Gavin_9151 分钟前
从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12
linux·ruby on rails·开源·debian·ruby·redmine
花小璇学linux28 分钟前
imx6ull-驱动开发篇31——Linux异步通知
linux·驱动开发·嵌入式软件
shelutai35 分钟前
ubuntu 编译ffmpeg6.1 增加drawtext,libx264,libx265等
linux·ubuntu·ffmpeg
runfarther1 小时前
搭建LLaMA-Factory环境
linux·运维·服务器·python·自然语言处理·ai编程·llama-factory
hello_ world.1 小时前
RHCA10NUMA
linux
神秘人X7072 小时前
Linux高效备份:rsync + inotify实时同步
linux·服务器·rsync
轻松Ai享生活2 小时前
一步步学习Linux initrd/initramfs
linux
绵绵细雨中的乡音4 小时前
网络基础知识
linux·网络
Peter·Pan爱编程4 小时前
Docker在Linux中安装与使用教程
linux·docker·eureka