注册
达梦体系结构理解
培训园地/ 文章详情 /

达梦体系结构理解

千里同风 2023/02/15 5143 2 0

达梦体系结构理解

  1. 达梦体系结构
    一个 DM 服务器,包含一个实例和一个数据库。
    数据库是一堆存放在操作系统上的文件,静态的,DM 数据库存储在服务器的磁盘上。
    在 DM7 之前版本的 DM 数据库中,“数据库”和“实例”这两个术语经常可以互相替换,意义也很相近。
    在 DM7 以及之后版本的数据库中,“数据库”和“实例”这两个概念之间有着很大的差别,甚至可以说 们是两个完全不同的实体。
    如在单独提到 DM 数据库时,可能指的是 DM 数据库产品,也有可能是正在运行的 DM 数据库实例,还可能 是 DM 数据库运行中所需的一系列物理文件的集合等。
    实例是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。DM 实例则存储于服务器的内存 中,简单来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。 DM 服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源 的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数 据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允 许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。
    DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等。
    实例 = 内存 + 后台单进程多线程
    1.DM server :database + instance
    2.database:data file 、control file 、redolog file、tempfile
    3.instance :共享内存 + backgroud process an instance access a database
  2. memory :共享内存与私有内存
    两者关系:
    通过运行 DM 实例,可以操作 DM 数据库中的内容。在任何时候,一个实例只能与一个数据库进行关联(装 载、打开或者挂起数据库)。
    在大多数情况下,一个数据库也只有一个实例对其进行操作。但是在 DM 共享存储集群(DMDSC)中,多 个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。
    1.1 实例信息查看
     v$instance数据字典结构

 v$process 数据字典

 v$thread 数据字典:

 查看版本
SQL> select db_version,svr_version from v$instance;

1.2 进程和线程
 查看进程信息:
SQL> select * from v$process;

[dmdba@dmdbsrv ~]$ ps -ef|grep dmserver
dmdba 1274 1 0 10:20 ? 00:00:03 /dmdbms/bin/dmserver path=/dmdbms/data/dmtest/dm.ini -noconsole
 看进程所对应的线程信息:
SQL> select * from v$threads;

[dmdba@dmdbsrv ~]$ ps -Lf 1274

[dmdba@dmdbsrv ~]$ pstree -p 1274

1.3 内存结构
数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是DBMS系统所必须的。通常内存管理系统会带来以下好处:

  1. 申请、释放内存效率更高;
  2. 能够有效地了解内存的使用情况;
  3. 易于发现内存泄露和内存写越界的问题。
    DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
    1.4 内存池概览
    DM Server的内存池包括共享内存池和其他一些运行时内存池。 动态视图 V$MEM_POOL 详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握 DM Server 的内存使用情况。
    1.5 共享内存池

共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。在 DM Server 的运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中 需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。 DM 系统管理员可以通过 DM Server 的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为 MEMORY_POOL,该配置默认为200M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展, INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池能扩展到的最大大小。
MEMORY_POOL 决定了M为单位的公共内存池的大小,MEMORY_POOL 是静态参数,所以不能直接修改内存中的数值。只能修改 dm.ini 中的数值,然后重启生效。
 V$mem_pool数据字典

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

 通过参数查看:0 表示无限制
SQL> select para_name,para_value from v$dm_ini where para_name=‘MEMORY_TARGET’;

SQL> select para_name,para_value from v$dm_ini where para_name=‘MEMORY_POOL’;

1.6 缓冲区

1.6.1 数据缓冲区
数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是DM Server至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘IO频繁;将其设定得太大,又会导致操作系统内存本身不够用。
达梦数据库中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。
SQL> select distinct name from v$bufferpool;
LINEID NAME


1 KEEP
2 RECYCLE
3 FAST
4 NORMAL
5 ROLL
系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。
LRU链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从LRU链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少IO。
在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将它们一直留在缓冲区中,对系统性能会有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域用于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。

  1. 四种类型的数据缓冲区
    DM Server中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。
    其中,用户可以在创建表空间或修改表空间时,指定表空间属于NORMAL或KEEP缓冲区。RECYCLE缓冲区供临时表空间使用,FAST缓冲区根据用户指定的FAST_POOL_PAGES大小由系统自动进行管理,用户不能指定使用RECYCLE和FAST缓冲区的表或表空间。
    NORMAL缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为NORMAL;
    KEEP的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为KEEP。
    DMServer提供了可以更改这些缓冲区大小的参数,用户可以根据自己应用需求情况,指定dm.ini文件中BUFFER(100MB)、KEEP(8MB)、RECYCLE(64MB)、FAST_POOL_PAGES(3000)值(括号中为默认值),这些值分别对应是NORMAL缓冲区大小、KEEP缓冲区大小、RECYCLE缓冲区大小、FAST缓冲区数据页总数。
  2. 查看数据缓冲区相关参数:
    如果需要修改,可以直接更改DM.INI中的数值(不推荐),或者使用达梦控制台工具进行修改(推荐)。
    以上所列BUFFER相关参数均为静态参数,修改后需要重启服务器才能生效。

当BUFFER_POOLS=1时,系统支持缓冲区的自动扩展。MAX_BUFFER表示最多能扩到多大。在自动扩展后,如果系统的压力在一段时间内比较低,系统又会自动收缩缓冲区。
3) 如何查看数据缓冲区使用情况动态性能视图V$BUFFERPOOL来监控数据缓冲区的使用情况。该视图结构如下:
序号 列 数据类型 说明
1 ID INTEGER 缓冲区ID
2 NAME VARCHAR(20) 缓冲区名称 NORMAL/KEEP/RECYCLE/FAST
3 PAGE_SIZE INTEGER 基缓冲区页大小,不包括扩展池页
4 N_PAGES INTEGER 页数
5 N_FIXED INTEGER 数据页被引用的次数
6 FREE INTEGER 空闲页数目
7 N_DIRTY INTEGER 脏页数目
8 N_CLEAR INTEGER 非空闲页数目
9 N_TOTAL_PAGES INTEGER 页大小,包括扩展池页
10 N_MAX_PAGES INTEGER 最多的页数
11 N_LOGIC_READS INTEGER READ命中的次数
12 N_DISCARD INTEGER 淘汰的页数
13 N_PHY_READS INTEGER READ未命中的次数
14 N_PHY_M_READS INTEGER READ为命中,批量读的次数
15 RAT_HIT FLOAT 命中率
16 N_EXP_BUFFERPOOL INTEGER 扩展缓冲区个数

17 N_UPD_REMOVE INTEGER 从update链表删除页总数
18 N_PHY_WRITE INTEGER 物理写入磁盘总数
19 N_UPD_PUT INTEGER DSC远程读取数据后,加入update链表总数
20 N_UPD_SEARCH INTEGER DSC远程读取数据后,查找update链表插入位置扫描总
21 N_DISCARD64 BIGINT 淘汰的页数
22 N_PHY_READS64 BIGINT READ未命中的次数
23 N_PHY_M_READS64 BIGINT READ为命中,批量读的次数
24 N_UPD_REMOVE64 BIGINT 从update链表删除页总数

25 N_PHY_WRITE64 BIGINT 物理写入磁盘总数
26 N_UPD_PUT64 BIGINT DSC远程读取数据后,加入update链表总数
27 N_UPD_SEARCH64 BIGINT DSC远程读取数据后,查找update链表插入位置扫描总数
查出当前数据库的缓冲区使用情况。
SQL>select name,page_sizen_pages/1024/1024
total_size,page_size
free/1024/1024 free_size from v$bufferpool;
LINEID NAME TOTAL_MB FREE_MB


1 KEEP 8 8
2 RECYCLE 24 24
3 FAST 23 4
4 NORMAL 42 40
5 ROLL 1 1
6 NORMAL 42 40
7 NORMAL 42 40
8 NORMAL 42 40
…
14 NORMAL 42 40
15 NORMAL 42 40
23 NORMAL 42 40
24 RECYCLE 24 24
25 RECYCLE 24 24
26 RECYCLE 24 24
27 RECYCLE 24 24
used time: 6.077(ms). Execute id is 17.
SQL>

  1. 读多页在需要进行大量I/O的应用当中,DM之前版本的策略是每次只读取一页。如果知道用户需要读取表的大量数据,当读取到第一页时,可以猜测用户可能需要读取这页的下一页,在这种情况下,一次性读取多页就可以减少I/O次数,从而提高了数据的查询、修改效率。
    DM Server提供了可以读取多页的参数,用户可以指定这些参数来调整数据库运行效率的最佳状态。在DM配置文件dm.ini中,可以指定参数MULTI_PAGE_GET_NUM大小(默认值为16页),来控制每次读取的页数。如果用户没有设置较适合的参数MULTI_PAGE_GET_NUM值大小,有时可能会给用户带来更差的效果。如果MULTI_PAGE_GET_NUM太大,每次读取的页可能大多都不是以后所用到的数据页,这样不仅会增加I/O的读取,而且每次都会做一些无用的I/O,所以系统管理员需要衡量好自己应用需求,给出最佳方案。
    SQL> select distinct name from v$bufferpool;

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

  1. 重做日志的格式同数据页完全不一样,无法进行统一管理;
  2. 重做日志具备连续写的特点;
  3. 在逻辑上,写重做日志比数据页IO优先级更高。
    DM Server 提供了参数 RLOG_BUF_SIZE 对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内 存池中申请的,单位为页数量,且大小必须为 2 的 N 次方,否则采用系统默认大小 512
    SQL> select para_name,para_value from v$dm_ini where para_name like ‘RLOG_BUF_SIZE’;

1.6.3 字典缓冲区
缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要I/O才能读取到这些信息。
DM8采用的是将部分数据字典信息加载到缓冲区中,并采用LRU算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为
DICT_BUF_SIZE,默认的配置大小为5M。
DM8采用缓冲部分字典对象,那会影响效率吗?数据字典信息访问存在热点现像,并不是所有的字典信息都会被频繁的访问,所以按需加载字典信息并不会影响到实际的运行效率。
但是如果在实际应用中涉及对分区数较多的水平分区表访问,例如上千个分区,那么就需要适当调大DICT_BUF_SIZE参数值。
存放最近使用的数据字典,目的还是减少磁盘IO
SQL> select para_name,para_value from v$dm_ini where para_name like ‘DICT_BUF_SIZE’;

SQL> select para_name,para_value from v$dm_ini where para_name like ‘%DICT%’;

DICT_BUF_SIZE //大小
PLN_DICT_HASH_THRESHOLD //关联登记
注:当cache_pool_size的值大于等于PLN_DICT_HASH_THRESHOLD的值的时候,才开启记录执行计划中关联的数据字典,从而减少物理IO,调优时需注意。
显示字典缓存中的字典对象信息。
SQL> select * from V$DICT_CACHE_ITEM;

显示字典缓存区空间使用情况:
SQL>select * from V$DICT_CACHE;

1.6.4 SQL缓冲区
SQL缓冲区提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。
很多应用当中都存在反复执行相同SQL语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,
这就是计划重用。这样带来的好处是加快了SQL语句执行效率,但同时给内存也增加了压力。
DMServer在配置文件dm.ini提供了参数来支持是否需要计划重用,参数为USE_PLN_POOL,当指定为非0时,
则启动计划重用;为0时禁止计划重用。DM同时还提供了参数CACHE_POOL_SIZE(单位为MB),来改变SQL 缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为20M。
结果集缓存包括SQL查询结果集缓存和DMSQL程序函数结果集缓存,在INI参数文件中同时设置参数RS_CAN_CACHE=1且USE_PLN_POOL非0时DM服务器才会缓存结果集。
SQL> select para_name,para_value from v$dm_ini where para_name=‘USE_PLN_POOL’;

客户端结果集也可以缓存,但需要在配置文件dm_svc.conf中设置参数:
ENABLE_RS_CACHE = (1) //表示启用缓存;
RS_CACHE_SIZE = (100) //表示缓存区的大小为100M, 可配置为1-65535
RS_REFRESH_FREQ = (30) //表示每30秒检查缓存的有效性,如果失效,自动重查; 0表示不检查。
同时在服务器端使用INI参数文件中的CLT_CACHE_TABLES参数设置哪些表的结果集需要缓存。另外, FIRST_ROWS参数表示当查询的结果达到该行数时,就返回结果,不再继续查询,除非用户向服务器发一个 FETCH命令。这个参数也用于客户端缓存的配置,仅当结果集的行数不超过FIRST_ROWS时,该结果集才可能被客户端缓存。
SQL> select sql_id,TOP_SQL_TEXT from v$sql_history;
SQL> select sql_id,sql_text from v$sqltext;
SQL> select para_name,para_value from v$dm_ini where para_name like ‘CACHE_POOL_SIZE’;
1.7 排序区
排序缓冲区提供数据排序所需要的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
如果内存排序无法完成,把部分排序转到磁盘上即temp表空间中。
DM Server提供了参数来指定排序缓冲区的大小,参数SORT_BUF_SIZE在DM配置文件dm.ini中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值2M。
SQL> select para_name,para_value from v$dm_ini where para_name like ‘SORT_BUF_SIZE’;

1.8 哈希区
DM8提供了为哈希连接(hash join)而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用DM8创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是VPOOL内存池来进行哈希操作。
DM Server在dm.ini中提供了参数HJ_BUF_SIZE来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。
SQL> select para_name,para_value from v$dm_ini where para_name like ‘HJ_BUF_SIZE’;
LINEID PARA_NAME PARA_VALUE


1 HJ_BUF_SIZE 50
除了提供HJ_BUF_SIZE参数外,DMServer还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE 表示处理聚集函数时创建哈希表的个数,建议保持默认值100000。
SQL>select para_name,para_value from v$dm_ini where para_name like ‘HAGR_HASH_SIZE’;

1.9 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即可。
SQL> select para_name,para_value from v$dm_ini where para_name like ‘SSD_BUF_SIZE’;

达梦体系结构理解.docx

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服