对于大多数从业计算机科学家的整个职业生涯而言,一个基本的观察结果始终成立:CPU 的性能和成本都远高于 I/O 设备。CPU 能够以极高的速率处理数据,同时为多个 I/O 设备提供服务,这一事实对各种规模系统的硬件和软件设计产生了深远的影响,几乎从我们开始构建系统以来就一直是如此。
然而,这个假设正在被彻底颠覆。
高速非易失性存储设备的出现,通常被称为存储级内存 (SCM),可能是数据中心和软件设计人员在可预见的未来将面临的最重大的架构变革。SCM 越来越多地成为服务器系统的一部分,它们构成了一次巨大的变革:SCM 的成本为 3-5 千美元,轻松超过了多核 CPU(1-2 千美元),而 SCM 的性能(每秒数十万次 I/O 操作)意味着需要一个或多个完整的多核 CPU 才能使其饱和。
这种变化具有深远的影响
1. I/O 速度慢而计算速度快的古老假设不再成立: 这使得数十年来深深植根于当今系统的设计决策失效。
2. 系统中各层之间的相对性能在极短的时间内变化了千倍: 这需要在整个系统软件堆栈中进行快速调整。
3. 大量现有的企业数据中心基础设施——硬件和软件——即将变得无用(或者至少是非常低效): SCM 需要从根本上重新思考计算/存储平衡和架构。
本文反思了四年来使用 SCM 构建可扩展企业存储系统的经验;特别是,我们讨论了为什么传统存储架构无法利用 SCM 提供的性能,最大化利用率需要什么,以及我们吸取了哪些教训。
“处理能力实际上远远领先于磁盘延迟,以至于预取必须提前多个块工作,以保持处理器的数据供应。[...] 幸运的是,现代机器有足够的备用周期来支持比任何人提出的更需要计算的预测器。”—Papathanasiou 和 Scott,10 2005
磁盘便宜且速度慢,而 CPU 昂贵且速度快,这一观念已经多年来深入开发人员的脑海。实际上,本科教材,例如 Bryant 和 O'Hallaron 的《计算机系统:程序员的视角》3,强调了分层内存的后果,以及新手开发人员理解其对程序影响的重要性。或许不那么学究气的是,Jeff Dean 的“每个人都应该知道的数字”7 强调了所有形式 I/O 涉及的痛苦延迟。多年来,给开发人员的一致信息是,良好的性能可以通过保持应用程序的工作集足够小以适应 RAM,最好是处理器缓存来保证。如果不够小,我们就麻烦了。
实际上,虽然持久性存储相对于 CPU 而言一直很慢,但这种“I/O 差距”在 1990 年代和 2000 年代初期实际上每年都在扩大。10 处理器稳步改进,但机械硬盘的性能仍然没有变化,受制于旋转速度和寻道时间的物理限制。几十年来,I/O 差距一直是大量创造性方案的根源,这些方案旨在避免阻塞 I/O 带来的浪费且处理器空闲的痛苦。
缓存一直是——而且仍然是——解决更高容量持久性存储的糟糕性能的最常见方法。在当前系统中,缓存扩展到所有层:处理器透明地缓存 RAM 的内容;操作系统在内部缓冲区缓存中缓存整个磁盘扇区;应用程序级架构使用内存存储(如 memcached 和 Redis)作为慢速持久性后端数据库的前端。实际上,关于数据应该在堆栈中的哪个位置缓存一直存在争议:数据库和分布式数据处理系统希望更精细的控制,有时会在用户空间应用程序中缓存数据。作为设计空间中的一个极端点,RAMCloud9 探索了将集群的所有数据保存在 DRAM 中,并通过快速恢复机制使其持久化的可能性。
缓存绝不是处理 I/O 差距的唯一策略。许多技术实际上是用 CPU 时间换取磁盘性能:例如,压缩和重复数据删除可以减少数据量,并为使更快的内存看起来更大而付出计算代价。更大的内存允许应用程序拥有更大的工作集,而无需访问旋转磁盘。主内存压缩是 1990 年代桌面电脑上“RAM 加倍”系统扩展的流行策略。12 它仍然是企业存储系统和大数据环境中的常用技术,在这些环境中,诸如 Apache Parquet 之类的工具用于重新组织和压缩磁盘数据,以减少等待 I/O 的时间。
“... [M]多个插槽发出 IO 会将 Linux 块层的吞吐量降低到大约 12.5 万 IOPS,即使市场上已经有高端固态设备能够实现比这更高的 IOPS。Linux 块层的可扩展性不是我们未来可能遇到的问题,而是 HPC 在实践中面临的重大问题”—Bjørling 等人。2, 2013
基于闪存的存储设备并不新鲜:SAS 和 SATA SSD 至少在过去十年中就已经可用,并且以与旋转磁盘相同的外形尺寸将闪存带入计算机中。SCM 反映了这些闪存设备成熟为一种新的、一流的 I/O 设备:SCM 将闪存从磁盘历史上使用的慢速 SAS 和 SATA 总线移到更注重性能的设备(如网络接口和 GPU)使用的速度明显更快的 PCIe 总线上。此外,新兴的 SCM(如非易失性 DIMM (NVDIMM))与 CPU 的接口就像它们是 DRAM 一样,为非易失性存储提供更高的性能水平。
今天的基于 PCIe 的 SCM 相对于旋转磁盘而言,性能变化惊人地达到了三个数量级(~10 万次 I/O 操作/秒 对 ~100 次)。对于计算机科学家来说,我们对底层硬件组件做出的性能假设发生 1000 倍或更多变化的情况很少见。这一变化的突出之处在于,非易失性存储器的性能和容量继续以超过 CPU 的速度逐年提高,缩小甚至可能逆转 I/O 差距。
SCM 的性能意味着系统不再需要通过缓存和数据缩减来“隐藏”它们,以实现高吞吐量。然而,不幸的是,这种性能的提高是以高昂的价格为代价的:SCM 的成本是传统旋转磁盘的 25 倍(1.50 美元/GB 对 0.06 美元/GB),企业级 PCIe 闪存设备的成本在每块三千到五千美元之间。这意味着非易失性存储的成本很容易超过 CPU、DRAM 以及安装它们的服务器系统的其余部分的成本。这种转变的含义是重大的:非易失性内存正在取代 CPU 成为数据中心的经济中心。
为了最大化从高成本 SCM 中获得的价值,存储系统必须始终如一地能够使这些设备饱和。这绝非易事:例如,将 MySQL 从 SATA RAID 迁移到 SSD 仅将性能提高了五到七倍14——远低于原始设备差异。在大数据环境中,Cloudera 最近对 SSD 的分析也同样喜忧参半:“我们了解到,SSD 为某些工作负载提供了相当大的性能优势,并且在最坏的情况下也不会造成损害。”4 我们自己的经验是,为了使 PCIe 闪存设备饱和,通常需要对现有存储子系统进行优化,然后消耗大量的 CPU 周期。除了这些周期之外,完整的应用程序堆栈还会花费一些(希望是相当多的)时间来实际处理正在读取和写入的数据。为了保持昂贵的 SCM 繁忙,通常需要数量明显更多的 CPU 来生成足够的 I/O 负载。
总而言之,尽管这些设备的性能很有吸引力,但有效地将它们插入现有系统非常具有挑战性;相反,硬件和软件需要协同设计,目标是最大化效率。
在本文的其余部分,我们将讨论在企业存储系统中设计极高性能和利用率的一些技术和考虑因素
平衡系统 解决了 SCM 存在时暴露出来的容量不足和其他组件瓶颈问题。例如,必须有足够的 CPU 内核可用,并且网络必须提供足够的连接性,以便以全容量从存储中提供数据。未能构建平衡系统会浪费对昂贵 SCM 的资本投资。
无争用、以 I/O 为中心的调度 是多个 CPU 有效地将 I/O 分派到同一存储设备所必需的,也就是说,在所有 CPU 之间共享单个 SCM 而无需串行化访问。未能正确调度 I/O 会导致性能低于标准,并且昂贵的 SCM 利用率较低。
水平扩展和位置感知 通过避免传统的 filer 风格的整合来解决资源约束,而是将数据分布在整个集群中,并主动移动数据以实现更好的负载均衡。未能实施水平扩展和位置感知会导致存储系统无法增长。
工作负载感知存储分层 利用大多数工作负载中访问的局部性来平衡性能、容量和成本要求。高速、低容量存储用于缓存来自较低速层级的热数据,系统会随着工作负载的变化主动提升和降级数据。未能实施工作负载感知分层会导致高价值 SCM 容量浪费在冷数据上。
最后,我们总结了在数据中心和应用程序设计中可以预期的未来几年将推出的更快非易失性设备带来的一些挑战。
我们是否可以简单地将 SCM 放入我们的系统中来代替磁盘,然后宣布案例结束?并非如此。通过用 SCM 替换慢速磁盘,我们仅仅转移了性能瓶颈,并暴露了其他地方的资源短缺——硬件和软件方面都是如此。作为一个简单但具有说明性的例子,考虑一个应用程序,它通过异步发出大量未完成的请求(以保持磁盘繁忙)来处理磁盘上的数据,然后使用一个或多个工作线程池来处理来自磁盘的读取,因为它们完成了。在磁盘是瓶颈的传统系统中,请求几乎在完成后立即处理,并且保持磁盘请求队列满的(合理的)逻辑可能会被编写为始终保持指定数量的请求在飞行中。使用 SCM,瓶颈很容易从磁盘转移到 CPU:请求不会在磁盘前面的队列中等待,而是几乎立即完成,然后等待工作线程来拾取它们,消耗内存直到它们被处理。结果,我们已经看到真实的Web服务器实现和数据分析作业,其中更快的存储介质的具体结果是需要明显更多的 RAM 来暂存已读取但未处理的数据。移动性能瓶颈会导致系统内存需求发生变化,在最坏的情况下,甚至可能导致主机将数据换出到磁盘!
除了 SCM 性能导致现有软件的行为变化之外,实现其价值还需要保持它们的繁忙。未充分利用和空闲的 SCM 构成了昂贵资源的浪费,并暗示了工作负载整合的机会。有趣的是,这与十多年前用于激励 CPU 虚拟化作为提高计算资源利用率手段的推理相同。我们参与了 CPU 和现在的 SCM 虚拟化的重大系统构建工作,我们发现实现 SCM 的持续利用率比 CPU 更具挑战性。这不仅仅是在服务器上虚拟化 SCM 硬件并添加更多 VM 或应用程序的问题:我们可能会在 SCM 饱和之前很久就遇到 CPU 或内存瓶颈。相反,使 SCM 饱和通常需要为 SCM 使用专用机器,并将应用程序分散在其他物理机器上。
因此,存储设备的成本和性能主导着数据中心的设计。确保它们的利用率成为关键重点,我们发现这只能通过构建平衡系统来实现:系统具有适当数量的内核和适量的内存,以使给定工作负载所需的闪存设备完全饱和。
关注存储的平衡设计可以带来回报并不是什么新鲜的见解:像 TritonSort 这样的努力,它在 2011 年通过仔细优化集群的磁盘吞吐量11 赢得了排序基准测试,以前也这样做过。然而,这种优化工作在磁盘时代很少见,并且——当然在 TritonSort 的案例中——是特定于硬件和工作负载的。磁盘的传统缓慢意味着对于大多数工作负载来说,平衡存储速度与其他系统组件是不可能的,因此工作重点是掩盖对存储的访问,以阻止它扰乱其他资源的平衡。
良好的 SCM 利用率更迫切地需要这种平衡:购买过多的闪存设备和过少的内核或过少的 RAM 最终会浪费资本,但是购买过少、稀疏分布的闪存设备会冒着访问它们的瓶颈风险——尽管瓶颈很可能在 SCM 自身以外的系统资源中!正确的平衡当然仍然是工作负载的属性,这与我们的整合目标相结合,使其成为一个难以置信的挑战性目标:即使在考虑存储层之前,异构工作负载已经使实现完整的系统利用率变得困难。我们自己工作中一个例子是看似简单的动态扩展传统 NFS 服务器实现,以在系统添加更多 SCM(以及随附的 CPU 和 NIC)时暴露更多物理带宽。5
即使硬件资源和工作负载完全平衡,资源共享的时间维度也同样重要。长期以来,中断驱动的 I/O 一直是 CPU-磁盘交互的选择模型。这是它们速度不匹配的直接结果:对于以几千兆赫兹运行的内核,每隔几毫秒处理一次中断是相当容易的。单个内核可以服务数十甚至数百个磁盘,而不会不堪重负和错过截止时间。
对于低延迟(“微秒时代”)设备,此模型必须发生巨大变化。然而,存储设备并不是唯一速度发生变化的外部设备——网络设备的速度也经历了类似的快速提升,从 10G 到 40G,最近又到 100G。也许存储系统可以使用相同的技术来使设备饱和?
不幸的是,答案不是简单的“是”或“否”。网络设备取得的收益与存储设备速度的急剧上升相比相形见绌;例如,图 1 和图 2 显示,在网络速度提高了一千倍的同一时期,存储设备的速度提高了一百万倍。此外,存储堆栈通常必须直接在数据路径上支持压缩、加密、快照和重复数据删除等复杂功能,这使得应用假设独立数据包且没有数据依赖性的优化变得困难。
网络设备常用的一种降低延迟的技术是在系统处于高负载下时通过转换为轮询来消除中断处理开销。Linux NAPI 和 Intel Busy Poll Sockets 为网络适配器实现了一种轮询模式,该模式消除了上下文切换以及与中断相关的缓存和 TLB 污染。此外,繁忙轮询内核永远不会切换到省电模式,从而节省了处理器状态转换的成本。将网络适配器切换到轮询模式可将延迟降低约 30%,非易失性存储已证明具有类似的改进。16
然而,轮询也带来了一系列挑战。CPU 除了简单地服务设备之外,还承担着其他责任——至少,它必须处理请求并充当与其链接的数据的来源或接收器。在 Hadoop 和 Spark7,17 等数据并行框架的情况下,CPU 还可能需要对数据执行更复杂的转换。因此,必须仔细选择轮询频率,以确保设备和计算都不会受到饥饿,并且需要重新评估旨在利用传统 I/O 密集型工作负载的调度策略,因为这些工作负载现在必然也是计算密集型的。
对于统一随机工作负载的 10 万 IOPS,CPU 大约有 10 微秒的时间来处理 I/O 请求。由于今天的 SCM 在处理顺序或只读工作负载时通常要快得多,因此在商品硬件上,这可能会降至接近 2.5 微秒。更糟糕的是,由于这些请求通常来自远程源,因此必须以相同的速率服务网络设备,从而进一步减少每个请求的可用处理时间。为了将这些数字置于上下文中,在今天的系统上获取单个无争用锁大约需要 20 纳秒,而非阻塞缓存失效最多可能花费 100 纳秒,仅比 I/O 操作少 25 倍。
今天的 SCM 很容易压垮单个内核;它们需要多个内核同时提交请求才能实现饱和。虽然硬件多队列支持允许并行提交,但内核块层串行化对队列的访问,并且需要进行重大重新设计才能避免争用锁。2 然而,即使使用无争用块层,也必须串行化对重叠区域的请求,以避免数据损坏。
高性能网络堆栈用于显着降低延迟的另一项关键技术是绕过内核并直接在应用程序中操作数据包。13 此外,它们将网络流在 CPU 内核之间进行分区1,8,允许拥有流的内核对流 TCP 状态执行无争用、无锁更新。
虽然绕过内核块层进行存储访问具有类似的延迟优势,但网络设备和存储设备之间存在显着差异:网络流在很大程度上是独立的,并且可以在多个内核和队列上并行处理,但存储请求共享一个公共基底,并且需要一定程度的协调。对物理存储设备和存储元数据进行分区以便为单个 CPU 内核提供对某些数据的独占访问是可能的,但这需要过去存储和文件系统设计人员不需要的仔细数据结构设计。我们的经验是,网络代码通常涉及必须为性能和并发性设计的数据结构,而文件系统代码涉及需要仔细推理以确保正确性的复杂数据依赖性。使用 SCM,系统设计人员突然面临着同时处理这两个问题的需求。
以 I/O 为中心的调度的概念认识到,在存储系统中,CPU 的主要任务是驱动 I/O 设备。调度配额是根据执行的 IOPS 而不是消耗的 CPU 周期来确定的,因此典型的调度方法并不直接适用。例如,一种常见的遗留调度策略是鼓励在负载较轻时让步,以换取在繁忙且有错过截止日期的危险时更高的优先级——这种策略会惩罚驱动系统满负荷运行所需的设备轮询线程。以 I/O 为中心的调度的目标必须是优先考虑驱动设备饱和的操作,同时保持公平性并限制客户端之间的干扰。
企业数据中心存储通常整合到一台具有多个磁盘的服务器中,俗称 JBOD(Just a Bunch of Disks,仅一组磁盘)。JBOD 通常包含 70-80 个旋转磁盘,并由单个控制器或“头”控制,并为数据中心的其余部分提供高容量、低性能的存储服务器。
JBOD 方便地将存储抽象在这个控制器后面;客户端只需要向头发送请求,而无需了解内部架构和数据放置。单个 SCM 的性能可以超过整个 JBOD,但它提供的容量明显更低。SCM 的 JBOD 能否为数据中心的其余部分提供高速和高容量存储?这将如何影响连接性、功耗和 CPU 利用率?
即使在满负荷运行时,整个基于磁盘的 JBOD 也只需要不到 10G 的网络带宽。相比之下,SCM 的 JBOD 将需要 350-400G 的网络带宽,或大约 10 个 40G 网络适配器。按每个 SCM 25W 计算,JBOD 将消耗大约 3,000W。
显然,这是不切实际的,但更糟糕的是,这将非常低效。单个控制器根本无法同时调解对大量 SCM 的访问。这样做将需要在大约 100 纳秒内处理整个请求——这是单次内存访问的延迟。因此,集中式控制器将使存储硬件严重未充分利用,从而导致对这些昂贵设备的投资回报率很差。需要不同的方法。
跨内核分配访问,即具有多个头,在访问文件系统元数据时需要协调。JBOD 内的多个网络适配器公开了多个远程访问点,这需要位置感知的客户端,这些客户端可以将请求定向到正确的网络端点和头。此时,JBOD 类似于分布式系统,并且这种整合几乎没有好处。相反,跨集群中的机器进行水平扩展是更可取的,因为它提供了与配置和负载均衡相关的额外好处。
扩展允许在首次构建数据中心时无需最终确定 JBOD 的规范,而是可以根据需求逐步添加存储服务器。这可以带来可观的财务节省,因为增量添加的设备可以获得摩尔定律的好处。此外,由于这些服务器是在机架之间配置的,因此数据的智能放置可以帮助缓解热点及其相应的网络瓶颈,从而实现均匀的高利用率。
然而,在集群机器之间保持高性能需要的不仅仅是减少中断开销和增加并行性。对共享状态(例如文件系统元数据)的访问必须仔细同步,并且可能需要额外的通信来服务分布在多台服务器上的大文件。必须在多台机器之间协调对文件及其元数据的更新,以防止损坏,并且后备数据结构本身必须在内核之间扩展,且争用最小。工作负载模式的转变通常会导致糟糕的负载均衡,这可能需要将文件从一台机器移动到另一台机器。分布式存储系统多年来一直面临着这些问题,但在基于 SCM 的企业存储系统经历的极高负载下,这些问题要严重得多。
SCM 的容量和性能是正交的:4TB 闪存驱动器与同一系列的 1TB 或 2TB 驱动器具有大致相同的性能特征。对容量和性能的工作负载要求与硬件功能不匹配,导致磁盘未充分利用;例如,当所有数据都存储在能够实现 10 万 IOPS 的 1TB SCM 中时,具有 50 万 IOPS 预期负载的 10TB 数据集处于半空闲状态。
除了拥有未充分利用的昂贵 SCM 的明显成本效率低下之外,基于 PCIe 的 SCM 还存在处理器插槽连接性约束。单个此类设备需要四到八条 PCIe 通道,这些通道在所有高速 I/O 设备之间共享,限制了单个插槽可以支持的驱动器数量。相比之下,SATA 驱动器,无论是旋转磁盘还是闪存,都不计入相同的配额。
这里的重点是,除非系统中的大部分数据是热数据,否则将它们全部存储在高速闪存设备中是非常低效的。然而,许多工作负载不是均匀的热数据,而是更接近帕累托分布:80% 的数据访问集中在 20% 的数据集中。
具有不同存储介质层级的混合系统,每种介质具有不同的性能特征,对于冷热数据的混合来说是更好的选择。SCM 充当较慢磁盘的缓存,并且仅填充热数据。访问模式随时间变化,需要进行监控,以便系统可以主动提升和降级数据以匹配其当前的热度级别。在实践中,跟踪系统的未命中率曲线可以估计改变不同工作负载的缓存大小对性能的影响,并且开销相当低15,并能够对数据应该驻留在何处做出细粒度的决策。
分层是已存在缓存机制的扩展。系统设计人员必须独立地考虑层级,就像 ccNUMA 机器一样,其中本地和远程内存具有显着不同的性能。分层允许系统独立地扩展容量和性能——这是企业存储的必要条件。
尽管分层具有明显的优势,但它也充满了复杂性。不同存储层级访问粒度的差异会导致阻抗失配。例如,SCM 擅长随机访问,而旋转磁盘在顺序访问模式下表现更好。在磁盘层级中保持一定程度的连续性可能会导致热数据和冷数据“固定”在特定层级中。
这种粒度不匹配并非存储设备独有:MMU 和缓存也在页面和缓存行粒度上运行,因此单个热字节可能会将整个页面固定在内存中或将一行固定在缓存中。虽然对于这个问题没有完美的解决方案,但访问模式的空间局部性提供了一些帮助:可预测的、重复的访问允许进行一定程度的建模,以帮助识别和修复病态工作负载。
在充分配置的系统中,简单的分层启发式方法通常可以有效地利用硬件,而不会降低性能。然而,不同的工作负载可能具有不同的优先级。在这种情况下,优先级反转和公平性成为确定布局的重要标准。分层机制必须支持灵活的策略,以防止活动但低优先级的工作负载干扰关键业务工作负载。此类策略与最大化效率的愿望之间通常存在张力;平衡这些担忧使分层成为一个具有挑战性的问题。
PCIe SSD 是 SCM 最常见的类型,并且已经对数据中心的硬件和软件设计产生了重大影响——但它们远非此类设备中唯一的成员。
NVDIMM 具有 DRAM 的性能特征,同时提供持久性。最近设计 NVDIMM 的一种常见方法是将 DIMM 上的 DRAM 量与等量的闪存相匹配。然后 DRAM 被用作普通内存,而闪存则完全被搁置,直到系统断电。当电源被切断时,超级电容器用于提供足够的电力将 RAM 的(易失性)内容刷新到闪存,从而允许在系统重新启动时将其重新加载到 RAM 中。闪存支持的 DRAM 现已上市,而更新的内存技术(如阻变和相变存储器)有可能允许更大和更高性能的非易失性 RAM。
我们的感觉是,这种新兴的非易失性存储器最初导致软件系统的效率远低于它们正在取代的基于磁盘的系统。看到这种日益增长的低效率(考虑到 SCM 性能的持续快速提升,这种情况可能会继续增长)将如何激发软件系统的创新设计,这将令人兴奋。这些创新必须发生在基础设施堆栈的许多层中,以便能够利用快速的非易失性存储;我们今天看到的仅仅是开始!
1. Belay, A., Prekas, G., Klimovic, A., Grossman, S., Kozyrakis, C., Bugnion, E. 2014. IX: 用于高吞吐量和低延迟的受保护数据平面操作系统。2014 年。在第 11 届 USENIX 操作系统设计与实现研讨会 (OSDI) 会议记录中。
2. Bjørling, M., Axboe, J., Nellans, D., Bonnet, P.. 2013, Linux 块 IO:在多核系统上引入多队列 SSD 访问。在第 6 届国际系统和存储会议会议记录 (SYSTOR) 中。
3. Bryant R. E., O'Hallaron, D. R. 2003。计算机系统:程序员的视角,第 2 卷。Prentice Hall。
4. Chen. Y. 2015 SSD 上 MapReduce 性能的真相。 http://radar.oreilly.com/2015/07/the-truth-about-mapreduce-performance-on-ssds.html
5. Cully, B., Wires, J., Meyer, D., Jamieson, K., Fraser, K., Deegan, T., Stodden, D., Lefebvre, G., Ferstay, D., Warfield, A. 2014。Strata:虚拟化非易失性内存上的可扩展高性能存储。在第 12 届 USENIX 文件和存储技术会议 (FAST) 会议记录中。
6. Dean, J. 2007。“构建大型分布式系统的软件工程建议。” 2007 年 7 月在斯坦福大学的 CS295 讲座。 http://research.google.com/people/jeff/stanford-295-talk.pdf
7. Dean, J., Ghemawat, S. 2004。MapReduce:大型集群上的简化数据处理。在第六届操作系统设计与实现研讨会 (OSDI) 会议记录中。
8. Jeong, E. Y., Woo, S., Jamshed, M., Jeong, H., Ihm, S., Han, D., Park, K. 2014。mTCP:用于多核系统的高度可扩展的用户级 TCP 堆栈。在第 11 届 USENIX 网络系统设计与实现研讨会 (NSDI) 会议记录中。
9. Ongaro, D., Rumble, S. M., Stutsman, R., Ousterhout, J., Rosenblum, M. 2011。RAMCloud 中的快速崩溃恢复。在第二十三届 操作系统原理研讨会 (SOSP) 会议记录中。
10. Papathanasiou, A. E., Scott. M. L. 2005。积极预取:一个时机已到的想法。在第 10 届 USENIX 操作系统热点主题研讨会 (HotOS) 会议记录中。
11. Rasmussen, A., Porter, G., Conley, M., Madhyastha, H. V., Mysore, R. N., Pucher, A., Vahdat, A. 2011。TritonSort:平衡的大规模排序系统。在第 8 届 USENIX 网络系统设计与实现研讨会 (NSDI) 会议记录中。
12. Rizzo, L. 1997。用于 RAM 压缩的非常快速的算法。 SIGOPS 操作系统评论 31 (2), 36-45。
13. Rizzo, L. 2012。Netmap:用于快速数据包 I/O 的新型框架。在USENIX 年度技术会议 (ATC) 会议记录中。
14. Tkachenko, V. 2012。Intel SSD 910 与 TPC-C-MySQL 基准测试中的 HDD RAID。 https://www.percona.com/blog/2012/09/11/intel-ssd-910-vs-hdd-raid-in-tpcc-mysql-benchmark/
15. Wires, J., Ingram, S., Drudi, Z., Harvey, N. J. A., Warfield, A. 2014。使用计数器堆栈表征存储工作负载。在第 11 届 USENIX 操作系统设计与实现研讨会 (OSDI) 会议记录中。
16. Yang, J., Minturn, D. B., Hady, F. 2012。何时轮询优于中断。在第 10 届 USENIX 文件和存储技术会议 (FAST) 会议记录中。
17. Zaharia, M., Chowdhury, M., Das, T., Dave, A., Ma, J., McCauley, M., Franklin, M. J., Shenker, S., Stoica, I. 2012。弹性分布式数据集:用于内存集群计算的容错抽象。在第 9 届 USENIX 网络系统设计与实现研讨会 (NSDI) 会议记录中。
Mihir Nanavati 是 Coho Data 的开发人员,他在那里致力于从高速 I/O 设备中提取最大性能。他也是不列颠哥伦比亚大学的博士生。他的研究兴趣包括多核系统的性能和可扩展性,以及虚拟化和容器化环境中的安全性和隔离。
Malte Schwarzkopf 即将完成他在剑桥大学计算机实验室的博士学位,并在 Coho Data 兼职。他的研究主要集中在数据中心操作系统和调度方面,但作为 CamSaS 计划 (http://camsas.org/) 的一部分,他曾在堆栈的多个层级工作过。在 Coho,他喜欢更深入地研究不断变化的存储对系统堆栈的影响。
Jake Wires 是 Coho Data 的首席软件工程师,也是不列颠哥伦比亚大学的博士候选人。他对存储系统和可扩展数据处理的设计广泛感兴趣。
Andrew Warfield 是 Coho Data 的联合创始人兼 CTO,也是不列颠哥伦比亚大学的副教授。他对软件系统广泛感兴趣。
版权所有 © 2015 归所有者/作者所有。出版权已许可给 。
最初发表于 Queue vol. 13, no. 9—
在 数字图书馆 中评论本文
Pat Helland - 关注你的状态,理清你的思路
随着应用程序进入分布式和可扩展的世界,它们经历了有趣的演变。 同样,存储及其近亲数据库也与应用程序并肩发展。 很多时候,存储和应用程序的语义、性能和故障模型都在微妙地跳舞,以支持不断变化的业务需求和环境挑战。 在其中加入规模真的让情况变得复杂起来。 本文着眼于其中的一些问题及其对系统的影响。
Alex Petrov - 现代存储系统背后的算法
本文深入探讨了现代数据库中使用的两种存储系统设计方法(读优化 B 树和写优化 LSM(日志结构合并)树),并描述了它们的使用案例和权衡。
Thanumalayan Sankaranarayana Pillai, Vijay Chidambaram, Ramnatthan Alagappan, Samer Al-Kiswany, Andrea C. Arpaci-Dusseau, Remzi H. Arpaci-Dusseau - 崩溃一致性
数据的读取和写入是任何冯·诺依曼计算机最基本的方面之一,但却出人意料地微妙且充满细微差别。 例如,考虑在具有多个处理器的系统中访问共享内存。 虽然一种称为强一致性的简单直观方法最容易被程序员理解,但许多较弱的模型已被广泛使用(例如,x86 总存储顺序); 这些方法提高了系统性能,但代价是使对系统行为的推理更加复杂且容易出错。
Michael Cornwell - 固态硬盘剖析
在过去的几年里,一种新型存储设备已经进入笔记本电脑和数据中心,从根本上改变了人们对存储的功耗、尺寸和性能动态的期望。 固态硬盘 (SSD) 是一种已经存在了 30 多年的技术,但由于价格过于昂贵而未能得到广泛采用。