Linux内核调度子系统之负载跟踪

1.概述

    Linux 内核的 多核CPU 调度程序有一项具有挑战性的任务:它必须以公平的方式分配各个任务对多个CPU的访问实现最大化系统吞吐量并最小化功耗。用户期望最好的效果,而不理睬他们系统中实际的工作负载的特征如何,实际上 这些目标经常相互冲突。所以调度程序必须清晰地知道每个任务的负载究竟有多大,从而在正确的时间在正确的CPU核心上运行正确的任务。
    CFS 调度程序(在 3.7 和之前的内核中)在每个运行队列的基础上跟踪负载,调度程序为每个CPU建立了一个运行队列,调度程序会考虑每个运行队列对整个系统负载的贡献。该级别的负载跟踪足以帮助组调度程序在控制组之间分配 CPU 时间,但是在工作负载相对稳定时,在运行队列级别跟踪负载也往往会产生差异很大的估计。

2.PELT算法

    PELT负载跟踪通过跟踪粒度下推到单个“调度实体”的级别来精细化调度程序的控制。为此讲一个跟踪周期划分成1024us,记录任务处于可运行状态下的时间为x us 该任务在第i个周期对当前的CPU利用率为x / 1024,而对应的负载为
    L = cpu_capacity * x /1024
    cpu_capacity是CPU的容量,用于归一化系统中每个CPU运行的处理能力
收集到任务每个周期内的负载后,PELT需要计算一段时间内所有周期的累加负载L
    L = L0 + L1*y + L2 * y2 + L3 * y3 + …
计算示意
其中y为衰减因子,用来衰减当前时间之前的CPU负载,认为之前的负载对当前负载的贡献是依此减弱的。
    在当前代码中,y 已被选择,因此 y32 等于 0.5。因此,实体在过去 32 个周期的负载贡献的权重是其当前贡献的一半。
    该公式为最近的负载赋予最大权重,但允许过去的负载以递减的方式影响计算。这个公式的好处是实际上没有必要保留一系列过去的负载贡献;简单地将前一时期的总负载贡献乘以 y 并添加新的 L0 就足够了。

  • PELT的优点
       调度程序现在对每个进程对系统负载的贡献程度有了更清晰的认识——而且这一切都是在没有增加调度程序开销的情况下实现的。根据负载分布系统上的进程,以便每个 CPU 承载大致相同的负载。如果内核知道每个进程对系统负载的贡献有多大,它就可以轻松计算将该进程迁移到另一个 CPU 的影响。结果应该更准确,更不容易出错的负载平衡。有一些正在流通的补丁利用负载跟踪来改进调度器的负载均衡器;在不久的将来,几乎肯定会有一些东西走向主线。

3.WALT算法

PELT算法体现的是CPU负载连续的一段时间内变化的趋势,所以PELT有以下局限性:

  • 移动设备在涉及到游戏或者界面显示的任务时需要的是实时响应,所以PELT对负载的反馈总是会滞后 影响体验
  • 对于睡眠过程中的任务计算的负载是偏小的,但是如果是周期性需要高响应的任务会得不到响应

WALT算法该进了PELT的缺点:
    WALT 保留了 PELT 的基础设施:实体跟踪;

  1. 改善策略 - 将任务的运行时间和可运行时间划分为N个窗口,这两个参数对任务负载的贡献在 N 个滑动窗口上平均。这个指标可以粗略地认为是没有阻塞的任务的未加权负载。N个窗口比PELT允许更快、更准确的任务迁移决策。

  2. WALT 忽略阻塞或睡眠的时间,即滑动窗口只存在当任务在运行队列或正在运行时。这允许快速重新甄别短暂的睡眠后负载同样很重的任务。因此一个任务不需要
    重新执行获得它的负载,可以立刻迁移到其他 CPU上立即地执行。

  3. CPU busy time: 衡量CPU负载大小通过累加最近几个窗口所有任务的执行时间总和,所以使用CPU busy time所以更贴近瞬时的负载情况

  4. 一旦任务从 WALT 运行队列取出,WALT 就会忽略这个任务对 CPU 的贡献
    因此 cpufreq 调控器可以选择在刚刚结束后的一个窗口去降低频率,可能会更节省电量
    根据更准确的使用数据,根据需要进行滞后设置。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于一个300字的回答来说,涵盖整个 Linux 内核调度器的详细步骤是不太可能的。然而,我可以给你一个大致的概述,让你了解一些关键步骤。 首先,要开始编写一个 Linux 内核调度器,你需要对操作系统的基本原理有一定的理解。你需要了解进程与线程的概念,以及它们在操作系统中的调度和执行。你还需要了解调度算法以及其在进程选择方面的应用。 其次,你需要研究 Linux 内核调度器的源代码。这将涉及到理解 Linux 内核的整体结构以及调度器在其中的位置和功能。你可以从 Linux 的官方源代码仓库中获取这些信息。 一旦你了解了基本原理和调度器的源代码,你可以根据你的需求进行修改或编写新的调度器。这可能包括更改调度算法、优化调度策略或添加新的功能。你可能还需要做一些基准测试,以确保你的调度器在不同的负载情况下表现良好。 最后,你需要将你的调度器集成到 Linux 内核中,并进行测试和验证。这可能涉及到构建和安装整个 Linux 内核,然后在实际系统中运行调度器以进行测试。你可能还需要一些调试工具来帮助你找出任何问题并进行修复。 总结起来,编写一个 Linux 内核调度器是一个复杂的过程,需要深入了解操作系统原理和 Linux 内核的工作机制。这只是一个概述,涉及的步骤远远超过300字的限制。希望这个简短的回答能够给你提供一些指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值