DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区
DM 内存结构
├── 内存池
│ ├── 共享内存池(启动时一次性向OS申请的大片内存)
│ └── 运行时内存池(各功能模块自己的内存池,如会话内存池、虚拟机内存池)
├── 缓冲区
│ ├── 数据缓冲区(NORMAL/FAST/RECYCLE三类)
│ ├── 日志缓冲区(存重做日志信息)
│ ├── 字典缓冲区(存数据字典信息)
│ └── SQL 缓冲区(存SQL执行时的执行计划、SQL语句、结果集信息)
├── 排序区
└── 哈希区(虚拟缓冲区)
执行SQL所用到的各种内存:
建立连接
│
└─ 创建会话(Session),有自己的会话内存池
│ 存放会话级对象:会话上下文、会话参数、会话变量、游标状态、事务上下文
│ 生命周期:整个连接期间
│
└─ 执行一条 SQL
│
├─ 创建虚拟机(VM),有自己的VM内存池
│ └─ 执行过程中的零碎内存需求:表达式计算、栈帧、运行时结构
│ 生命周期:本条语句的执行期间,执行完整个池销毁
│
├─ 需要读数据页 → 数据缓冲区(BUFFER)
├─ 需要表结构信息 → 字典缓冲区(DICT_BUF_SIZE)
├─ 需要执行计划 → SQL缓冲区找可重用的计划(CACHE_POOL_SIZE)
├─ 遇到排序 → 排序区配额内申请工作内存(SORT_BUF_SIZE)
├─ 遇到哈希连接 → 哈希区配额内申请工作内存(HJ_BUF_SIZE,虚拟配额)
└─ 产生 redo → 日志缓冲区(RLOG_BUF_SIZE,内存来自共享内存池)
DMServer的内存池包括共享内存池和一些运行时内存池。动态视图V$MEM_POOL可查看使用情况。
共享内存池是DMServer在启动时从操作系统申请的一大片内存。
工作原理:DMServer运行期间经常要申请与释放小片内存,直接向操作系统申请和释放需要发出系统调用,可能引起线程切换。于是DM采用共享内存池的方式:一次向操作系统申请一片较大内存作为共享内存池。运行过程中需要小片内存时在共享内存池内申请,用完后再归还给共享内存池。
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| MEMORY_POOL | 500 | 静态 | 共享内存池大小,单位MB。 |
| MEMORY_EXTENT_SIZE | 32 | 静态 | 共享内存池每次扩展的大小,单位 MB,取值 1~10240 |
| MEMORY_TARGET | 32 位 1000;64 位 15000 | 动态,系统级 | 共享内存池扩展到超过该值后,空闲时收缩回此大小,单位 MB,0 表示不限制 |
| MEMORY_N_POOLS | 1 | 静态 | 共享内存池个数(分片数),0 与 1 等价即不分片。分片时每池初始容量为 MEMORY_POOL / MEMORY_N_POOLS,但受最小初始容量 30M 限制 |
除共享内存池外,DMServer 的一些功能模块在运行时会使用自己的运行时内存池。这些池从操作系统申请一片内存作为本功能模块的内存池使用。
会话内存池:
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| SESS_POOL_SIZE | 64 | 动态,系统级 | 会话内存池大小,单位 KB,取值 16~1024*1024 |
| SESS_POOL_TARGET | 16384 | 动态,系统级 | 会话内存池能扩充到的最大大小,单位 KB,0 表示不限制 |
虚拟机内存池:(SQL 执行时用到的内存大部分从这里申请,执行级,用完即毁)
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| VM_POOL_SIZE | 64 | 静态 | 虚拟机内存池大小,单位 KB,取值 32~1024*1024 |
| VM_POOL_TARGET | 16384 | 静态 | 虚拟机内存池能扩充到的最大大小,单位 KB,0 表示不限制 |
| VM_MEM_HEAP | 0 | 动态,系统级 | 虚拟机是否使用HEAP分配内存。0 MEMORY POOL 模式;1 HEAP模式;2混合模式 |
[!NOTE]
这里的虚拟机指的是什么?
这里的虚拟机不是VMware,也不是JVM那种东西,而是DM自己的SQL执行引擎的抽象。
DM 每执行一条SQL(或一个存储过程/函数调用),就会创建一个虚拟机来跑它。
从管理员操作手册可以看到多项相关参数:
MAX_SQL_LEVEL(指定DM虚拟机允许的最大帧栈数)
MONITOR_SQL_EXEC(监控开关涉及到的对象是操作符、虚拟机栈帧、执行计划节点)
动态视图VVMS(虚拟机信息)、VSTKFRM(虚拟机栈帧信息),栈帧信息里记录着栈帧中第一个 SQL、当前栈帧级别、执行 SQL 的虚拟机地址、动态分配字节数。
什么是虚拟机的栈帧?
虚拟机里用栈帧来管理调用的层级,就像函数调用压栈一样,执行一个存储过程,里面又调用函数,又执行了嵌套SQL,每深入一层就多一个栈帧,MAX_SQL_LEVEL就是限制这个栈帧有多深。
虚拟机内存池存什么用?
SQL 语句在执行过程中,虚拟机需要各种各样的临时小内存,比如表达式的中间计算结果、运行时的数据结构、操作符的上下文信息、栈帧本身的开销等等。这些内存大部分从虚拟机自己的这个内存池里申请,用完归还。
缓冲区分为四种:数据缓冲区、日志缓冲区、字典缓冲区、SQL缓冲区
数据缓冲区是DMServer将数据页写入磁盘之前、以及从磁盘读取数据页之后,数据页所存放的地方。
数据缓冲区用三条链管理被缓冲的数据页:
三类数据缓冲区:
| 类型 | 用途 | 控制参数 | 缺省值 |
|---|---|---|---|
| NORMAL(通用数据缓冲区) | 主要提供给系统处理的一些数据页 | BUFFER(单位 MB) | 8000 |
| RECYCLE | 供临时表空间使用 | RECYCLE(单位 MB) | 300 |
| FAST | 存放反复访问的热页,由系统自动管理 | FAST_POOL_PAGES(页数) | 3000 |
日志缓冲区是用于存放重做日志的内存缓冲区。为避免直接磁盘 IO 影响性能,系统运行中产生的日志并不立即写入磁盘,而是先放到日志缓冲区中。
相关参数:RLOG_BUF_SIZE:单个日志缓冲区大小,以日志页个数为单位,缺省1024。
字典缓冲区主要存储数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都涉及数据字典信息,访问效率直接影响操作效率。例如执行查询语句就需要相应的表信息、列信息,如果这些字典信息在缓冲区里就直接获取,否则需要 IO 读取。
相关参数:DICT_BUF_SIZE:字典缓冲区大小,单位 MB,缺省20.
SQL 缓冲区提供执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。
排序缓冲区提供数据排序所需要的内存空间。执行 SQL 语句时常常需要排序,所用内存由排序缓冲区提供。每次排序过程都先申请内存,排序结束后再释放。
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| SORT_BUF_SIZE | 20 | 动态,会话级 | 原排序机制下排序缓冲区最大值,单位 MB,取值 1~2048。该值由系统内部排序算法和排序数据结构决定,建议使用默认值 |
| SORT_FLAG | 1 | 动态,会话级 | 排序机制。0 原排序机制;1 新排序机制(大内存排序);2 增加递增列;4 非比较排序算法;8 排序分片优化。支持组合值,如 3、5 |
| SORT_BLK_SIZE | 1 | 动态,会话级 | 新排序机制下排序缓冲区分片大小,单位 MB,能容纳1万至5万行待排序数据即可,须小于等于 SORT_BUF_SIZE |
| SORT_BUF_GLOBAL_SIZE | 1000 | 动态,系统级 | 新排序机制下排序全局内存使用上限,单位 MB,须大于 SORT_BUF_SIZE |
| SORT_BUF_SINGLE_SIZE | 10000 | 动态,会话级 | 单个排序操作符内存使用上限(大内存排序场景有效) |
哈希区是虚拟缓冲区,因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时对数据量进行计算:
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| HJ_BUF_SIZE | 500 | 动态,会话级 | 单个 HASH 连接操作符的数据总缓存大小,单位 MB。该值可能限制哈希连接效率,建议保持默认值或设置为更大的值 |
| HJ_BUF_GLOBAL_SIZE | 5000 | 动态,系统级 | HASH 连接操作符的数据总缓存大小,单位 MB,须大于 HJ_BUF_SIZE |
| HJ_BLK_SIZE | 2 | 动态,会话级 | HASH 连接操作符每次分配缓存(BLK)大小,单位 MB,须小于等于 HJ_BUF_SIZE |
| HAGR_HASH_SIZE | 100000 | 动态,会话级 | 处理集函数(HAGR)时创建哈希表的桶个数,建议保持默认值 100000 |
| HAGR_BUF_SIZE | 500 | 动态,会话级 | 单个分组等操作符的数据总缓存大小,单位 MB |
| HAGR_BUF_GLOBAL_SIZE | 5000 | 动态,系统级 | 分组等操作符的数据总缓存大小,单位 MB |
| HAGR_BLK_SIZE | 2 | 动态,会话级 | 分组等操作符每次分配缓存大小,单位 MB |
文章
阅读量
获赞
