7-10倍写入性能提升:剖析WiredTiger数据页无锁及压缩黑科技

导语:计算机硬件在飞速发展,数据规模在急速膨胀,但是数据库仍然使用是十年以前的架构体系,WiredTiger 尝试打破这一切,充分利用多核与大内存时代来重新设计数据库引擎,达到 7 - 10 倍写入性能提升。本文由袁荣喜向「高可用架构」投稿,通过分析 WiredTiger 源代码,剖析其卓越性能的背后实现。


640?wx_fmt=png袁荣喜,学霸君工程师,2015年加入学霸君,负责学霸君的网络实时传输和分布式系统的架构设计和实现,专注于基础技术领域,在网络传输、数据库内核、分布式系统和并发编程方面有一定了解。


MongoDB 新存储引擎 WiredTiger 实现(事务篇)一文中提到了 WiredTiger(简称为 WT)是为了适应现代 CPU、内存和磁盘的特性而设计的存储引擎,它的特点就是充分利用 CPU 的速度和内存的容量来弥补磁盘访问速度不足。

在介绍 WiredTiger 的数据组织前,先来看看传统数据库引擎的数据组织方式,一般存储引擎都是采用 btree 或者 lsm tree 来实现索引,但是索引的最小单位不是 K/V 记录对象,而是数据页,数据页的组织关系实现就是存储引擎的数据组织方式。

传统数据库引擎大都是设计一个磁盘和内存完全一样的数据组织方式,这个结构是固定的空间大小(innodb 的 page 是 16KB),访问它必须遵守严格的 The FIX Rules 规则:

  • 修改一个 page 需要获得该页的 x-latch lock

  • 访问一个 page 需要获得该页的 s-latch lock 或者 x-latch lock。

  • 持有该 page 的 latch 直到修改或者访问该页的操作完成 latch unlock。

WiredTiger 没有像传统的数据库引擎那样设计一套内存和磁盘 page 完全一致的数据组织方式,而是针对磁盘和 CPU、内存三者之间特点设计了一套独特的数据组织方式

这种数据组织结构分为两部分:

  • in-memory page: 内存中的数据页(page)

  • disk extent: 基于磁盘文件的偏移量的范围存储

WiredTiger 内存中的 page 是一个松散自由的数据结构,而磁盘上的 extent 只是一个变长的序列化后的数据块,这样做的目的(设计目标)有以下几点:

  1. 内存中的 page 松散结构可以不受磁盘存储方式的限制和 The FIX Rules 规则的影响,可以自由的构建 page 无锁多核并发结构,充分发挥 CPU 多核的能力。

  2. 可以自由的在内存 page 和磁盘 extent 之间实现数据压缩,提高磁盘的存储效率和减少 I/O 访问时间。

关于 WiredTiger 的压缩效率见下图

0?wx_fmt=png图1

Page 在 WiredTiger 引擎中起着承上启下的作用,上通索引、事务和 LRU cache,下达文件、高速缓冲和磁盘 I/O。要了解整个 WiredTiger 引擎的原理,首先要理解它的数据组织方式。

在本文中先通过一组测试样例来验证 WiredTiger 数据组织的设计目标,再分析 WiredTiger 数据组织的原理和实现。

WiredTiger 测试样例

先来看看 WiredTiger 这种数据组织的相关测试,我们在一个普通的开发机器上对 WiredTiger 的原生 API 接口进行测试,测试环境如下:

CPU: i7-4710MQ CPU @ 2.50GHz,8核

内存:4G

硬盘:1TB SATA,5400转

WT数据库配置:

Cache size: 1GB, page max size:64KB, OS page cache:1GB

Key:一个从零开始自增长的整数

Value:一个长度介于100 ~ 200的随机字符串。

测试流程


测试程序先新建一张表,用 16 条线程并发向表中插入指定数量(以百万为单位)的 K/V 对,在插入完成后做一次 checkpoint 让插入的数据写入磁盘,统计这个表在磁盘上的大小和这个过程的耗时。再用 16 条线程在表中随机查询 20000 个不同 K/V 并统计查询的耗时,通过耗时可以计算出 insert 和 query 的 TPS。统计的这三个参数分别就是磁盘空间占用、写性能和读性能。

我们分别进行不压缩 extent 的测试和进行 ZIP 压缩 extent 的测试。

磁盘空间统计对比

0?wx_fmt=png图2

从上图可以看出 2 亿条记录,没有压缩的磁盘空间 30GB,而压缩后的磁盘空间 2GB 左右

写性能对比

0?wx_fmt=png图3

从上图可以看出,写入的数据在 1亿条(14GB),压缩(518K TPS)和没压缩(631k TPS)的写性能相当。

但随着数据量增大,大量的数据在内存和磁盘间 swap,选择 extent 压缩的写性能(790K TPS)要好于没压缩的写性能(351K TPS)。

读性能对比

0?wx_fmt=png图4

从上图可以得出,在表空间文件上的数据大小没有超过 WiredTiger 的 OS_page_cache 限制时,无压缩的读性能要好于有压缩的读性能,这是因为 extent 缓冲在操作系统高速缓冲区中,当发生访问时从高速缓冲区直接获取无压缩 extent 转换成内存中的 page,只要一次内存中的结构重建即可;而压缩的 extent 需要进行解压缩后再重建,所以没有压缩的读性能更好。 

如果文件数据大小超出 OS_page_cache 限制后,extent 数据要从磁盘上读取,而有压缩的 extent 占用的空间比较小,从磁盘上读取的 I/O 访问时间是小于无压缩读取的时间的,这时有压缩的读性能要好于无压缩的读性能(后面单独用一个篇幅来分析 WT 的磁盘 I/O 相关的实现)。

除了压缩优化了数据的读写,WiredTiger 内存中的无锁 page 结构也使得读写操作具有更好的并发性,才使得 WiredTiger 在非常普通机器上有如此好的表现。

内存中的数据页

通过上面的介绍已经对 WiredTiger 的数据组织基本的了解,WiredTiger 数据组织方式就是 in-memory page 加 block-extent。先来对它内存部分的 in-memory page(内存数据页,简称为 page)来做分析。


WiredTiger 引擎中的 page 分以下几类&

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值