当前位置: 首页 > article >正文

CFS调度器:从公平算法到内核实现全景解析

1. CFS调度器的设计哲学与公平性实现Linux内核的CFSCompletely Fair Scheduler调度器诞生于2007年取代了之前的O(1)调度器。它的核心设计理念可以用一个简单的比喻理解想象CPU时间是一块披萨CFS要确保每个进程都能公平地分到属于自己的那一份。虚拟时间vruntime是CFS实现公平性的关键。每个进程维护自己的vruntime值这个值由实际运行时间经过权重换算得到。例如高优先级进程nice值-20运行1秒vruntime可能只增加0.5秒普通进程nice值0运行1秒vruntime增加1秒低优先级进程nice值19运行1秒vruntime可能增加1.5秒这种设计使得调度器只需要选择vruntime最小的进程执行就能自动实现按权重的公平分配。我曾在嵌入式设备上实测当两个进程分别设置nice值为0和5时它们的CPU时间比例确实保持在接近预期的68%:32%。2. 核心数据结构与运行机制2.1 调度实体与红黑树每个进程在内核中表现为一个sched_entity结构体关键字段包括struct sched_entity { struct load_weight load; // 权重 u64 vruntime; // 虚拟运行时间 struct rb_node run_node; // 红黑树节点 };CFS使用红黑树来组织可运行进程树节点的键值就是vruntime。这种设计带来两个优势插入/删除操作时间复杂度为O(logN)最左侧节点总是vruntime最小的进程实际测试中在100个进程的场景下pick_next_task的耗时仅增加约15%远优于链表等简单结构。2.2 时间片分配算法CFS没有固定时间片的概念而是动态计算每个进程应获得的时间分配给进程的时间 调度周期 × (进程权重 / 就绪队列总权重)调度周期本身也是动态的当进程数≤8时固定为6mssysctl_sched_latency当进程数8时延长为进程数 × 0.75mssysctl_sched_min_granularity这种设计在服务器负载测试中表现出色当突然增加50个CPU密集型进程时原有交互式进程的响应延迟仅增加20%而传统时间片轮转算法会导致延迟增长300%以上。3. 关键源码路径分析3.1 进程创建与初始化新进程的vruntime初始化在task_fork_fair()中完成static void task_fork_fair(struct task_struct *p) { struct sched_entity *se p-se; se-vruntime curr-vruntime; // 继承父进程vruntime place_entity(cfs_rq, se, 1); // 适当惩罚新进程 }place_entity()会给新进程一定的启动惩罚约半个调度周期防止fork炸弹瞬间获得过多CPU时间。在容器环境中这种设计有效防止了某个容器通过频繁创建进程抢占资源。3.2 周期性调度与抢占时钟中断触发scheduler_tick()最终调用entity_tick()static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) { update_curr(cfs_rq); // 更新vruntime if (cfs_rq-nr_running 1) check_preempt_tick(cfs_rq, curr); }check_preempt_tick()的核心逻辑ideal_runtime sched_slice(cfs_rq, curr); // 计算应得时间 if (delta_exec ideal_runtime) // 已超时 resched_curr(rq_of(cfs_rq)); // 设置抢占标志实测发现对于nice值为0的进程在8核服务器上时间片误差不超过±3%。4. 高级特性与生产环境调优4.1 多核负载均衡CFS通过load_balance()实现跨CPU的负载均衡关键步骤找出最忙的CPUfind_busiest_group()迁移进程到当前CPUmove_tasks()考虑缓存亲和性migrate_task()在NUMA系统中我们通过/proc/sys/kernel/sched_numa_balancing可以调整策略。某次数据库性能调优中启用NUMA平衡后QPS提升了40%。4.2 CFS带宽控制通过cgroup的cpu子系统可以限制组内进程的CPU使用# 限制组可使用50% CPU echo 50000 /sys/fs/cgroup/cpu/test/cpu.cfs_quota_us echo 100000 /sys/fs/cgroup/cpu/test/cpu.cfs_period_us关键数据结构struct cfs_bandwidth { ktime_t period; // 周期长度如100ms u64 quota; // 限额如50ms u64 runtime; // 剩余时间 struct hrtimer period_timer; // 周期计时器 };在Kubernetes环境中合理设置requests/limits就是基于此机制。我曾遇到一个案例某个Pod因未设置limit导致节点CPU被耗尽添加限制后节点稳定性显著提升。5. 性能优化实战经验5.1 调整调度粒度通过修改/proc/sys/kernel/sched_min_granularity_ns可以平衡吞吐量与延迟增大提升批处理任务性能适合HPC减小改善交互响应适合桌面环境某次视频转码集群优化中将粒度从4ms调整为8ms吞吐量提升22%而转码延迟仅增加5%。5.2 避免优先级反转对于实时性要求高的应用可以配合RT调度类使用struct sched_attr attr { .sched_policy SCHED_FIFO, .sched_priority 80, }; sched_setattr(pid, attr, 0);在工业控制系统中这种组合保证了关键任务能在50μs内响应。6. 未来演进与思考随着异构计算发展CFS也在不断进化EEVDF调度器Linux 6.6引入改进了延迟公平性对大小核架构的更好支持如ARM big.LITTLE与IO调度器的深度协同在手机SOC测试中新调度器使游戏帧率波动减少了35%。这些改进都延续了CFS的核心思想在复杂场景中维持尽可能的公平。

相关文章:

CFS调度器:从公平算法到内核实现全景解析

1. CFS调度器的设计哲学与公平性实现 Linux内核的CFS(Completely Fair Scheduler)调度器诞生于2007年,取代了之前的O(1)调度器。它的核心设计理念可以用一个简单的比喻理解:想象CPU时间是一块披萨,CFS要确保每个进程都…...

[技术解析]图卷积网络在半监督节点分类中的实战与优化

1. 图卷积网络入门:从传统CNN到GCN的思维跃迁 第一次接触图卷积网络(GCN)时,我习惯性地用传统CNN的思维去理解它,结果踩了不少坑。传统卷积在规整的网格数据上滑动滤波器的操作,在图数据中完全行不通——因为图的拓扑结构是不规则…...

开发者必备:极简CLI工具高效管理个人代码片段库

1. 项目概述:一个面向开发者的代码片段管理工具最近在整理自己的开发环境,发现一个挺普遍的问题:那些临时写出来、解决了某个具体问题、但又不够格放进正式项目库的代码片段,到底该放哪儿?它们就像散落在硬盘各处的“知…...

NotebookLM脑机接口部署避坑指南:TensorRT加速失效、电极位移漂移补偿、低信噪比场景下的9种fallback策略

更多请点击: https://codechina.net 第一章:NotebookLM脑机接口研究 NotebookLM 是 Google 推出的基于用户自有文档进行深度理解与推理的 AI 助手,虽其官方定位并非直接面向脑机接口(BCI)领域,但其底层架构…...

Linux驱动开发实战:手把手教你为GT1151触摸屏编写I2C+Input+中断驱动(基于F1C200S)

Linux驱动开发实战:GT1151触摸屏I2CInput中断驱动全解析 1. 嵌入式Linux驱动开发概述 在嵌入式系统开发中,触摸屏作为人机交互的核心组件,其驱动开发一直是工程师必须掌握的技能。GT1151作为一款广泛应用于嵌入式设备的电容式触摸屏控制器&am…...

NotebookLM思维导图生成已进入「语义拓扑时代」:2024Q2最新Benchmark显示其节点关联准确率超越MindNode Pro 41.6%

更多请点击: https://intelliparadigm.com 第一章:NotebookLM思维导图生成已进入「语义拓扑时代」 传统基于关键词共现或规则模板的思维导图生成方式,正被 NotebookLM 的语义理解能力彻底重构。其底层 LLM 模型不再仅识别显式术语关系&#…...

从零上手RP2040:为树莓派Pico注入MicroPython灵魂

1. 为什么选择MicroPython? 对于刚接触树莓派Pico(RP2040)的新手来说,选择MicroPython作为开发语言是个明智的决定。这就像第一次学骑自行车时选择带辅助轮的车子——它降低了入门门槛,让你能快速感受到编程的乐趣。Mi…...

抖音本地生活运营4大核心秘籍

最近参加了一场 抖音本地生活全域运营实战特训营,两天一夜,从理论到实操。把最核心的 4 个模块整理出来,分享给想做本地生活的技术/运营同学。一、账号主页:让抖音自动帮你获客抖音主页就是你的线上门头。很多商家挂个风景图&…...

利用Taotoken实现AI应用的高可用与容灾路由设计思路

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken实现AI应用的高可用与容灾路由设计思路 应用场景类,探讨在构建对稳定性要求高的生产级AI应用时&#xff0…...

YOLOv8实战:构建实时跌倒预警监控系统

1. 为什么需要实时跌倒预警系统 记得去年帮朋友给独居老人安装监控摄像头时,发现一个痛点:传统监控只能事后回放,当老人跌倒时往往错过黄金救援时间。这个问题在养老院和社区医疗场景尤为突出,护工不可能24小时盯着每个监控画面。…...

Taotoken账单追溯功能如何帮助厘清项目间的AI资源消耗

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken账单追溯功能如何帮助厘清项目间的AI资源消耗 当团队同时推进多个AI实验项目时,一个常见的困扰是:…...

避开安全门调试大坑:详解西门子SFDOOR指令的3个关键参数与常见故障复位

西门子SFDOOR指令实战排错手册:3个关键参数解析与故障复位技巧 1. 安全门控制的核心逻辑与典型故障模式 在工业自动化现场,安全门作为保护人员安全的关键设备,其可靠性直接关系到生产系统的稳定运行。西门子SFDOOR功能块通过双通道信号检测和…...

使用Nodejs快速将Taotoken大模型API集成到你的Web应用中

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Node.js快速将Taotoken大模型API集成到你的Web应用中 基础教程类,面向全栈或前端开发者,讲解如何在Nod…...

CircuitPython微控制器图形保存实战:从屏幕截图到BMP文件生成

1. 项目概述:为什么我们需要在微控制器上保存图形? 在嵌入式开发领域,尤其是当我们使用像Adafruit PyPortal、PyGamer这类带有彩色显示屏的开发板时,图形界面的调试和内容存档一直是个不大不小的痛点。想象一下,你花了…...

独立开发者如何利用 Taotoken 模型广场低成本试错选型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用 Taotoken 模型广场低成本试错选型 对于资源有限的独立开发者或小型团队而言,在产品开发初期选择合…...

对比直接使用官方 API 观察通过 Taotoken 聚合调用的成本差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用官方 API 与通过 Taotoken 聚合调用的成本差异 在集成大模型能力到实际项目时,除了关注模型效果和稳定性&…...

COLMAP实战:跳过特征提取,直接用已知位姿完成三角测量与稠密重建

COLMAP高效重建实战:基于已知位姿的三角测量与稠密重建加速方案 三维重建技术正在机器人导航、AR/VR内容生成等领域快速普及,但传统流程中特征提取与匹配环节往往消耗超过70%的计算时间。当相机位姿已通过SLAM或其他传感器获取时,如何跳过这些…...

VASP和QE能带图画不好?可能是你的Python数据处理踩了这些坑

VASP和QE能带图绘制中的Python数据处理陷阱与解决方案 在材料计算领域,能带结构图是理解电子性质的关键可视化工具。许多研究人员在使用VASP或Quantum ESPRESSO(QE)完成第一性原理计算后,往往会选择Python进行数据处理和绘图。然而,这个看似标…...

高校学生综合测评管理系统(10054)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

别再死磕PSO了!用Python手把手教你实现GWO灰狼优化算法(附完整代码)

用Python实战GWO灰狼优化算法:告别传统优化方法的局限 在工程优化和机器学习领域,算法选择往往决定了问题求解的效率和质量。传统粒子群优化(PSO)算法虽然广为人知,但其参数调节复杂、易陷入局部最优的缺点也日益明显。灰狼优化算法(Grey Wol…...

废品买卖回收管理系统(10053)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

宠物领养平台(10052)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

ssm中国篮球人才管理系统(10050)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

【软考高级架构】论文范文20——论软件设计方法及其应用

论软件设计方法及其应用 摘要 软件设计是将需求分析结果转换为软件体系结构和内部实现细节的关键活动,设计方法的选择直接影响系统的可维护性、可扩展性和开发效率。结构化设计、面向对象设计、数据驱动设计等经典方法各有侧重,在不同场景下展现出独特的优势。本文以笔者主…...

【限时开放】NotebookLM气候专项Prompt Library(含AR6 WGII章节级语义索引模板):仅向高校科研组开放72小时

更多请点击: https://codechina.net 第一章:NotebookLM气候研究辅助概述 NotebookLM 是 Google 推出的基于人工智能的文档理解与推理工具,专为研究人员设计,支持上传 PDF、TXT 等格式的学术文献、观测报告及政策文件,…...

基于OpenCV与MediaPipe的手势与头部姿态控制鼠标实现

1. 项目概述:解放双手的鼠标控制新范式最近在GitHub上看到一个挺有意思的项目,叫ShafwanAbd/handsfree-mouse。顾名思义,这是一个“免提鼠标”项目,核心目标是通过摄像头捕捉你的手势或头部动作,来替代传统的物理鼠标&…...

【软考高级架构】论文范文19——论软件系统架构风格

论软件系统架构风格 摘要 软件系统架构风格是描述系统结构和行为的抽象模式,为不同应用领域提供了经过验证的设计方案。合理选择与组合架构风格能够有效指导系统分解、组件划分和交互设计,从而提升系统的可维护性、可扩展性和性能等质量属性。本文以笔者主导的某大型制造企…...

终极免费开源项目管理指南:如何用GanttProject高效规划复杂项目?

终极免费开源项目管理指南:如何用GanttProject高效规划复杂项目? 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 想要免费、开源且功能强大的项目管理工具吗&#…...

MATLAB浮动许可利用率低:软件许可浪费,提高周转率

说实话,MATLAB浮动许可利用率低这个问题,我真的被老板问爆了。咱们实验室有50个许可,但系统显示平均不到20%在用,剩下的40%天天躺在服务器上吃灰。这事儿让我悟了:软件许可不是你买了就赚了,它要像现金流一…...

MATLAB许可排队严重?研发软件许可共享,不增购满足需求

我去年带着团队做自动驾驶算法验证,结果MATLAB许可证天天排队。每天早上团队成员像抢盲盒一样点开MATLAB,结果发现根本抢不到。我们项目组三人全用同一个许可证,项目延期三个月,研发效率直线下滑。这种乱象真的该结束了。问题本质…...