处理器感知线程管理系统 · OSDI 2018

发表于 4年以前  | 总阅读数:510 次

本文要介绍的是 2018 年 OSDI 期刊中的论文 —— Arachne: Core-Aware Thread Management[^1],这篇论文通过引入处理器感知的线程管理器 Arachne[^2] 提高应用程序的性能,通过在 Memcached 中引入新的线程管理器,我们可以将 Memcached 的吞吐量提高 37%、降低 10 倍的尾延迟并且在与其他应用程序混合部署时也几乎不会带来性能上的损耗。今天我们来看一看论文中基于处理器感知的线程管理器如何帮助应用程序实现低延迟高吞吐量

想要同时实现低延迟和高吞吐量不是一件简单的事情,在传统的线程管理或者协程管理器中,上层的应用程序不清楚底层的调度策略,应用程序自己无法决定会跑在哪个 CPU 上。因为大多数的场景不需要考虑极端的性能,代码的可维护性和可读性相比更加重要,这种关注点分离的设计方式能够降低应用程序的复杂性,所以它能够为开发者提供便利。

应用程序想要实现低延迟和高吞吐量就一定要通过虚拟资源管理它们的并行性,而现在它们没有办法告诉操作系统需要多少 CPU 资源,也无法直接确定线程和 CPU 之间的绑定关系。想要实现低延迟和高吞吐量,每个应用程序都应该能够根据负载动态决定需要多少 CPU 资源并且可以控制线程和 CPU 的绑定关系。

处理器感知线程管理会为应用程序提供 CPU 等信息,将对 CPU 的部分控制权开放给应用开发者以满足应用程序在性能上的需求、不过因为 Linux 等操作系统没有直接提供易用的接口,所以 Arachne 使用了如下图所示的架构实现处理器感知的线程管理,整个系统不需要修改操作系统内核,它依赖操作系统提供的接口实现处理器感知,也可以与不使用 Arachne 的应用程序一起运行:

图 1 - Arachne 架构

Arachne 中包含了三个重要的组件,分别是仲裁者、运行时和策略,其中仲裁者是运行在 Linux 上的守护进程,所有使用 Arachne 的应用程序都会利用它提供的运行时库通过 Socket 与守护进程通信,我们将依次介绍这三个组件的作用和原理。

仲裁者

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

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

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

图 2 - 拆分 CPU 资源

这种方案可以与现有的进程运行方式兼容,我们不需要修改内核,就可以直接利用 Linux 现有的特性管理 CPU 资源。

优先级管理

当应用程序启动时,它会调用 setRequestedCores: 方法通过 Socket 向仲裁者请求 CPU 资源,该方法的参数是一个数组,从左到右依次表示八种不同优先级的 CPU:

0 0 1 2 0 0 0 0

仲裁者使用了比较简单的优先级管理策略,高优先级的请求可以覆盖低优先级的请求,因为没有其他调度器的分时复用机制,并且调度基本都是协作式的,所以部分应用程序只要申请高优先级的资源就可以饿死其他进程,Arachne 中并没有解决这个问题,虽然它提出可以通过鉴权防止恶意资源申请,但是这仍然无法解决饥饿问题。

资源申请

当应用程序想要向仲裁者申请 CPU 资源时,会经历如下所示的几个步骤:

  1. 应用程序在发出 setRequestedCores: 后会即创建与请求核数相同的内核线程(Kernel Thread);
  2. 调用 blockUntilCoreAvailable: 阻塞这些线程等待仲裁者分配资源;
  3. 当仲裁者决定为这些线程分配资源时,它会通过 cpuset 绑定线程和 CPU、通知并唤醒应用程序的内核线程,操作系统会负责将当前线程调度到绑定的 CPU 上;
  4. Arachne 运行时中的内核线程随后会在调度器中为其他的用户线程分配合适的资源;

每一个基于 Arachne 运行时的应用程序中都会启动对应数量的内核线程,运行时中的调度器会决定执行哪些用户态线程,该模型与 Go 语言的 G-M-P 模型也比较相似[^3],它们的初衷都是尽可能降低线程切换带来的额外开销,但是 Arachne 提供了对资源更细粒度的控制:

图 3 - Arachne 线程模型

需要注意的是仲裁者和应用程序之间的通信机制是不同的,应用程序会通过 Socket 访问仲裁者,而仲裁者发出的请求都是通过共享内存。这是因为应用程序在发出请求后可以陷入休眠等待响应或者资源的分配,但是 Socket 是相对比较昂贵的操作,所以仲裁者会通过共享内存请求应用程序。

Arachne 使用了协作的方式进行调度,当仲裁者需要回收资源时,应用程序可以延迟一段时间释放 CPU;如果应用程序超过 10ms 都没有释放资源,仲裁者就会通过 cpuset 将资源分配给其他程序,没有主动释放的程序会看到性能明显地下降。

运行时

Arachne 的运行时实现了老生常谈的用户态线程,但是这里的用户态线程针对特定的场景做出了优化,它主要支持细粒度的计算,其中包括大量生命周期极短的线程,例如常见的 HTTP/RPC 服务,它们会创建单独的线程处理外部的请求。

图 4 - HTTP 服务与线程

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

线程创建

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

  1. 运行时会在多个 CPU 中随机选择两个;
  2. 在上述两个 CPU 中选择活跃线程数较少的 CPU;
  3. 将线程开始的方法地址和参数拷贝到上下文中;

每个 CPU 上都有对应的 maskAndCount 变量,其中存储着正在执行的线程和当前 CPU 上的线程数。为了减少线程的缓存丢失,我们使用单独的缓存块(Cache Line)存储线程所有信息,这样创建线程最少只需要触发四次缓存丢失,分别是读取 maskAndCount、传输函数地址、参数和调度信息,能够最大限度的减少开销。

线程调度

传统的调度模型会在运行时中引入准备队列(Ready Queue)保存可执行的线程,例如:Linux 和 Go 语言的调度器[^5],但是如果准备队列是跨 CPU 的,那么增加或者删除任务时都需要修改多个变量以及获取共享锁,这都会触发缓存丢失进而影响性能。

图 5 - 线程调度

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

  1. 在同一时间,单个 CPU 上应该只会包含少数几个线程上下文;
  2. 当前线程一定会由其他核心唤醒,因为跨核的传输会带来缓存丢失,而在触发缓存丢失时可以并行扫描全部上下文不会带来过大的开销;

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

核心策略

为了能够让应用程序对 CPU 有更细粒度的控制,Arachne 不会在运行时中指定 CPU 的使用策略,如何使用 CPU 都是由独立的策略模块确定的,Arachne 中的一些默认核心策略如果不能满足应用程序的需求,它们还可以实现一些自定义的策略满足特定的需求。

图 6 - 线程类 与 Linux 调度器中的调度类比较相似,当应用程序创建新的用户线程时,它需要指定该线程的类,核心策略会根据调度类选择 CPU 执行。默认的核心策略中包含两个线程类,分别是独占的(Exclusive)和正常的(Normal),前者会为线程保留整个 CPU 资源,而后者会在多线程之间分享资源。

资源预估

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

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

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

总结

论文的最后在线程的创建、控制权转移等常见的调度原语方面对比了 Arachne、std::thread、Go 和 uThreads 几种具有相似功能的线程管理器,Arachne 在几个方面都有不错的表现:

Benchmark:Thread Creation Arachne:217 ns std::thread :13329 ns Go:444 ns uThreads:6132 ns

Benchmark:One-Way Yield Arachne:93 ns std::thread :- Go:- uThreads:79 ns

Benchmark:Null Yield Arachne:12 ns std::thread :- Go:- uThreads:6 ns

Benchmark:Condition Notify Arachne:281 ns
std::thread :4962 ns
Go:483 ns
uThreads:4976 ns

Benchmark:Signal Arachne:282 ns std::thread :-
Go:-
uThreads:-

表 1 - 调度原语的开销对比

正如我们在文章中提到的,Arachne 与其他线程管理器使用了完全不同的设计思路,因为我们的目的是充分利用 CPU 资源,所以应用程序需要对资源有着更细粒度的掌握和控制,其他的线程管理器都会尽可能地屏蔽底层的实现细节,让上层只关注内部的一些逻辑,我们从软件工程的角度也不能说谁对谁错,但是在真正追求极致的性能时,一定清楚对下一层甚至下两层的信息,在线程调度器这个场景下就是 CPU 资源的详细使用情况。

本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/rhYyJ40wLNBmpMx_XlJFcQ

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录