首页 > 其他分享 >CFS(三)调度周期与最小抢占粒度

CFS(三)调度周期与最小抢占粒度

时间:2023-10-16 11:25:52浏览次数:37  
标签:curr rq 调度 抢占 cfs 粒度 sched CFS

前言

CFS的调度逻辑是将一个调度周期的物理时间按照任务的权重分配给每一个任务,确保在一个调度周期内,队列中的每一个任务都能够得到执行,尽管执行的时长会有差异。本文对调度周期的设定规则以及配置参数进行探究。

调度周期

调度周期的计算函数__sched_period如下,计算结果与以下参数有关:

  • nr_running: 当前cfs_rq中的task数量
  • sysctl_sched_min_granularity: 可配置参数,最小抢占粒度,任务被抢占前的最小运行时间。默认为0.75 msec * (1 + ilog(ncpus))
  • sysctl_sched_latency: 可配置参数,调度延迟保证。默认为6ms * (1 + ilog(ncpus))
  • sched_nr_latency: 始终等于sysctl_sched_latency / sysctl_sched_min_granularity
static u64 __sched_period(unsigned long nr_running)
{
	if (unlikely(nr_running > sched_nr_latency))
		return nr_running * sysctl_sched_min_granularity;
	else
		return sysctl_sched_latency;
}

假设一个四核的场景,其默认的sched_latency_ns为18ms,默认的sched_min_granularity_ns为2.25ms。sched_nr_latency自然为8。

$cat /proc/sys/kernel/sched_latency_ns
18000000
$cat /proc/sys/kernel/sched_min_granularity_ns
2250000

因此,当cfs_rq的任务小于等于8个时,此时的调度周期为sched_latency_ns,保证在18ms内每一个任务能够调度一次。如果任务超过了8个,比如当前cfs_rq有100个task,调度周期为225ms,只能保证在225ms内每一个任务至少执行一次。这是因为如果不按照抢占粒度进行调整,过小的调度周期会导致由于时间片用完的抢占频繁出现影响整体吞吐。

tick抢占检查

当时钟tick检查是否可以抢占当前任务时需要满足以下两个条件之一:

  • 条件一: curr的实际运行物理时间超过了这个调度周期内理想的分配时间
  • 条件二: 实际的物理运行时间少于分配的时间,但是超过了最小抢占粒度,并且curr与当前vruntime最小的任务之间的虚拟时间差值delta超过了curr的理想运行物理时间

条件一合乎常理,超过了应该运行的时间当然应该让出CPU。条件二限定了抢占一个运行时间还不满足其分配的时间的任务的必须条件,首先是curr的运行时间不能太短,必须保证最小抢占粒度,避免抢占过于频繁;如果curr满足最小的抢占粒度,要让高优先级的任务更容易抢占低优先级的任务,这里用到了一种trick,用虚拟时间的差值delta与物理时间ideal_runtime比较。假设se的优先级高于currdelta值高于ideal_runtime的概率就会更高一些,也就更容易抢占curr。另一个方面是,是如果curr是一个低优先级任务其ideal_runtime会更小,更容易被强占。结合上述的虚拟时间与物理时间的比较,高优先级任务从两个方面都提高了抢占的成功概率。

static void
check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
{
	ideal_runtime = sched_slice(cfs_rq, curr);
	delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
    /* 实际运行时间超过一个调度周期内的分配时间 */
	if (delta_exec > ideal_runtime) {
		resched_curr(rq_of(cfs_rq));
		return;
	}
    /* 不足分配的时间的前提下,不满足最小运行粒度 */
	if (delta_exec < sysctl_sched_min_granularity)
		return;
    
    /* 虚拟时间之差超过当前任务的理想运行物理时间 */
	se = __pick_first_entity(cfs_rq);
	delta = curr->vruntime - se->vruntime;

	if (delta < 0)
		return;

	if (delta > ideal_runtime)
		resched_curr(rq_of(cfs_rq));
}

标签:curr,rq,调度,抢占,cfs,粒度,sched,CFS
From: https://www.cnblogs.com/wodemia/p/17766923.html

相关文章

  • 基于北斗融合技术的开源智能公交调度系统技术方案
     一、概述智能公交调度系统是一个集成了先进通信技术、数据处理技术和人工智能技术的管理系统,旨在提高公交车的运营效率、减少误点和乘客等待时间,同时提升公交服务水平。 二、技术方案通信技术:该系统主要采用4G/5G无线通信技术,实现数据的实时传输和指令的即时接收。此外,......
  • 服务粒度的控制和无状态服务的设计
    服务粒度的控制和无状态服务的设计是构建SOA架构中重要的考虑因素之一。服务粒度的控制:服务粒度是指服务所提供的功能和操作的大小和复杂程度。过大的服务粒度可能导致功能冗余、性能下降和难以重用,而过小的服务粒度可能导致服务数量过多、复杂性增加和维护困难。因此,在设计SOA架......
  • 旋转调度算法
              ......
  • 磁盘调度算法
            ......
  • Linux内核进程管理与调度:策略优化与实践分析
    Linux内核进程管理与调度:策略优化与实践分析原创 李斌 嵌入式悦翔园 2023-05-0611:40 发表于上海关注★星标公众号,第一时间获取信息嵌入式悦翔园本公众号专注于嵌入式技术,包括但不限于STM32、Arduino、51单片机、物联网、Linux等编程学习笔记,同时,公众号内包含大量......
  • 第9期ThreadX视频教程:自制个微秒分辨率任务调度实现方案(2023-10-11)
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 说明:1、一般应用,我们都会将任务RTOS系统时钟节拍(心跳)设置为1ms,但如果直接把RTOS的系统时钟节拍设置为1us,系统负担非常大,而且很多RTOS也做不到100MHz主频下,1us切换一次任务,导致RTOS没有时间处理应用......
  • 资源调度 —— StatefulSet(针对部署的有状态应用)
    三、StatefulSet(针对部署的有状态应用)有状态很依赖本地文件、网络资源等。不像无状态应用想扩容就扩容。一)功能1、创建2、扩容缩容3、镜像更新RollingUpdate4、灰度发布OnDelete5、删除6、删除pvc二)配置文件---apiVersion:v1kind:Servicemetadata:name:ng......
  • CFS(二)load_weight与vruntime
    前言在理清楚了CFS的基本实现以后,调度类fair_sched_class中规定了调度器的基本操作集合,cfs_rq实现了被操作的就绪队列。剩下的就是研究操作集合中的具体实现,看看CFS是如何管理这些队列中的进程的。本文主要解释了两个问题:什么样的任务归CFS管?CFS如何实现队列内部的优先级划分?......
  • Linux调度中的任务优先级机制
    前言在阅读源码的过程中发现一个task_struct包含四个优先级相关的成员,prio、static_prio、normal_prio和rt_priority这几个优先级值有什么区别和联系呢?structtask_struct{int prio;int static_prio;int normal_prio;unsignedintrt_priority......
  • CFS(一)设计理念与实现架构
    前言本文对CFS的基础的设计理念以及在内核实现上的基本代码架构进行了分析,从宏观上梳理调度和CFS的脉络。本文所有的代码基于Linux4.19。CFS的设计理念和目标CFS(CompletelyFairScheduler)完全公平调度器,从字面上看定义的很清晰,首先CFS的本质是一个调度器,所谓调度就是决定CPU......