暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

虚谷数据库内存结构探究

原创 石河 2024-02-29
509

非数据库专家,一步一步探究国产数据库。以下内容均为个人研究,非官方文档。如有错误,欢迎留言指正。

对虚谷数据库感兴趣的各位,可添加个人微信:shihe25 邀您加入虚谷数据库技术交流群。

虚谷数据库内存结构图

话不多说,先看图,据悉虚谷数据库内存结构目前分为5大块:数据缓冲区内存、SGA系统全局缓冲区内存、SWAP交换缓冲区内存、MONITOR区内存、线程内存。仍有其他内存区,但无可观测性,暂不做研究。

image.png

内存各区域进行概述:

**内存块(block_size):**存储结构中虚谷采用分片分块技术,在内存结构中,虚谷数据库同样将每个可用内存区划分成大大小小的块进行数据缓冲。数据块的大小一般默认8K,但不同的内存区的块大小规则并不一致。

**数据缓冲区内存(data_buff_mem):**受data_buff_mem控制,此区域中的数据块大小,默认为8192字节,无法更改。数据块个数=data_buff_mem/块大小。该区域用于数据库未落盘数据的数据缓存,当产生CKPT时,提交本区域内所有脏数据,产生CKPT1时,提交部分脏数据。在系统服务启动时,会依据该参数给定的内存大小从操作系统分配内存,再按block_size的大小为最小管理单元对这块完整的内存进行划分;划分后单元内存由buffer管理器分组管理(组数由cata_parti_num控制)。

**SGA系统全局缓冲区内存(system_sga_mem):**系统全局区(SGA)初始额定总内存;SAG通常用于连接、集合、排序、去重等运算的中间结果缓存,SGA内存单元大小受参数ena_share_sga影响。若ena_share_sga为true,则SGA与数据缓存块的最小内存单元相同(8KB);若ena_share_sga为false,则SGA的最小内存单元为256KB;

**SWAP交换缓冲区内存(swap_buff_mem):**交换缓存块(SWAP)初始额定总内存,swap内存用于排序、hash、聚合等运算的文件转出和读取,块大小为256K,区别与data_buff_mem 此缓存管理没有分组设计,当swap内存不足时,后续任务堆swap内存的请求阻塞等待,直到swap内存回收重用。
以hashjoin为例,当sga不足或max_hash_mem使用完后将启动文件转出(使用临时表空间),转出逻辑文件组由 hash_parti_num 决定,将使用hash_parti_num*2个交换缓存块(按默认值计算16×2×256K=8M)。

**MONITOR区内存:**此区域为sys_monitor系统监控表可见内存,用做数据库状态监控。其中包含多个内存小区,有如下特点:

名称 含义 备注
G_MEM 全局内存消耗(单位:字节)
CATA_MEM catalog内存消耗(单位:字节) 初始固定大小:约18.5M
TRAN_MEM 事务内存消耗(单位:字节) 初始固定大小:2M
NET_MEM 用户连接用内存消耗(单位:字节) 初始固定大小:4M
TASK_MEM 任务线程内存消耗(单位:字节) 初始固定大小:2M
MSG_MEM 内部通讯消息内存消耗(单位:字节) 受MSG_SIZE参数影响
LOCK_MEM 局部锁内存消耗(单位:字节) 初始固定大小:1M
GLOCK_MEM 全局锁内存消耗(单位:字节) 初始固定大小:1M
DLCHK_MEM 死锁检测内存消耗(单位:字节) 初始固定大小:约64K
MODI_MEM 变更日志内存消耗(单位:字节) 初始固定大小:8M,仅存在于G节点和单机
PROC_MEM 过程执行机内存消耗(单位:字节) 初始值为0,4M跨度

**事务日志缓冲区内存(XLOG_BUFF_MEM )😗*REDO日志缓冲区额定总内存,缓存待写入redo文件的事务日志,缓存内容由redo写盘线程做落盘处理,落盘后缓存可回收重用。
事务日志为实时写盘,此内存也是实时回收,仅当磁盘顺序写入能力小于事务日志写入量时,会发生事务日志写入等待阻塞。

**数据库线程工作内存:**数据库任务通过线程分发调度,线程初始内存为64K,此区域内存直接从服务器可用内存区借用。当DQL语句执行时,此区域将存放通过索引收集到的rowpos数据、表数据的前2000条左右、join内支的部分数据、hash表内存等。

深入理解内存调度流程

当虚谷数据库接收客户的请求后,数据库线程将处理该请求。每个工作线程上有初始工作内存并随着任务的复杂的而增加,当线程的工作内存上涨到一定程度仍无法满足需求时,此时将会调用SGA内存区或者通过SWAP内存启用临时表空间进行文件的转出和读取。不同的SQL语句调用内存的流程也并不相同。以DQL、DML语句为例,见下图:

image-20240229151809866

DQL语句,也就是查询语句执行时,数据文件将少量数据交给线程工作内存,其余数据交给SGA_BUFF和DATA_BUFF。当sql中含有复杂的运算时,数据将在SGA_BUFF中进行分组、排序、去重等操作,并将运算后的数据缓存到SGA_BUFF中。若SGA_BUFF区不足或超过max_hash_mem配置,此时将通过SWAP_BUFF调用临时文件(临时表空间)将文件进行转出和读取。

image-20240229160644019

DML语句执行时,需要操纵实际数据,虚谷将需修改的数据加载到DATA_BUFF中供事务操作。工作线程操作数据时,控制文件、UNDO文件等文件将被操作对象的控制信息、UNDO信息等也加载到内存,供事务定位到需求数据。工作线程在操作数据的同时,实时将redo信息通过XLOG_BUFF保存并落盘写入REDO文件。

作者的话

虚谷数据库内存结构,通过虚谷的配置参数和事务调度时系统字典的变化而得出,仅为实验估算数据,不代表官方文档。如有错误之处,欢迎留言指正。后续仍会对虚谷的线程模型、存储模型、网络模型进行结构探究,敬请期待。

预告下一篇文章《国产数据库,该何时入局》,欢迎关注。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论