签到成功

知道了

CNDBA社区CNDBA社区

DM7 达梦数据库 内存结构 说明

2019-08-28 12:38 2192 0 转载 DM 达梦
作者: Dave

1 DM内存池概述

DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。

DM Server 的内存池包括共享内存池和其他一些运行时内存池。动态视图 V$MEM_POOL 详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握 DM Server 的内存使用情况。

https://www.cndba.cn/dave/article/3577

SQL> select distinct name from V$MEM_POOL order by name;

LINEID     NAME                 
---------- ---------------------
1          BACKUP POOL
2          CHECK POINT
3          CYT_CACHE
4          DBLINK POOL
5          DICT CACHE
6          DSQL ET POOL
7          DSQL STAT HISTORY
8          FLASHBACK SYS
9          HUGE AUX
10         LARGE_MEM_SQL_MONITOR
11         MEM FOR PIPE
12         NSEQ CACHE
13         POLICY GRP
14         PURG_POOL
15         RT_HEAP
16         RT_MEMOBJ_VPOOL
17         SESSION
18         SHARE POOL
19         SQL CACHE MANAGERMENT
20         VIRTUAL MACHINE

20 rows got

used time: 1.525(ms). Execute id is 168.
SQL>

dm.ini 中与内存配置有关的参数如下:

#memory pool and buffer
        MAX_OS_MEMORY                   =  95                   #Maximum Percent Of OS Memory
        MEMORY_POOL                     =  235                  #Memory Pool Size In Megabyte
        MEMORY_TARGET                   =  0                    #Memory Share Pool Target Size In Megabyte
        MEMORY_EXTENT_SIZE              =  1                    #Memory Extent Size In Megabyte
        MEMORY_LEAK_CHECK               =  0                    #Memory Pool Leak Checking Flag
        MEMORY_MAGIC_CHECK              =  2                    #Memory Pool Magic Checking Flag
        MEMORY_BAK_POOL                 =  4                    #Memory Backup Pool Size In Megabyte
        HUGE_MEMORY_THRESHOLD           =  0                    #Threshold Value in Kilobytes for memory that can be allocated from HUGE pool
        HUGE_MEMORY_PERCENTAGE          =  50                   #Maximum percent of HUGE buffer that can be allocated to work as common memory pool
        HUGE_BUFFER                     =  8                    #Initial Huge Buffer Size In Megabytes
        BUFFER                          =  1959                 #Initial System Buffer Size In Megabytes
        BUFFER_POOLS                    =  19                   #number of buffer pools
        FAST_POOL_PAGES                 =  3000                 #number of pages for fast pool
        FAST_ROLL_PAGES                 =  1000                 #number of pages for fast roll pages
        KEEP                            =  8                    #system KEEP buffer size in Megabytes
        RECYCLE                         =  470                  #system RECYCLE buffer size in Megabytes
        RECYCLE_POOLS                   =  19                   #Number of recycle buffer pools
        MULTI_PAGE_GET_NUM              =  1                    #Maximum number of pages for each read of buffer
        MAX_BUFFER                      =  3918                 #maximum system buffer size in Megabytes
        SORT_BUF_SIZE                   =  50                   #maximum sort buffer size in Megabytes
        SORT_BLK_SIZE                   =  1                    #maximum sort blk size in Megabytes
        SORT_BUF_GLOBAL_SIZE            =  1000                 #maximum global sort buffer size in Megabytes
        SORT_FLAG                       =  0                    #choose method of sort
        HAGR_HASH_SIZE                  =  100000               #hash table size for hagr
        HJ_BUF_GLOBAL_SIZE              =  500                  #maximum hash buffer size for all hash join in Megabytes
        HJ_BUF_SIZE                     =  50                   #maximum hash buffer size for single hash join in Megabytes
        HJ_BLK_SIZE                     =  1                    #hash buffer size allocated each time for hash join in Megabytes
        HAGR_BUF_GLOBAL_SIZE            =  500                  #maximum buffer size for all hagr in Megabytes
        HAGR_BUF_SIZE                   =  50                   #maximum buffer size for single hagr in Megabytes
        HAGR_BLK_SIZE                   =  1                    #buffer size allocated each time for hagr in Megabytes
        MTAB_MEM_SIZE                   =  8                    #memory table size in Kilobytes
        FTAB_MEM_SIZE                   =  0                    #file table package size in Kilobytes
        MMT_GLOBAL_SIZE                 =  4000                 #memory map table global size in megabytes
        MMT_SIZE                        =  0                    #memory map table size in megabytes
        MMT_FLAG                        =  1                    #ways of storing bdta data in memory map table
        DICT_BUF_SIZE                   =  5                    #dictionary buffer size in Megabytes
        HFS_CACHE_SIZE                  =  160                  #hfs cache size in Megabytes, used in huge horizon table for insert, update,delete
        VM_STACK_SIZE                   =  256                  #VM stack size in Kilobytes
        VM_POOL_SIZE                    =  64                   #VM pool size in Kilobytes
        VM_POOL_TARGET                  =  32768                #VM pool target size in Kilobytes
        SESS_POOL_SIZE                  =  64                   #session pool size in Kilobytes
        SESS_POOL_TARGET                =  32768                #session pool target size in Kilobytes
        RT_HEAP_TARGET                  =  8000                 #runtime heap target size in Kilobytes
        VM_MEM_HEAP                     =  0                    #Whether to allocate memory to VM from HEAP
        VM_SQL_TREE_CACHE_SIZE          =  0                    #VM sql tree cache size
        RFIL_RECV_BUF_SIZE              =  16                   #redo file recover buffer size in Megabytes
        N_MEM_POOLS                     =  1                    #number of memory pools 
        COLDATA_POOL_SIZE               =  0                    #coldata pool size for each worker group 
        HAGR_DISTINCT_HASH_TABLE_SIZE   =  10000                #Size of hagr distinct hash table
        CNNTB_HASH_TABLE_SIZE           =  100                  #Size of hash table in connect-by operation
        GLOBAL_RTREE_BUF_SIZE           =  100                  #The total size of buffer for rtree
        SINGLE_RTREE_BUF_SIZE           =  10                   #The size of buffer for single rtree
        SORT_OPT_SIZE                   =  0                    #once max memory size of radix sort assist count array

1.1 共享内存池

共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。在 DM Server 的运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。

DM 系统管理员可以通过 DM Server 的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为 MEMORY_POOL,该配置默认为 200M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展,INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池能扩展到的最大大小。

1.2 运行时内存池

除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。

https://www.cndba.cn/dave/article/3577

2 缓冲区

2.1 数据缓冲区

数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DM Server 至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用。https://www.cndba.cn/dave/article/3577

系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。

LRU 链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从 LRU 链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少 IO。

https://www.cndba.cn/dave/article/3577

在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将它们一直留在缓冲区中,对系统性能会有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域用于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。

2.1.1 类别

DM Server 中有四种类型的数据缓冲区,分别是 NORMAL、KEEP、FAST 和 RECYCLE。其中,用户可以在创建表空间或修改表空间时,指定表空间属于 NORMAL 或 KEEP 缓冲区。RECYCLE 缓冲区供临时表空间使用,FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理,用户不能指定使用 RECYCLE 和 FAST 缓冲区的表或表空间。

NORMAL 缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为 NORMAL;KEEP 的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为KEEP。

DM Server 提供了可以更改这些缓冲区大小的参数,用户可以根据自己应用需求情况,指 定 dm.ini 文件中 BUFFER(100MB) 、 KEEP(8MB) 、 RECYCLE(64MB) 、FAST_POOL_PAGES(3000)值(括号中为默认值),这些值分别对应是 NORMAL 缓冲区大小、KEEP 缓冲区大小、RECYCLE 缓冲区大小、FAST 缓冲区数据页总数。

2.1.2 读多页

在需要进行大量 I/O 的应用当中,DM 之前版本的策略是每次只读取一页。如果知道用户需要读取表的大量数据,当读取到第一页时,可以猜测用户可能需要读取这页的下一页,在这种情况下,一次性读取多页就可以减少 I/O 次数,从而提高了数据的查询、修改效率。

https://www.cndba.cn/dave/article/3577

DM Server 提供了可以读取多页的参数,用户可以指定这些参数来调整数据库运行效率的最佳状态。在 DM 配置文件 dm.ini 中,可以指定参数 MULTI_PAGE_GET_NUM 大小(默认值为 1 页),来控制每次读取的页数。

如果用户没有设置较适合的参数 MULTI_PAGE_GET_NUM 值大小,有时可能会给用户带来更差的效果。如果 MULTI_PAGE_GET_NUM 太大,每次读取的页可能大多都不是以后所用到的数据页,这样不仅会增加 I/O 的读取,而且每次都会做一些无用的 I/O,所以系统管理员需要衡量好自己应用需求,给出最佳方案。https://www.cndba.cn/dave/article/3577

2.2 日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘 IO 而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?主要是基于以下原因:

  1. 重做日志的格式同数据页完全不一样,无法进行统一管理;
  2. 重做日志具备连续写的特点;
  3. 在逻辑上,写重做日志比数据页 IO 优先级更高。

DM Server 提供了参数 RLOG_BUF_SIZE 对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为 2 的 N 次方,否则采用系统默认大小 512 页。

2.3 字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。

每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要 I/O 才能读取到这些信息。

https://www.cndba.cn/dave/article/3577

DM7 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为 DICT_BUF_SIZE,默认的配置大小为 5M。https://www.cndba.cn/dave/article/3577

2.4 SQL 缓冲区

SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。
很多应用当中都存在反复执行相同 SQL 语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了 SQL 语句执行效率,但同时给内存也增加了压力。

DM Server 在配置文件 dm.ini 提供了参数来支持是否需要计划重用,参数为USE_PLN_POOL,当指定为非 0 时,则启动计划重用;为 0 时禁止计划重用。DM 同时还提供了参数 CACHE_POOL_SIZE(单位为 MB),来改变 SQL 缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为 10M。

结果集缓存包括 SQL 查询结果集缓存和 DMSQL 程序函数结果集缓存,在 INI 参数文件中同时设置参数 RS_CAN_CACHE=1 且 USE_PLN_POOL 非 0 时 DM 服务器才会缓存结果集。

客户端结果集也可以缓存,但需要在配置文件 dm_svc.conf 中设置参数:

ENABLE_RS_CACHE = (1) //表示启用缓存;
RS_CACHE_SIZE = (100) //表示缓存区的大小为 100M, 可配置为 1-65535
RS_REFRESH_FREQ = (30) //表示每 30 秒检查缓存的有效性,如果失效,自动重查; 0 表示不检查。

https://www.cndba.cn/dave/article/3577

同时在服务器端使用INI参数文件中的CLT_CACHE_TABLES参数设置哪些表的结果集需要缓存。另外,FIRST_ROWS 参数表示当查询的结果达到该行数时,就返回结果,不再继续查询,除非用户向服务器发一个 FETCH 命令。这个参数也用于客户端缓存的配置,仅当结果集的行数不超过 FIRST_ROWS 时,该结果集才可能被客户端缓存。

3 排序区

排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。

DM Server 提供了参数来指定排序缓冲区的大小,参数 SORT_BUF_SIZE 在 DM 配置文件 dm.ini 中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值 2M。

4 哈希区

DM7 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM7创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是 VPOOL 内存池来进行哈希操作。

DM Server 在 dm.ini 中提供了参数 HJ_BUF_SIZE 来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。

除了提供 HJ_BUF_SIZE 参数外,DM Server 还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE 表示处理聚集函数时创建哈希表的个数,建议保持默认值 100000。

https://www.cndba.cn/dave/article/3577

5 SSD 缓冲区

固态硬盘采用闪存作为存储介质,因没有机械磁头的寻道时间,在读写效率上比机械磁盘具有优势。在内存、SSD 磁盘、机械磁盘之间,符合存储分级的条件。为提高系统执行效率,DM Server 将 SSD 文件作为内存缓存与普通磁盘之间的缓冲层,称为“SSD 缓存”。

DM Server 在的 dm.ini 中提供参数 SSD_BUF_SIZE 和 SSD_FILE_PATH 来配置 SSD 缓冲,SSD_BUF_SIZE 指定缓冲区的大小,单位是 M,DM Server 根据该参数创建相应大小的文件作为缓冲区使用;SSD_FILE_PATH 指定该文件所在的文件夹路径,管理员需要保证设置的路径是位于固态磁盘上。

默认 SSD 缓冲区是关闭的,即 SSD_BUF_SIZE 为 0。若要配置 SSD 缓冲区,将其设置为大于 0 的数并指定 SSD_FILE_PATH 即可。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Dave

Dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 1902
    原创
  • 2
    翻译
  • 456
    转载
  • 131
    评论
  • 访问:3642201次
  • 积分:3137
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by ZhiXinTech · 皖ICP备19020168号·

        QQ交流群