我们用存储类内存替换了SSD。以下是我们所学到的。

||

2019年4月2日,英特尔Optane Persistent Memory成为首个商用存储类内存(SCM)。单片机是位于内存总线上的存储设备;而SSD等传统存储设备则连接到PCIe总线上。我们感兴趣的是,与CPU更接近的SCM如何影响实际应用程序的性能。我们比较了MongoDB的存储引擎WiredTiger在两个O亚博贵宾会贴吧ptane存储设备上的性能:一个封装为SCM,另一个封装为SSD。尽管这些设备在以原始形式访问时提供了巨大的性能差异,但它们在整个软件堆栈(包括操作系统、文件系统和应用程序)下的性能差异并不大,因为内存缓存有效地掩盖了延迟。亚博科技彩票yabogame

为快速存储设备准备存储引擎

||wiredtiger存储性能

今天的固态硬盘比十年前快了一个数量级。存储类内存(SCM)位于内存总线上,甚至进一步减少I/O延迟。在硬件访问曾经是瓶颈的地方,软件开销现在可能占主导地位。亚博科技彩票yabogame系统调用和文件系统内务占用了大部分I/O延迟。研究人员和实践者研究了如何在不放弃使用现成操作系统和文件系统的便利的情况下避开这些缺点的方法。在Mo亚博贵宾会贴吧ngoDB中,我们将WiredTiger存储引擎转换为使用内存映射文件而不是对I/O的系统调用,并批处理文件系统管理操作的开销。在一些I/ o密集型基准测试中,这些更改提高了高达63%的性能。

在任何编程语言之间进行转换(第1部分)

||TranspilersANTLR指南针BSON教学工具聚合管道编译器工程

Compass团队已经编写了一个轻量级的、可扩展的转译器,可以将BSON翻译成任何语言。该工具允许开发人员使用一种语言工作,同时能够将他们构建的查询和聚合导出到其他语言。大多数编译器是一对一的,或者不太常见的一对多或多对一的。几乎没有多对多转译器。为了避免从头开始,我们利用了开源解析工具ANTLR,它为我们提供了一组编译器工具以及我们所需语言的现有语法。我们成功地最小化了额外的复杂性,通过提出一套创造性的类层次结构,将所需的工作量从n²减少到n。

可重复的性能测试:最好禁用CPU选项

||性能测试EC2CPU的选择性能分析

为了提高可重复性,MongoDB性能团队开始减少在EC2实例上运行的几个性能测试套件上亚博贵宾会贴吧的噪音。在考虑了我们的假设和实验设置之后,我们开始记录关于当前设置的数据,并没有发现特别好的或坏的EC2实例的证据。在下一步中,我们研究了IO,发现EBS实例对我们来说是稳定的选择。在发现了一个非常稳定的磁盘行为后,第三个也是最后一个实验转向了调优CPU相关的旋钮,以最小化系统这一部分的噪声。

可重复的性能测试:EBS实例是稳定的选项

||性能分析性能EBSIO

为了提高可重复性,MongoDB性能团队开始减少在EC2实例上运行的几个性能测试套件上亚博贵宾会贴吧的噪音。在考虑了我们的假设和实验设置之后,我们开始记录关于当前设置的数据,并没有发现特别好的或坏的EC2实例的证据。然而,我们发现重复测试的结果有很高的方差。根据我们的测试数据和我们对生产系统的了解,我们观察到许多噪音最大的测试执行了最多的IO(对IO延迟或带宽敏感)。在执行了第一个基线测试之后,我们决定通过测试AWS实例类型和这些实例上的IO配置来关注IO性能。

可重复的性能测试:EC2实例既不好也不好

||性能分析性能EC2测试

为了提高可重复性,MongoDB性能团队开始减少在EC2实例上运行的几个性能测试套件上亚博贵宾会贴吧的噪音。在项目开始时,我们并不清楚在公共云中运行可重复性能测试的目标是否可以实现。我们没有根据假设和信念来讨论这个问题,而是决定测量噪音本身,看看我们是否可以对配置进行更改,以使其最小化。

在考虑了我们的假设和实验设置之后,我们开始记录关于当前设置的数据。

减少EC2上性能测试的可变性:设置和关键结果

||性能分析性能EC2测试

在MongoD亚博贵宾会贴吧B性能团队中,我们使用EC2运行日常的系统性能测试。在为性能测试构建了一个持续集成系统之后,我们意识到在我们的平台和系统配置中存在随机变化的来源,这使得我们的许多结果不可重复。从平台上运行到运行的变化比我们想要捕获的MongoDB性能变化更大。亚博贵宾会贴吧为了从我们的测试配置中减少这种变化(环境噪音),我们开始了一个项目来测量和控制我们运行测试的EC2环境。

因果保证绝不是随意的

||分布式系统

由于传统数据库提供从单个节点进行读写的服务,因此自然会为读写操作提供顺序保证,即所谓的“因果一致性”。分布式系统可以提供这些保证,但为了做到这一点,它必须跨所有节点协调和排序相关事件,并限制某些操作的完成速度。当所有的数据排序保证都得到保留时(模拟垂直扩展的数据库,甚至当系统遇到节点崩溃或网络分区等故障时),因果一致性是最容易理解的,但所有系统都需要做出许多合理的一致性和持久性权衡。

亚博贵宾会贴吧MongoDB一直在运行——和传球——Jepsen测试好多年了。最近,我们一直在和Jepsen团队测试因果一致性。在他们的帮助下,我们了解到如果用一致性保证换取数据吞吐量和近时性,故障模式会变得多么复杂。

用libabigail修剪动态重建

||c++开源优化

复杂的c++项目经常与冗长的构建时间作斗争。与依赖静态链接相比,将一个项目分割成多个动态链接组件可以为开发人员提供更快的增量重建和更短的编辑-编译-测试周期,特别是当有大量的测试二进制文件时。然而,由于构建系统处理可传递库依赖关系的方式不同,构建系统通常无法实现动态增量重建的所有可能收益。红帽的ABI自省库libabigail为某些源修改类提供了一种消除不必要的传递重链接的可能方法。

考虑引入官方MongoDB Go驱动的社区效应亚博贵宾会贴吧

||golang司机开源

当你所依赖的开源项目不再满足你的需求时,你该怎么办?当你的选择不仅影响到你自己,而且影响到更大的群体时,什么原则指导你的决定?

提交补丁通常是第一种选择,但您要看维护人员是否接受它们。如果你需要的改变是彻底的、实质性的改变,那么被接受的几率就很低。最后,只剩下一些现实的选择:找到一个替代方案,分叉项目,或者编写您自己的替代方案。每个依赖于开源的人都会时不时地遇到这个难题。

经过多年的依靠社区的发展分别去司机对于Mo亚博贵宾会贴吧ngoDB来说,MongoDB已经开始开发一个全新的、内部开发的开源Go驱动程序。我们知道,在一个成功的、社区开发的项目之外,发布一个公司赞助的替代方案会给用户带来紧张和不确定性,所以我们并没有轻易做出这个决定。我们仔细考虑了我们的选择将如何影响MongoDB当前和未来的Go用户。亚博贵宾会贴吧