CFS的覆灭,Linux新调度器EEVDF详解

本文主要总结了EEVDF论文和Linux内核实现中关键逻辑的推导,着重强调代码逻辑和论文公式之间的关系,它又长又全,像今天的汤圆又大又圆:D

Warn:多行的公式编号渲染有点问题,当存在多行公式时,仅对最后一条式子编号。

简 介

CFS 调度器强调公平,只提供权重一个变量(nice)用于控制任务之间运行时间分配的比例,不提供对特定任务时延层面的保障。这导致服务质量保障(Quality of Service,QoS)很难实现,传统手段是通过为不同任务设置标签,在调度关键逻辑(唤醒、抢占、负载均衡)对打了不同标签的任务进行特判处理,导致调度逻辑充满了特判和兜底。

为了将时延考虑在内,新调度器 EEVDF 在保障时间分配公平的同时,引入代表任务“应得时间”和“已得时间”的差异值 lag 作为关键指标,只有“应得时间”大于等于“已得时间”,任务才有资格(称eligible)被挑选;进一步地,在有资格被挑选的任务中,选择任务完成时限(deadline)最近的任务运行,即所谓 Earliest Eligible Virtual Deadline First,缩写为 EEVDF。

EEVDF 论文

本节主要梳理论文中的关键概念,与Linux实现息息相关的部分:

Vt:系统虚拟时间

任务 i 在 [ t 1 , t 2 ] [t_1,t_2] [t1,t2] 时间段,应得运行时间为:
S ⁡ ( t 1 , t 2 ) = ∫ t 1 t 2 w i W (1) \operatorname{S}(t_1, t_2) = \int_{t_1}^{t_2} \frac{w_i}{W} \tag{1} S(t1,t2)=t1t2Wwi(1)
其中:

  1. w i w_i wi 是任务 i 的权重。
  2. W W W 是系统中所有活跃任务权重的累加;

令系统虚拟时间为:
V t = ∫ 0 t 1 W (2) V_t = \int_{0}^{t} \frac{1}{W} \tag{2} Vt=0tW1(2)
则式(1)又可以写作:
S ⁡ ( t 1 , t 2 ) = ∫ t 1 t 2 w i W = w i ∫ t 1 t 2 1 W = w i ( V t 2 − V t 1 ) (3) \begin{align} \operatorname{S}(t_1, t_2) & = \int_{t_1}^{t_2} \frac{w_i}{W} \\ & = w_i \int_{t_1}^{t_2} \frac{1}{W} \\ & = w_i(V_{t_2}-V_{t_1}) \end{align} \tag{3} S(t1,t2)=t1t2Wwi=wit1t2W1=wi(Vt2Vt1)(3)

ve:eligible time

任务 i 请求的 eligible time 被定义为:任务 i 的应得时间,和 i 在发起该请求前已得时间相等的那一刻,记该虚拟时间为 eligible time。当系统虚拟时间 V t V_t Vt 大于等于 V e V_e Ve,称任务 i 的请求 eligible,即任务 i 有资格作为上 CPU 运行的候选任务。

记任务 i 在 [ t 1 , t 2 ] [t_1,t_2] [t1,t2] 时间段实际获得的运行时间为 s(t1,t2),根据 eligible time 的定义,有:
S ⁡ ( t 0 , e ) = s ⁡ ( t 0 , t ) (4) \begin{array}{c} \operatorname{S}(t_0, e) = \operatorname{s}(t_0, t) \tag{4} \end{array} S(t0,e)=s(t0,t)(4)
其中 t 0 t_0 t0 是任务 i 开始活跃的时间, t t t 为任务 i 发起新请求的时间,结合公式(3),可推出 eligible time 的计算方式:
S ⁡ ( t 0 , e ) = s ⁡ ( t 0 , t ) = > w i ( V e − V t 0 ) = s ⁡ ( t 0 , t ) = > V e = V t 0 + s ( t 0 , t ) w i (5) \begin{array}{c} \operatorname{S}(t_0, e) = \operatorname{s}(t_0, t)\\ = > w_i(V_e-V_{t_0}) = \operatorname{s}(t_0, t) \\ = > V_e = V_{t_0} + \frac{s(t_0, t)}{w_i} \tag{5} \end{array} S(t0,e)=s(t0,t)=>wi(VeVt0)=s(t0,t)=>Ve=Vt0+wis(t0,t)(5)

vd:deadline time

任务 i 请求的 deadline time 被定义为:任务 i 在虚拟时间间隔 [ V e , V d ] [V_e,V_d] [Ve,Vd] 之间可得的运行时间,等于请求的长度 r。有:
S ⁡ ( e , d ) = r \begin{array}{c} \operatorname{S}(e, d) = r \end{array} S(e,d)=r
结合公式(3),可推出 deadline time 的计算方式如下:
S ⁡ ( e , d ) = r = > w i ( V d − V e ) = r = > V d = V e + r w i (6) \begin{array}{c} \operatorname{S}(e, d) = r \\ = > w_i(V_d-V_e) = r \\ = > V_d = V_e + \frac{r}{w_i} \tag{6} \end{array} S(e,d)=r=>wi(VdVe)=r=>Vd=Ve+wir(6)

ve 和 vd 递推公式

根据式(5)和式(6),对于任务的多个请求,有以下递推公式:
V e 1 = V t 0 V d 1 = V t 0 + r w i . . . V e k = V d k − 1 V d k = V e k + r w i (7) \begin{array}{c} V_e^1 = V_{t_0} \\ V_d^1 = V_{t_0} + \frac{r}{w_i} \\ ... \\ V_e^k = V_d^{k-1} \\ V_d^k = V_e^{k} + \frac{r}{w_i} \tag{7} \end{array} Ve1=Vt0Vd1=Vt0+wir...Vek=Vdk1Vdk=Vek+wir(7)

ve 和 vd 推算例子

假设:

  1. c1 和 c2 的权重相等,有 w 1 = w 2 = 2 w_1 = w_2 = 2 w1=w2=2
  2. c1 在 t=0 加入竞争,c2 在 t=1 加入竞争;
  3. c1 的请求长度 r 1 = 2 r_1=2 r1=2,c2 的请求长度 r 2 = 1 r_2=1 r2=1
    在这里插入图片描述

推算详解:
在这里插入图片描述

lag:为了公平

任务 i 应得时间和已得时间不总是相等的,两者的差值称作 lag:
l a g i ( t ) = S i ( t 0 , t ) − s i ( t 0 , t ) (8) \begin{array}{c} lag_i(t) = S_i(t_0,t) - s_i(t_0,t) \tag{8} \end{array} lagi(t)=Si(t0,t)si(t0,t)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值