SQL> select SVR_VERSION,DB_VERSION||' '||BUILD_VERSION from V$INSTANCE;
行号 SVR_VERSION DB_VERSION||''||BUILD_VERSION
---------- -------------------------- --------------------------------------------------------
1 DM Database Server x64 V8 DB Version: 0x7000c 1-3-12-2023.04.17-187846-20040-ENT
数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用
都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是 DBMS 系统所必
须的。通常内存管理系统会带来以下好处:
申请、释放内存效率更高;
能够有效地了解内存的使用情况;
易于发现内存泄露和内存写越界的问题。
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
可以通过V$MEM_POOL视图查看所有内存池的情况。
SQL> select distinct name,is_shared from V$MEM_POOL order by 2;
行号 NAME IS_SHARED
---------- --------------- ---------
1 CHECK POINT N
2 INJECT HINT N
3 PURG_POOL N
4 RT_HEAP N
5 RT_MEMOBJ_VPOOL N
6 SESSION N
7 VIRTUAL MACHINE N
8 BACKUP POOL Y
9 CYT_CACHE Y
10 DBLINK POOL Y
11 DICT CACHE Y
...
18 MEM FOR PIPE Y
19 MON ITEM ARR Y
20 NSEQ CACHE Y
21 PARALLEL LOADER POOL Y
22 POLICY GRP Y
行号 NAME IS_SHARED
---------- --------------------- ---------
23 RRAF_TS_CP_SYS Y
24 RT_MEMOBJ_VPOOL Y
25 SHARE POOL 000 Y
26 SQL CACHE MANAGERMENT Y
27 TRX Y 28 XBOX SYS Y 29 XMAL SYS Y
通过查询结果,可以了解DM的内存池包括共享内存池和其他一些运行时内存池
共享内存是 dmserver 启动时,从操作系统中申请的一大片内存,一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
SQL> select PARA_NAME,PARA_TYPE,PARA_VALUE from v$dm_ini where para_name like '%MEM%';
行号 PARA_NAME PARA_VALUE
---------- ---------------------- ----------
1 MAX_OS_MEMORY 100
2 MEMORY_POOL 500
3 MEMORY_N_POOLS 1
4 MEMORY_TARGET 15000
5 MEMORY_EXTENT_SIZE 32
6 MEMORY_LEAK_CHECK 0
7 MEMORY_MAGIC_CHECK 1
8 MEMORY_BAK_POOL 4
9 HUGE_MEMORY_PERCENTAGE 50
10 MTAB_MEM_SIZE 8
11 FTAB_MEM_SIZE 0
#MAX_OS_MEMORY:DM 服务器能使用的最大内存占操作系统物理内存与虚拟内存总和的百分比,取值范围 40~100。当取值 100 时,服务器不进行内存的检查(对于 32 位版本的 DM 服务器,虚拟内存最大为 2G)
#MEMORY_POOL:共享内存池的大小默认500M
#MEMORY_N_POOLS: 共享内存池的个数
#MEMORY_TARGET :共享内存池在扩充到此大小以上后,空闲时收缩回此指定大小,单位MB,取值范围:32位平台为0~2000,64位平台为0~67108864,0表示不限制
#MEMORY_EXTENT_SIZE :共享内存池每次扩充的大小,单位 MB,取值范围 1~10240
除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。
这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存
池、虚拟机内存池等
数据缓冲区保存的是数据页,包括用户更改的数据页和查询时从磁盘读取的数据页。该区域大小对实例性能的影响较大,设定过小会导致缓冲页命中率低,磁盘I/O频繁;设定过大会导致内存资源的浪费。实例在启动时,根据配置文件中参数指定的数据缓冲区大小,向操作系统申请一片连续的内存,并将其按数据页大小进行格式化,最后置入“自由”链中。数据缓冲区有3条链来管理被缓冲的数据页。(1)“自由”链,用于存放目前尚未使用的内存数据页。
(2)“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改的内存数据页)。
(3)“脏”链,用于存放已被修改过的内存数据页。“LRU”链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的“自由”链被用完时,从“LRU”链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,从而减少物理I/O操作。如果某些数据页访问非常频繁,可以将它们存放到缓冲区中的特定区域KEEP缓冲区中,从而保证这些数据页一直留在数据缓冲区中。可以通过以下视图查看缓冲区的相关信息。
(1)V$BUFFERPOOL:页面缓冲区动态性能表,用来记录页面缓冲区结构的信息。
(2)V$BUFFER_LRU_FIRST:显示所有缓冲区“LRU”链首页信息。
(3)V$BUFFER_LRU_LAST:显示所有缓冲区“LRU”链末页信息。
1)缓冲区类型通过如下SQL语句查询V$BUFFERPOOL视图,可以看出DM实例的内存数据缓冲区有5种类型:NORMAL、KEEP、FAST、RECYCLE和ROLL。
SQL> select distinct name,count(*) from v$bufferpool group by name order by 2; 行号 NAME COUNT(*) ---------- ------- -------------------- 1 ROLL 1 2 FAST 1 3 KEEP 1 4 RECYCLE 3 5 NORMAL 9 已用时间: 4.361(毫秒). 执行号:10000.
在创建表空间或修改表空间时,可以指定表空间属于NORMAL缓冲区或KEEP缓冲区。NORMAL缓冲区主要存储实例正在处理的数据页,在没有特别指定缓冲区的情况下,默认缓冲区为NORMAL;KEEP缓冲区用来存储很少淘汰或几乎不淘汰的数据页。
RECYCLE缓冲区供临时表空间使用;ROLL缓冲区供回滚表空间使用;FAST缓冲区根据FAST_POOL_PAGES参数指定的大小由系统自动管理,用户不能指定使用RECYCLE、ROLL、FAST缓冲区的表或表空间。
SQL> select para_name,para_value from v$DM_INI where para_name='RECYCLE'
行号 para_name para_value
---------- --------- ----------
1 RECYCLE 300
SQL> select para_name,para_value from v$DM_INI where para_name='BUFFER'
行号 para_name para_value
---------- --------- ----------
1 BUFFER 1000
SQL> select para_name,para_value from v$DM_INI where para_name='KEEP'
行号 para_name para_value
---------- --------- ----------
1 KEEP 64
SQL> select para_name,para_value from v$DM_INI where para_name='FAST_POOL_PAGES'
行号 para_name para_value
---------- --------------- ----------
1 FAST_POOL_PAGES 3000
#BUFFER (1000) 系统缓冲区大小,单位 MB。推荐值:系统缓冲区大小为可用物理内存的 60%~80%。
#BUFFER_POOLS(19) BUFFER 系统分区数,每个 BUFFER 分区的大小为 BUFFER/BUFFER_POOLS。取值范围 1~512
#KEEP (8) KEEP 缓冲区大小,单位 MB。
#RECYCLE 300 RECYCLE 缓冲区大小,单位 MB。
#RECYCLE_POOLS 19 RECYCLE 缓冲区分区数。取值范围 1~512。一般情况下,每个 RECYCLE 分区的大小为 RECYCLE/RECYCLE_POOLS,但系统也会自动校正 RECYCLE 缓冲区分区数,以保证每个分区中数据页不少于 3000 页
在实例处理事务时,有时需要读取大量的数据页,DM实例默认I/O操作每次只读取一个数据页。在这种情况下,为了完成事务,就会执行多次I/O操作,效率较低。因此DM实例允许用户修改每次I/O操作读取的数据页的数量,对应的参数是MULTI_PAGE_GET_NUM,有效值范围为1~128,该参数也是静态参数,修改需要重启实例。可以根据实际情况,在dm.ini文件中进行修改,使一次性I/O能读取多个数据页,从而减少I/O次数,提高数据的处理效率。注意MULTI_PAGE_GET_NUM的值并不是越大越好,如果设置过大,每次读取的页可能大多都不是需要的数据页,这样不仅会增加I/O的读取次数,而且每次都会做一些无用的I/O,降低了效率。同时还要注意,在使用数据库加密或者启用SSD缓冲区(SSD_BUF_SIZE>0)的情况下,不支持多页读取,此时即使在dm.ini中做了修改也无效。
日志缓冲区用于存放REDO日志的内存缓冲区。为了避免直接的磁盘I/O对实例性能造成影响,实例在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。将日志缓冲区与数据缓冲区分开主要基于以下原因。
(1)REDO日志的格式与数据页不同,无法进行统一管理。
(2)REDO日志具备连续写的特点。
(3)在逻辑上,写REDO日志比写数据页的I/O优先级更高。
$ cat dm.ini|grep "RLOG_BUF_SIZE"
RLOG_BUF_SIZE = 1024 #单个日志缓冲区的日志页数量
[dmdba@DCA /dm/data/DMTEST 2023-08-15 22:58:07]
$ cat dm.ini|grep "RLOG_POOL_SIZE"
RLOG_POOL_SIZE = 256 #兆字节的REDO
达梦社区技术https://eco.dameng.com
文章
阅读量
获赞