Completely Fair Scheduler(CFS)# CFS调度器(1)-基本原理 什么是调度类 Linux中有哪些调度类 普通进程的优先级 调度延迟 虚拟时间(virtual time) 就绪队列(runqueue) CFS调度器(3)-组调度 前言 再谈调度实体 数据结构之间的关系 组进程调度 组进程抢占 用户组的权重 用户组时间限额分配 Group Se权重计算 CFS调度器(5)-带宽控制 前言 设计原理 数据结构 bandwidth贡献 如何throttle cfs_rq 如何 unthrottle cfs_rq 周期更新 quota 用户空间如何使用 用户组层级限制 使用举例 Linux进程调度-组调度及带宽控制 背景 1. 概述 2. task_group 2.2 task_group权重 3. cfs_bandwidth 3.1 数据结构 3.2 流程分析 3.2.1 初始化流程 3.2.2 用户设置流程 3.2.3 throttle限流操作 3.2.4 总结 Linux进程调度-CFS调度器 背景 1. 概述 2. 数据结构 2.1 调度类 2.2 rq/cfs_rq/task_struct/task_group/sched_entity 3. 流程分析 3.1 runtime与vruntime 3.2 CFS调度tick 3.3 任务出队入队 3.3 任务创建 3.4 任务选择 Linux CFS 调度器:原理、设计与内核实现(2023) 1 概念及关系 1.1 CFS:进程(task)的公平调度 1.2 CFS 扩展 1.2.1 前提:CONFIG_CGROUPS 1.2.2 前提:CONFIG_CGROUP_SCHED 1.2.3 扩展:支持实时进程组(CONFIG_RT_GROUP_SCHED) 1.2.4 扩展:支持常规进程组(CONFIG_FAIR_GROUP_SCHED) 1.3 常规进程组 CFS 再扩展:支持 CPU 带宽控制(限额) 1.3.1 CFS 存在的问题 1.3.2 CONFIG_CFS_BANDWIDTH 1.4 CFS BANDWITH 近几年改进 1.5 小结:CFS 相关内核编译选项的关系 2 CFS 相关设计 2.1 设计目标和基本原理 2.2 核心概念 2.2.1 vruntime 2.2.2 runqueue 2.2.3 基于时序的红黑树 2.3 调度策略(scheduling policy) 2.3.1 实时进程调度策略 SCHED_FIFO SCHED_RR 2.3.2 常规进程调度策略 SCHED_NORMAL SCHED_BATCH SCHED_IDLE 2.3.3 常规进程 SCHED_NORMAL 和实时进程 SCHED_RR 调度策略的区别 2.3.4 查看或修改进程的调度属性 2.4 调度类(scheduling class) 2.5 进程组调度器扩展(group scheduler extensions) 2.6 CFS 配置项 例子 2.7 CPU 带宽控制设计(CONFIG_CFS_BANDWIDTH) 新配置项 查看 k8s pod 的 CPU throttle 统计 更多设计细节 2.9 问题 CPU throttle 是怎么来的 上下文切换开销 3 内核实现 3.1 CFS 第一版实现 3.2 核心数据结构 3.2.1 struct task_struct 3.2.2 struct task_group 3.2.3 struct sched_entity 3.2.4 struct cfs_rq 3.2.5 struct sched_class 3.3 CFS CPU 带宽控制实现 4 使用 4.1 模拟 throttle 场景 4.2 k8s 相关问题 Pod cpu throttle k8s pod 使用 cpuset 的条件 生产例子 参考资料