我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mongo进阶-wt引擎-page生命周期

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mongo进阶-wt引擎-page生命周期

通过前文我们了解到数据以page为单位加载到cache; 有必要系统的分析一页page的生命周期、状态以及相关参数的配置,这对后续MongoDB的性能调优和故障问题的定位和解决有帮助。

为什么要了解Page生命周期

通过前文我们了解到数据以page为单位加载到cache、cache里面又会生成各种不同类型的page及为不同类型的page分配不同大小的内存、eviction触发机制和reconcile动作都发生在page上、page大小持续增加时会被分割成多个小page,所有这些操作都是围绕一个page来完成的。

因此,有必要系统的分析一页page的生命周期、状态以及相关参数的配置,这对后续MongoDB的性能调优和故障问题的定位和解决有帮助。

Page的生命周期

Page的典型生命周期如下图所示:

  • pages从磁盘读到内存;

  • pages在内存中被修改;

  • 被修改的脏pages在内存被reconcile,完成后将discard这些pages。

  • pages被选中,加入淘汰队列,等待被evict线程淘汰出内存;

  • evict线程会将“干净“的pages直接从内存丢弃(因为相对于磁盘page来说没做任何修改),将经过reconcile处理后的磁盘映像写到磁盘再丢弃“脏的”pages。

pages的状态是在不断变化的,因此,对于读操作来说,它首先会检查pages的状态是否为WT_REF_MEM,然后设置一个hazard指针指向要读的pages,如果刷新后,pages的状态仍为WT_REF_MEM,读操作才能继续处理。

与此同时,evict线程想要淘汰pages时,它会先锁住pages,即将pages的状态设为WT_REF_LOCKED,然后检查pages上是否有读操作设置的hazard指针,如有,说明还有线程正在读这个page则停止evict,重新将page的状态设置为WT_REF_MEM;如果没有,则pages被淘汰出去。

Page的各种状态

针对一页page的每一种状态,详细描述如下:

  • WT_REF_DISK: 初始状态,page在磁盘上的状态,必须被读到内存后才能使用,当page被evict后,状态也会被设置为这个。

  • WT_REF_DELETED: page在磁盘上,但是已经从内存B-Tree上删除,当我们不在需要读某个leaf page时,可以将其删除。

  • WT_REF_LIMBO: page的映像已经被加载到内存,但page上还有额外的修改数据在lookasidetable上没有被加载到内存。

  • WT_REF_LOOKASIDE: page在磁盘上,但是在lookasidetable也有与此page相关的修改内容,在page可读之前,也需要加载这部分内容。

当对一个page进行reconcile时,如果系统中还有之前的读操作正在访问此page上修改的数据,则会将这些数据保存到lookasidetable;当page再被读时,可以利用lookasidetable中的数据重新构建内存page。

  • WT_REF_LOCKED: 当page被evict时,会将page锁住,其它线程不可访问。

  • WT_REF_MEM: page已经从磁盘读到内存,并且能正常访问。

  • WT_REF_READING: page正在被某个线程从磁盘读到内存,其它的读线程等待它被读完,不需要重复去读。

  • WT_REF_SPLIT: 当page变得过大时,会被split,状态设为WT_REF_SPLIT,原来指向的page不再被使用。

Page的大小参数

无论将数据从磁盘读到内存,还是从内存写到磁盘,都是以page为单位调度的,但是在磁盘上一个page到底多大?是否是最小分割单元?以及内存里面的各种page的大小对存储引擎的性能是否有影响?本节将围绕这些问题,分析与page大小相关的参数是如何影响存储引擎性能的。 总的来说,涉及到的关键参数和默认值如下表所示:

参数名称默认配置值含义
allocation_size4KB磁盘上最小分配单元
memory_page_max5MB内存中允许的最大page值
internal_page_max4KB磁盘上允许的最大internal page值
leaf_page_max32KB磁盘上允许的最大leaf page值
internal_key_max1/10*internal_pageinternal page上允许的最大key值
leaf_key_max1/10*leaf_pageleaf page上允许的最大key值
leaf_key_value1/2*leaf_pageleaf page上允许的最大value值
split_pct75%reconciled的page的分割百分比

详细说明如下:

  • allocation_size

MongoDB磁盘文件的最小分配单元(由WiredTiger自带的块管理模块来分配),一个page的可以由一个或多个这样的单元组成;默认值是4KB,与主机操作系统虚拟内存页的大小相当,大多数场景下不需要修改这个值。

  • memory_page_max

WiredTigerCache里面一个内存page随着不断插入修改等操作,允许增长达到的最大值,默认值为5MB。当一个内存page达到这个最大值时,将会被split成较小的内存pages且通过reconcile将这些pages写到磁盘pages,一旦完成写到磁盘,这些内存pages将从内存移除。

需要注意的是:split和reconcile这两个动作都需要获得page的排它锁,导致应用程序在此page上的其它写操作会等待,因此设置一个合理的最大值,对系统的性能也很关键。

如果值太大,虽然spilt和reconcile发生的机率减少,但一旦发生这样的动作,持有排它锁的时间会较长,导致应用程序的插入或修改操作延迟增大;

如果值太小,虽然单次持有排它锁的时间会较短,但是会导致spilt和reconcile发生的机率增加。

  • internal_page_max

磁盘上internalpage的最大值,默认为4KB。随着reconcile进行,internalpage超过这个值时,会被split成多个pages。

这个值的大小会影响磁盘上B-Tree的深度和internalpage上key的数量,如果太大,则internalpage上的key的数量会很多,通过遍历定位到正确leaf page的时间会增加;如果太小,则B-Tree的深度会增加,也会影响定位到正确leaf page的时间。

  • leaf_page_max

磁盘上leaf page的最大值,默认为32KB。随着reconcile进行,leaf page超过这个值时,会被split成多个pages。

这个值的大小会影响磁盘的I/O性能,因为我们在从磁盘读取数据时,总是期望一次I/O能多读取一点数据,所以希望把这个参数调大;但是太大,又会造成读写放大,因为读出来的很多数据可能后续都用不上。

  • internal_key_max

internalpage上允许的最大key值,默认大小为internalpage初始值的1/10,如果超过这个值,将会额外存储。导致读取key时需要额外的磁盘I/O。

  • leaf_key_max

leaf page上允许的最大key值,默认大小为leaf page初始值的1/10,如果超过这个值,将会额外存储。导致读取key时需要额外的磁盘I/O。

  • leaf_value_max

leaf page上允许的最大value值(保存真正的集合数据),默认大小为leaf page初始值的1/2,如果超过这个值,将会额外存储。导致读取value时需要额外的磁盘I/O。

  • split_pct

内存里面将要被reconciled的 page大小与internal_page_max或leaf_page_max值的百分比,默认值为75%,如果内存里面被reconciled的page能够装进一个单独的磁盘page上,则不会发生spilt,否则按照该百分比值*最大允许的page值分割新page的大小。

Page无锁及压缩

https://blog.csdn.net/weixin_45583158/article/details/100143033

参考文章

  • 文章来源在新窗口打开

  • 作者:郭远威

  • MongoDB中文社区委员,长沙分会主席;《大数据存储MongoDB实战指南》作者资深大数据架构师,通信行业业务架构与数据迁移专家

  • 文章来源在新窗口打开

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mongo进阶-wt引擎-page生命周期

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mongo进阶-wt引擎-page生命周期

通过前文我们了解到数据以page为单位加载到cache; 有必要系统的分析一页page的生命周期、状态以及相关参数的配置,这对后续MongoDB的性能调优和故障问题的定位和解决有帮助。Mongo进阶 - WT引擎:Page生命周期为什么要了解Page生命周期Page的生命周期Page的各种状态Page的大小参数Page
mongo进阶-wt引擎-page生命周期
2024-04-02

mongo进阶-wt引擎-checkpoint原理

Checkpoint主要有两个目的: 一是将内存里面发生修改的数据写到数据文件进行持久化保存,确保数据一致性;二是实现数据库在某个时刻意外发生故障,再次启动时,缩短数据库的恢复时间,WiredTiger存储引擎中的Checkpoint模块就是来实现这个功能的。Mongo进阶 - WT引擎:checkpoint原理为什么
mongo进阶-wt引擎-checkpoint原理
2024-04-02

mongo进阶-wt引擎-数据结构

MongoDB的WiredTiger存储引擎背后采用了什么样的数据结构呢?本文将从常见引擎数据结构,典型B-Tree数据结构,磁盘数据结构, 内存数据结构, Page数据结构等方面详解介绍。Mongo进阶 - WT引擎:数据结构存储引擎及常见数据结构典型B-Tree数据结构WiredTiger数据文件在磁盘上的数据结构
mongo进阶-wt引擎-数据结构
2024-04-02

编程热搜

  • mongo入门-基本使用-安装和crud
    在理解MongoDB基础概念后,本文将介绍MongoDB的安装和最基本的CURD操作。Mongo入门 - 基本使用:安装和CRUDMongoDB安装一些参考文档以Linux为例安装连接和建库CRUD操作InsertQueryUpdateDeleteBulkWrite参考文档# MongoDB安装MongoDB的安装比较
    mongo入门-基本使用-安装和crud
  • mongo入门-基本使用-java-api
    本文为低优先级,只是向你介绍下MongoDB提供的原生的JavaAPI;而大多数公司使用Spring框架,会使用Spring Data对MongoDB原生API的封装,比如JPA,MongoTemplate等。Mongo入门 - 基本使用:Java APIMongoDB Driver代码测试# MongoDB Driv
    mongo入门-基本使用-java-api
  • mongo进阶-db核心-索引实现
    为什么需要索引?当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样适用于其他的数据库比如mysql)。mongo-9552:PRIMARY> db.person.find(){ "_id"&nb
    mongo进阶-db核心-索引实现
  • mongo进阶-wt引擎-checkpoint原理
    Checkpoint主要有两个目的: 一是将内存里面发生修改的数据写到数据文件进行持久化保存,确保数据一致性;二是实现数据库在某个时刻意外发生故障,再次启动时,缩短数据库的恢复时间,WiredTiger存储引擎中的Checkpoint模块就是来实现这个功能的。Mongo进阶 - WT引擎:checkpoint原理为什么
    mongo进阶-wt引擎-checkpoint原理
  • mongo进阶-db核心-分片sharding
    分片(sharding)是MongoDB通过水平扩展将数据集分布在不同的服务器上来提高自己的存储容量和吞吐量。和MySQL分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同服务器之间的均衡。Mongo进阶 - DB核心:分片Sharding分片
    mongo进阶-db核心-分片sharding
  • mongo入门-mongodb整体生态
    很多人在学习Mongo时仅仅围绕着数据库功能,围绕着CRUD和聚合操作,但是MongoDB其实已经基本形成了它自身的生态了。我们在学习一项技能时一定要跳出使用的本身,要从高一点的格局上了解整个生态,这样会对你构筑知识体系有很大的帮助。Mongo入门 - MongoDB整体生态整体生态MongoDB ServerMong
    mongo入门-mongodb整体生态
  • mongo入门-基本使用-spring集成
    本文为主要介绍Spring Data对MongoDB原生API的封装,比如Spring-data-mongo,MongoTemplate等。以及原生API和Spring data系列之间的关系。Mongo入门 - 基本使用:Spring集成Spring Data 与 MongoDBSpring Data的层次结构spr
    mongo入门-基本使用-spring集成
  • mongo入门-mongodb基础概念
    在学习MongoDB之前先简单了解相关概念。Mongo入门 - MongoDB基础概念什么是NoSQL?为什么使用NoSQL?NoSQL数据库的简要历史NoSQL的功能什么是MongoDBMongoDB功能为什么使用MongoDBMongoDB常用术语MongoDB与RDBMS区别# 什么是NoSQL?NoSQL是一种
    mongo入门-mongodb基础概念
  • mongo入门-基本使用-效率工具
    本文将主要介绍常用的MongoDB的工具,这些工具可以极大程度的提升你的效率。Mongo入门 - 基本使用:效率工具官方MongoDB CompassNoSQLBoosterRobot3TVs Code plugin其它# 官方MongoDB Compass推荐使用MongoDB Compass,所以详细截几个图给大家
    mongo入门-基本使用-效率工具
  • mongo进阶-db核心-复制集
    在实际的生产环境中,我们需要考虑数据冗余和高可靠性,即通过在不同的机器上保存副本来保证数据的不会因为单点损坏而丢失;能够随时应对数据丢失、机器损坏带来的风险。MongoDB的复制集就是用来解决这个问题的,一组复制集就是一组mongod实例掌管同一个数据集,实例可以在不同的机器上面。实例中包含一个主导,接受客户端所有的写
    mongo进阶-db核心-复制集

目录