加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.cn/)- 图像处理、低代码、云通信、数据工具、物联设备!
当前位置: 首页 > 站长资讯 > 动态 > 正文

OSDI 2018管理系统

发布时间:2020-11-06 13:31:04 所属栏目:动态 来源:互联网
导读:默认的核心策略中包含动态的 CPU 资源预估功能,它会使用以下的三个参数根据过去一段时间的负载和 CPU 使用情况调整当前应用程序申请的资源: 负载因子(Load Factor) 当运行正常线程的所有 CPU 负载达到特定的阈值时,向仲裁者申请额外的 CPU; 时间间隔(Inte

默认的核心策略中包含动态的 CPU 资源预估功能,它会使用以下的三个参数根据过去一段时间的负载和 CPU 使用情况调整当前应用程序申请的资源:

  • 负载因子(Load Factor) — 当运行正常线程的所有 CPU 负载达到特定的阈值时,向仲裁者申请额外的 CPU;
  • 时间间隔(Interval) — 用于预估占用资源的 CPU 采样区间,默认为过去的 50ms,这可以决定策略对负载变换的敏感程度;
  • 滞后因子(hysteresis Factor) — 记录每次提升负载前的资源利用率,并根据该利用率减少申请的 CPU 资源;

作为 Arachne 中的默认策略,它提供的一定是相对简单的、普适的模型,我们可以根据自己的需求调整策略中的三个参数,也可以实现其他的策略。

为了减少程序中的缓存丢失,Arachne 的调度器不会使用准备队列,它会持续检查当前 CPU 上的所有活跃线程直到发现可以运行的线程,因为以下的两个原因,这个看起来非常简单的轮训机制实际上非常高效:

在同一时间,单个 CPU 上应该只会包含少数几个线程上下文;

当前线程一定会由其他核心唤醒,因为跨核的传输会带来缓存丢失,而在触发缓存丢失时可以并行扫描全部上下文不会带来过大的开销;

因为线程可能处于阻塞状态等待特定的执行条件满足,所以上下文中会包含 wakeupTime,即线程多久后需要被唤醒;线程可以通过 block(time) 和 signal(thread) 两个方法改变 wakeupTime 通知调度器当前线程的状态和唤醒时间。

大多数的线程操作都需要在多个 CPU 之间通信,而跨核的通信会导致缓存缺失(Cahce Miss),缓存缺失大概需要 50 ~ 200 个 CPU 循环,这也是影响 Arachne 运行时性能的主要因素。为了解决缓存缺失带来的性能影响,运行时会在数据传输时并行执行其他的指令,优化 CPU 缓存以提升用户态线程的性能。线程的创建和调度是运行时的关键操作,优化这些操作的性能就可以降低延迟并提高吞吐量。

线程创建

多数的用户态线程管理器都会在同一个 CPU 上创建线程并使用工作窃取(Work-stealing)[^4]平衡多个 CPU 上的负载,但是工作窃取对于存在时间较短的线程来说是非常昂贵的,所以我们希望在线程创建时立刻触发负载均衡,将线程创建在其他的核心上;同时,为了减少程序中的缓存丢失,Arachne 将每一个线程的上下文都绑定了特定的 CPU 上,只有在仲裁者回收时才可能发生处理器迁移,大多数的线程在创建之后就不会触发迁移。当应用程序创建新的线程时:

  1. 运行时会在多个 CPU 中随机选择两个;
  2. 在上述两个 CPU 中选择活跃线程数较少的 CPU;
  3. 将线程开始的方法地址和参数拷贝到上下文中;
  4. Arachne 中包含了三个重要的组件,分别是仲裁者、运行时和策略,其中仲裁者是运行在 Linux 上的守护进程,所有使用 Arachne 的应用程序都会利用它提供的运行时库通过 Socket 与守护进程通信,我们将依次介绍这三个组件的作用和原理。

    仲裁者

    核心仲裁者(Core Arbiter)是 Arachne 的核心组件,它是应用程序和操作系统的中间层,主要负责控制系统中的 CPU 并将这些资源合理地分配给不同的应用程序,该系统包含三个特点:

    • 在用户态基于 Linux 的机制实现了 CPU 管理;
    • 可以与不使用 Arachne 的应用程序同时存在;
    • 使用协作式的方法管理内核,包括优先级管理和内核抢占;

    仲裁者使用 Linux 的 cpuset 特性将内核分成管理的内核和未被管理的内核,未被管理的内核会分配给机器上的其他应用程序,而被管理的内存会分配给使用 Arachne 的进程。

     

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读