注册
达梦数据库内存架构解析
技术分享/ 文章详情 /

达梦数据库内存架构解析

LHX 2025/04/25 116 1 0

一、DM数据库内存结构设计

达梦数据库(DM)作为一款成熟的RDBMS关系数据库管理系统,其内存架构设计体现了高效、精细的管理理念。DM将内存划分为多个功能区域,采用差异化管理策略,确保系统性能最优。
image.png

1.DM运行时内存池:

SESSION:管理与用户会话相关的内存,包括会话参数、状态信息等,断开会话时销毁。
VIRTUAL MACHINE:会话接入时新增,用于SQL虚拟机执行内存池。
RT_HEAP:会话上用于动态对象存储的初始空间。
INJECT HINT:Hint相关,指定SQL增加HINT时会使用到。

2.DM共享内存池:

SHARE POOL: 共享内存池,用于为其他内存池提供扩展内存。
BACKUP POOL:备份池,当操作系统分配内存失败时,会应急从备份池申请内存
FLASHBACK SYS:支持闪回功能的内存池,用于存储数据的历史版本以实现快速数据恢复。
SQL CACHE MANAGERMENT:SQL缓冲区负责储存sql的计划、语句和结果集缓存等信息。

3.DM缓冲区:

数据缓冲区:数据缓冲区用于缓存从磁盘读取的数据页和待写入磁盘的数据页,减少磁盘I/O操作。
日志缓冲区:日志缓冲区用于存放重做日志(Redo Log),避免直接的磁盘I/O操作,提高数据库性能。
字典缓冲区:字典缓冲区用于存储数据字典信息,存储库元数据信息,如模式信息、表信息、列信息等。
排序缓冲区:排序缓冲区提供数据排序所需要的内存空间。
hash缓冲区: 用户哈希计算的缓冲区,系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算,如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8创新的外存哈希方式。

4.其他国产数据库架构对比

以华为GAUSSDB为例,从其公开的整体架构看与DM差距不大,其数据缓冲区设计没有像达梦一样对不同业务数据进行明确分类,只是简单划分为行存和列存内存区。
image.png

4.1 GAUSS本地内存区

maintenance_work_mem:维护操作 vacuum,reindex使用
temp_buffers:临时表使用
work_mem:order by 和distinct 操作对元组进行排序,通过merge-join 和hash join 操作对表进行连接时使用

4.2GAUSS共享内存区

shared_buffers:控制行存缓冲区大小
cstore_buffers:控制列存缓冲区大小
wal_buffers:wal log数据的缓冲区
MOT buffer:全局内存,是一个长期内存池,包含MOT的数据和索引。平均分布在NUMA节点,由所有CPU核共享。

二、DM内存参数详解

1.共享内存池:

MEMORY_POOL:指定共享内存池的初始大小,默认为500MB。
MEMORY_TARGET:指定共享内存池的目标大小,即空闲时收缩到的大小,默认为15000MB(64位平台)。
MEMORY_N_POOLS:共享内存池个,共享内存池个数。每个池的初始容量和target容量用除法计算,有最小30M初始容量限制,因此实际分片数可能会小于 MEMORY_N_POOLS。
MEMORY_EXTENT_SIZE:指定共享内存池每次扩展的大小,默认为32MB。
MEMORY_BAK_POOL:当常规的内存申请都失败时,从这个备用内存里分配,然后在上层模块中进行必要的容错处理。
MEMORY_LEAK_CHECK :是否开启内存泄漏检测。
MEMORY_MAGIC_CHECK :是否开启对所有内存池的校验。

2.运行时内存池

VM_STACK_SIZE:系统执行时虚拟机堆栈大小。
VM_POOL_SIZE:系统执行时虚拟机内存池大小 、VM_POOL_TARGET:虚拟机内存池能扩充到的最大大小。
RT_HEAP_TARGET:会话上用于动态对象存储的 RT_HEAP 最大可扩展到的大小。

3.数据缓冲区:

BUFFER:系统缓冲区大小。
BUFFER_POOLS : BUFFER 系统分区数。
FAST_POOL_PAGES :快速缓冲区页数。
FAST_ROLL_PAGES : BUFFER 中 FAST POOL 回滚页数量。
RECYCLE: RECYCLE 缓冲区大小。
RECYCLE_POOLS: RECYCLE 缓冲区分区数。
KEEP: KEEP 缓冲区大小。

4.日志缓冲区:

RLOG_BUF_SIZE:指定日志缓冲区的大小,单位为页数量,且必须为2的幂次方。

5.字典缓冲区

DICT_BUF_SIZE:指定字典缓冲区的大小,默认为50MB。

6.SQL缓冲区

CACHE_POOL_SIZE:指定SQL缓冲区的大小,用来存储包信息(PACKAGE) 、执行计划、结果集缓存,命令率下降可以加大该参数。
USE_PLN_POOL:并非内存参数,控制是否启用执行计划重用功能。
BIND_PLN_PERCENT:固定计划占据计划缓存空间的最大比例。

7.排序缓冲区

SORT_FLAG:新旧排序类型机制(先分片再排序),当SORT_FALG =1时 SORT_BUF_SIZE等参数不生效。
SORT_BLK_SIZE:新排序缓冲区分片大小。
SORT_ADAPTIVE_FLAG:排序区大小自适应。
SORT_BUF_SIZE:原排序机制下,排序缓存区最大值。
SORT_BUF_GLOBAL_SIZE:新排序机制下,排序全局内存使用上限。
SORT_OPT_SIZE:整型/浮点型数据排序优化辅助空间大小。
TSORT_OPT:排序优化选项。0:排序操作一律使用估算的行数分配内存(至少 2M);1:打开优化,排序操作结果行数较少时,使用实际的记录行数分配内存。

8.hash缓冲区

HAGR_HASH_SIZE : HAGR 操作时,建立 HASH 表的桶个数。
HJ_BUF_GLOBAL_SIZE: 全局hash连接的最大内存空间。
HJ_BUF_SIZE :单个hash连接的最大内存空间。
HJ_BLK_SIZE:单个hash连接每次申请的内存空间。
HAGR_BUF_GLOBAL_SIZE:全局hash分组最大内存空间,HAGR(hash聚集)、DIST(去重)、集合操作、SPL2(分组排序)、NTTS2(临时表)、 HTAB (哈希表相关操作)操作符的数据总缓存大小。
HAGR_BUF_SIZE:单次hash分组最大内存空间。
HAGR_BLK_SIZE:单个hash分组每次分配的内存空间。
HAGR_DISTINCT_HASH_TABLE_SIZE:分组 DISTINCT 操作中 HASH 表的大小(桶数)。
CNNTB_HASH_TABLE_SIZE:用于控制层次查询(CNNTB操作符)中哈希表的内存分配大小,直接影响复杂递归查询(如树形结构数据遍历)的执行效率。
FBACK_HASH_SIZE:闪回系统中 HASH 表的桶个数。

9.其他内存参数

HUGE_MEMORY_PERCENTAGE:指示 HUGE_BUFFER 中可以借用作常规内存分配的空间百分比,取值范围为 0~100。
HUGE_BUFFER:HUGE 表使用的缓冲区大小。
HUGE_BUFFER_POOLS:HUGE BUFFER 系统分区数。
HFS_CACHE_SIZE:HUGE 表 I/U/D 时 HDTA_BUFFER 缓存池大小。
MULTI_PAGE_GET_NUM:缓冲区最多一次读取的页面数。
PRELOAD_SCAN_NUM:数据页首次预加载时连续扫描的页数。
PRELOAD_EXTENT_NUM:数据页首次预加载的簇数量。
MAL_LEAK_CHECK:是否打开 MAL 内存泄露检查。
MTAB_MEM_SIZE:MTAB 缓存 BDTA 占用内存空间的大小。
MMT_SIZE: MMT大小。MMT通过内存映射文件技术将部分数据缓存在内存中,平衡I/O与内存消耗,代价是有内存开销。
MMT_GLOBAL_SIZE:系统总共使用 MMT 的文件总大小。
MMT_FLAG: MMT 存储数据方式。1:按页存储;2:BDTA 存储(块级、顺序访问快,大数据量吞吐量高、资源占用较大)。
GLOBAL_RTREE_BUF_SIZE:R 树全局缓冲区大小。
SINGLE_RTREE_BUF_SIZE:单个 R 树的缓冲区大小,单位 MB。
XBOX_MEMORY_TARGET: XBOX消息盒子,是用来存放和管理消息的一块内存区域, XBOX系统内存在扩充到此大小以上后,空闲时收缩回此指定大小。
RT_HEAP_TARGET:会话上用于动态对象存储的 RT_HEAP 最大可扩展到的大小,单位 KB,取值范围 8192~1010241024。

三、DM内存监控与调优

1.MEM使用内存情况

    A.CREATOR,
    B.SQL_TEXT,
    SUM(A.TOTAL_SIZE) / 1024 / 1024 AS TOTAL_MB, -- 总内存使用量(MB)
    SUM(A.DATA_SIZE) / 1024 / 1024 AS DATA_SIZE_MB -- 数据部分内存使用量(MB)
FROM 
    V$MEM_POOL A,
    V$SESSIONS B
WHERE 
    A.CREATOR = B.THRD_ID
GROUP BY 
    A.CREATOR,
    B.SQL_TEXT
ORDER BY 
    TOTAL_MB DESC;

2.BUFFER 缓冲区使用情况

N_DIRTY,  --脏页目数
N_CLEAR  ,--非空闲页数目
FREE  , --FREE页数目
N_TOTAL_PAGES ,--总大小
N_MAX_PAGES,--最多的页数
N_DISCARD, --淘汰的页数
N_EXP_BUFFERPOOL,--拓展缓冲区个数
N_PHY_WRITE --物理写入磁盘总数
from v$bufferpool

3.BUFFER 缓冲区命中率

select name,sum(n_pages*page_size)/1024/1024/1024,
sum(rat_hit)/count(1) from v$bufferpool group by name;

4.缓冲区和内存池的大小

(select sum(n_pages * page_size)/1024/1024 from v$bufferpool)|| 'MB' as BUFFER_SIZE,
( select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as mem_pool,
(select sum(n_pages * page_size)/1024/1024 from v$bufferpool)+(select sum(total_size)/1024/1024 from v$mem_pool)||'MB' as TOTAL_SIZE
From dual;

5. 内存安全机制

5.1 DM内存溢出检测原理

(1)内存申请: 每次申请内存时,内存块分为三部分:管理结构、实际使用内存和校验码。
(2)校验码: 由固定魔术数和内存管理结构首地址计算得出。
(3)内存校验:
MEMORY_MAGIC_CHECK为1: 计算校验码并与内存尾部校验码比较,不一致则可能溢出,数据库停止。
MEMORY_MAGIC_CHECK为2: 在1的基础上,检查申请内存长度后的每一位特殊校验码,任一失败则停止。若此模式较慢,可改为1。

5.2查询扩展过大的内存池:

SELECT * FROM v$mem_pool WHERE n_extend_exclusive <> 0;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服