随笔分类 - 调度子系统
Linux调度子系统
摘要:前言 将一个处于睡眠状态或者新创建的进程加入就绪队列时会产生唤醒抢占检查,被唤醒的任务一般期望能够立刻执行,发生抢占能够满足被唤醒任务的实时性需求。CFS调度器的唤醒抢占能否成功会受到sysctl_sched_wakeup_granularity的影响,该参数能控制唤醒抢占发生的概率。频繁的抢占有可
阅读全文
摘要:前言 Linux自身具备一定的异常检测机制,softlockup和hardlockup是典型的两种,softlockup检测内核是否出现了长时间不调度其他任务执行的异常情况。hardlockup则更进一步检测内核是否出现了长时间不响应中断的异常情况。softlockup和hardlockup的定义如
阅读全文
摘要:前言 CFS带宽控制顾名思义是控制CPU的使用量,作为CFS一个可配置特性需要开启CONFIG_CGROUP_SCHED CONFIG_FAIR_GROUP_SCHED 和 CONFIG_CFS_BANDWIDTH三个配置选项,实现的效果就是对任务组实施CPU带宽限流,让任务组在单位周期内只能使用定
阅读全文
摘要:前言 以进程为CPU资源的分配单位在某些场景下是有缺陷的,比如容器场景需要支持按照组做资源的分配,然后组内再按照进程做细化的资源分配。组调度技术是cgroup实现的一个重要组成部分。 CFS组调度需要开启CONFIG_CGROUP_SCHED和CONFIG_FAIR_GROUP_SCHED选项。 组
阅读全文
摘要:前言 PELT全称per-entity load tracking,用于实现调度实体级别的负载信息统计,能够为调度决策提供更细粒度的信息。上文中的组调度的任务组权重分配就依赖于负载信息,除此之外负载均衡场景也需要精准的对每个核的负载情况进行分析,PELT相比于rq级的负载统计,除了能知道负载的情况还
阅读全文
摘要:前言 新任务产生接口有clone、fork等系统调用,这些系统调用的都是通过do_fork函数实现。本文主要对do_fork中CFS新任务的调度初始化过程进行了探究,看看一个CFS新任务如何完成调度信息的初始化以及进入就绪队列的。 CFS的调度信息初始化 long _do_fork(...) { /
阅读全文
摘要:前言 CFS的调度逻辑是将一个调度周期的物理时间按照任务的权重分配给每一个任务,确保在一个调度周期内,队列中的每一个任务都能够得到执行,尽管执行的时长会有差异。本文对调度周期的设定规则以及配置参数进行探究。 调度周期 调度周期的计算函数__sched_period如下,计算结果与以下参数有关: nr
阅读全文
摘要:前言 在理清楚了CFS的基本实现以后,调度类fair_sched_class中规定了调度器的基本操作集合,cfs_rq实现了被操作的就绪队列。剩下的就是研究操作集合中的具体实现,看看CFS是如何管理这些队列中的进程的。本文主要解释了两个问题: 什么样的任务归CFS管? CFS如何实现队列内部的优先级
阅读全文
摘要:前言 在阅读源码的过程中发现一个task_struct包含四个优先级相关的成员,prio、static_prio、normal_prio和rt_priority这几个优先级值有什么区别和联系呢? struct task_struct { int prio; int static_prio; int
阅读全文
摘要:前言 本文对CFS的基础的设计理念以及在内核实现上的基本代码架构进行了分析,从宏观上梳理调度和CFS的脉络。本文所有的代码基于Linux 4.19。 CFS的设计理念和目标 CFS(Completely Fair Scheduler)完全公平调度器,从字面上看定义的很清晰,首先CFS的本质是一个调度
阅读全文
摘要:前言 Linux内核调度就是管理CPU硬件资源,同时决定多任务系统的每一个task应该什么时候上CPU,上CPU运行多久的一个机制。因此调度的机制涉及到两个方面一个是task侧,一个是CPU侧,任务是被管理的对象之一,会随着调度和运行改变状态。因此从task的角度来理解调度机制我认为是一个比较合理的
阅读全文