DM 服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。
DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等.
基于单进程多线程的架构下,达梦把使用的内存主要分成了三大部分。分别为:数据缓冲区主要由 buffer,FAST_POOL,RECYCLE,keep组成。
主内存池(MEMORY_POOL),以及其他运行时内存。
总体的架构图如下:
主要包括数据缓冲区,日志缓冲区
又分为共有与私有内存池
主要包括 sql_cache_pool(cache_pool_size) ,字典缓冲区(dict_buff_size),sort ,hash,hagr等
会话内存池,虚拟机内存池,排序缓冲区,哈希缓冲区都属于运行时内存。其特点是随着使用而产生,随着结束而释放。为了避免频繁向操作系统申请和释放带来的性能和碎片问题,这部分都被设计为从预分配池进行处理。但相较于会话和虚拟机内存池这类生命周期伴随整个会话的内存,排序缓冲区,哈希缓冲区生命周期要短得多,甚至仅伴随某个操作,所以并没有独立预分配池而是统一从共享池中进行处理,其他一些具备此种特定的小内存池也同理,其相关参数如下
SORT_BUF_GLOBAL_SIZE(全局排序区)
SORT_BUF_SIZE(单个线程排序的最大值)
SORT_BLK_SIZE 单个的排序缓冲区分片大小
SORT_FLAG 0表示整片数据排序,1表示大内存分片数据排序,2是为保证排序后相同数据不被打乱
一般SORT_BUF_GLOBAL_SIZE小于10G,不建议把SORT_FLAG=1设置
当SORT_FLAG=1时,默认SORT_BLK_SIZE大小,那么一个SORT_BUF_SIZE最多也就能用到10G空间大小,如果SORT_BUF_GLOBAL_SIZE设置小于10G的话,那么SORT_BUF_SIZE单个线程将把所有的内存吃满
因此,不要轻易把SORT_FLAG=1。 当收集统计信息比较慢,或者是添加索引慢是,可以临时把SORT_FLAG调整1,也是会话级别的,可以马上生效。
还有一种场景是我既想要使用大内存排序,又不想使用所有的sort排序空间,因此新增了一个参数sort_buf_single_size(控制单个排序操作符内存使用上线)当且仅当SORT_FLAG=1时有效,
hash和hagr相关
HJ_BUF_SIZE 单次HASH操作最大内存空间
HJ_BUF_GLOBAL_SIZE 系统最大HASH内存空间总和
HJ_BLK_SIZE HASH连接操作符每次分配缓存(BLK)大小,单位MB
HAGR_BUF_GLOBAL_SIZE 分组、嵌套连接、集合运算、分析函数运算、统计信息、DISTINCT、临时表、TOP、
ESEND操作符的数据总缓存大小,单位MB
HAGR_BUF_SIZE 单个分组、嵌套连接、集合运算、分析函数运算、统计信息、DISTINCT、临时表、TOP、ESEND操作符的数据总缓存大小,单位MB
HAGR_BLK_SIZE 分组、嵌套连接、集合运算、分析函数运算、统计信息、 DISTINCT、临时表、TOP、ESEND操作符每次分配缓存(BLK)大小,单位MB
HAGR_HASH_SIZE HAGR操作时,建立HASH表的桶个数
USE_DHASH_FLAG(3) 也可以启用动态hash 可以自动的调整
HAGR_HASH_SIZE表桶的个数
主内存池与其他运行时内存池实际上是相互依存的。每一种池都有初始值,taget值。
第二片和第三片内存区,系统初始化的时候初始值是直接从操作系统申请内存,如果初始值用光了,还没达到target值的时候,还是会从操作系统要内存,当超过target值后会从共享池中申请内存,避免频繁的与操作系统交互,产生性能问题。(具有独立内存池的组件一般会自行管理,没有独立设计内存池的组件一般从共享池管理)
SQL语句的执行分为几个阶段
.会话创建
.分析SQL语句
.执行SQL语句
一般来说,执行一条sql至少会从两个池中申请内存使用,会话创建时会自动创建一个SESSION内存池,空间从内存主池申请,事务、分析等非特殊操作符的内存一般由这个池申请,另外一个是在执行阶段,会创建一个VIRTUAL MACHINE内存池,实际执行的操作符中使用的内存大都来自此池,各个会话之间相互不影响,不存在内存临界区冲突,能够很好的提升并发性能,这也是实际应用中一般会话需要保持的原因之一(连接池)。
select
name, --内存池名称
is_shared, --是否是共享的
is_overflow, --是否用到了备份池
org_size/1024.0/1024.0, --内存池初始大小
TOTAL_size/1024.0/1024.0, --内存池总大小(包括扩展的)
RESERVED_SIZE/1024.0/1024.0, --当前已分配大小(包括扩展的)
DATA_SIZE/1024.0/1024.0, --实际有效字节
EXTEND_SIZE, --每次扩展多少
TARGET_SIZE, --目标大小
N_EXTEND_NORMAL , --TARGET范围内累计扩展次数
N_EXTEND_EXCLUSIVE --超过TARGET累计扩展次数
from v$mem_pool
order by TOTAL_size desc;
注意:
1 N_EXTEND_EXCLUSIVE如果长期大于0,说明长期从池外扩展,需要重点关注
2 用到备份池的话,需要保持高度关注,此时系统非常危险
3 内存池创建的线程号CRAETEOR可以与SESSION的THRD_ID关联,查看对应的某个会话的内存使用情况
4 如果RESERVED_SIZE比ORG_SIZE小,说明内存池非常空闲,需要把对于的初始内存放小,否则浪费
5 如果TOTAL_SIZE比TARGET_SIZE大,说明内存池不够,经常向池外申请,需要把对于的参数调大。尽量保持每个池自持
V$mem_reginfo详细的记录了当前系统所有在用内存的申请信息,需要设置INI参数MEMORY_LEAK_CHECK为1,该参数为动态参数.
V$mem_reginfo 一般与v$mem_fname做联合查询,v$mem_fname存放DM内部所有源码文件名以及编号信息.
Select * from v$mem_reginfo rg,v$mem_fname f where rg.fno=f.fno;
BUFFER使用情况
select
name, --缓冲区名称
n_pages, --页数
free, --空闲页数目
N_DISCARD64 --淘汰的页数
from v$bufferpool
注意:
如果FREE很多说明该缓冲区很空闲,可以适当的调整降低BUFFER缓冲区参数值
如果FREE项为0,或者N_DISCARD64非零,表示该缓冲区经常淘汰。这种情况,就说明对应的缓冲区参数太小,导致频繁淘汰,需要调整对应的缓冲区的参数
占用内存总量
select
(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;
注意:
达梦数据库使用的内存大致等于BUFFER + MPOOL,如果存在严重偏差则可能有泄露情况
内存池使用情况(在操作系统看来)
select name ,stat_val/1024.0/1024.0 from v$sysstat where CLASSID=11 ;
注意:
memory pool size in bytes: 内存池总的大小
memory used bytes: 内存池使用的内存大小
memory used bytes from os: 内存池从操作系统分配的大小
占用内存最多的会话
SELECT
A.CREATOR ,
B.SQL_TEXT ,
SUM(A.TOTAL_SIZE)/1024.0/1024.0 TOTAL_M, --当前总量(包括扩展)
SUM(A.DATA_SIZE) /1024.0/1024.0 DATA_SIZE_M --实际使用量
FROM
V$MEM_POOL A,
V$SESSIONS B
WHERE
A.CREATOR = B.THRD_ID
GROUP BY
A.CREATOR,
B.SQL_TEXT
ORDER BY
TOTAL_M DESC;
文章
阅读量
获赞