达梦数据库的参数可以通过PARAMETER参数查看或者在dm.ini文件查看。与此同时,在安装完成之后,我们也可以进行相应的修改,以保证数据库的性能。
一、内存有关参数
达梦的内存结构主要包括内存池、缓冲区、排序区、哈希区。 这些参数的默认值都很小。 生产环境需要根据服务器的配置进行相应的修改。
1.内存池
DM Server的内存池指的是共享内存池,根据内存使用情况的不同,对共享内存池的使用采用了两种工作方式:HEAP和VPOOL。共享内存池用于解决DM Server对于小片内存的申请与释放问题。系统在运行过程中,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中需要申请内存时,在共享内存池内进行申请,当用完该内存后再释放,即归还给共享内存池。当系统采用较好的策略管理共享内存池时,小片内存的申请与释放不会对系统影响太大。这种方式还有一个优点,可以比较容易地检测系统是否存在内存泄漏。DM系统管理员可以通过DM Server的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为MEMORY_POOL,该配置默认为40MB。而HEAP与VPOOL使用的是共享内存池中的内存,所以一般情况下,HEAP与VPOOL两种方式对内存申请的大小不会超过MEMORY_POOL值。
(1)HEAP:HEAP工作方式采用了堆的思想。每次申请内存时,都是从堆顶上申请的,如果不够,则继续向共享内存池中申请内存页,然后加入到HEAP中,继续供系统的申请使用,这样HEAP的长度可以无限增长下去;释放HEAP时,可以释放堆顶上的内存页,也可以释放整个HEAP。使用内存堆来管理小片内存的申请有一个特点,每次申请小片内存以后,不能单独对这片内存进行释放,也就是不用关心这片内存何时释放,它在堆释放时统一释放,能有效防止内存泄露的发生。
(2)VPOOL:VPOOL的工作方式主要采用了“伙伴系统”的思想进行管理。申请的VPOOL内存分为私有和公有两种。私有VPOOL只提供给某个单独功能模块使用,公有VPOOL则提供给那些需要共享同一资源而申请的模块,所以对公有VPOOL需要进行保护,而私有VPOOL则不需要。VPOOL和HEAP的区别在于,VPOOL申请出去的每片内存都可以单独地进行释放。
查看参数文件有关内存池参数:
cd /opt/dm8/data/memadb
cat dm.ini|grep MEMROY
通过查询达梦内存池的参数很多,我们这里只需要关注MEMORY_POOL 和 MEMORY_TARGET。
MEMORY_POOL :共享内存池初始大小,以M为单位。共享内存池是由DM管理的内存。有效值范围:6467108864。
MEMORY_TARGET: 共享内存池在扩充最大值,以M为单位,0表示不限制。
在物理内存较大的情况下,比如大于64G,可以将MEMORY_POOL设置为2048,即2G。 同时也建议设置 MEMORY_TARGET参数,该参数默认为0,不受限制。
2.缓冲区
2.1 数据缓冲区
数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是DM Server至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘IO频繁;将其设定得太大,又会导致操作系统内存本身不够用。系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页;一条是“自由”链,用于存放目前尚未使用的内存数据页;一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改的);还有一条即为“脏”链,用于存放已被修改过的内存数据页。LRU链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从LRU链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少IO。在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将它们一直留在缓冲区中,对系统性能会有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域用于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。
DM Server中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。其中,用户可以在创建表空间或修改表空间时,指定表空间属于NORMAL或KEEP缓冲区。RECYCLE缓冲区供临时表空间使用,FAST缓冲区根据用户指定的FAST_POOL_PAGES和FAST_ROLL_PAGES大小由系统自动进行管理,用户不能指定使用RECYCLE和FAST缓冲区的表或表空间。NORMAL缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为NORMAL;KEEP的特性是对缓冲区中的数据页很少或几乎不怎么淘汰,主要针对用户的应用是否需要经常处在内存当中,如果是,则可以指定缓冲区为KEEP。
DM Server提供了可以更改这些缓冲区大小的参数,用户可以根据自己应用需求情况,指定dm.ini文件中BUFFER(80MB)、KEEP(8MB)、RECYCLE(64MB)、FAST_POOL_PAGES(0)和FAST_ROLL_PAGES(0)值(括号中为默认值),这些值分别对应NORMAL缓冲区大小、KEEP缓冲区大小、RECYCLE缓冲区大小、FAST缓冲区页面数和FAST缓冲区回滚页面数。
②读多页:在需要进行大量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,所以系统管理员需要衡量好自己的应用需求,给出最佳方案。
1)Normal 缓冲区(buffer)
NORMAL 缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下, 默认缓冲区为 NORMAL;
cat dm.ini|grep BUFFER
通过以上查询可以看出,达梦中的缓冲区有两种类型,buffer 和 huge_buffer, 在没有使用列存储表的情况下,可以不用修改huge buffer 参数。
在一般的系统中,我们重点需要修改的是2个buffer 参数, 该参数对性能影响较大:
BUFFER:系统缓冲区大小,以 M 为单位。推荐值:系统缓冲区大小为可用物理内存的 60%~80%。有效值范围(8~1048576)
BUFFER_POOLS : BUFFER 系统分区数,每个 BUFFER 分区的大小为 BUFFER/BUFFER_POOLS。默认值是19,在内存不大的情况下,建议调小该值。
cat dm.ini |grep KEEP
KEEP: KEEP 缓冲区大小,以 M 为单位。默认8M,有效值范围(8~1048576)。
达梦的KEEP 缓冲区只能在表空间级别进行设置
cat dm.ini |grep FAST
cat dm.ini |grep RECYCLE
RECYCLE :RECYCLE 缓冲区大小,以 M 为单位。有效值范围(81048576),建议设置为500M以上。
RECYCLE_POOLS:RECYCLE 缓冲区分区数,每个 RECYCLE 分区的大小为 RECYCLE/RECYCLE_POOLS。
FAST_POOL_PAGES : 快速缓冲区页数。有效值范围(0~99999)。 FAST_POOL_PAGES 的值最多不能超过BUFFER 总页数的一半,如果超过,系统会自动调整为 BUFFER 总页数的一半。
2.2 日志缓冲区
日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘 IO 而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。
那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?其主要基于以下原因。
重做日志的格式同数据页完全不一样,无法进行统一管理;
重做日志具备连续写的特点;
在逻辑上,写重做日志比数据页IO优先级更高。
cat dm.ini |grep RLOG_POOL_SIZE
RLOG_BUF_SIZE ----- 日志缓冲区的大小 单位:page 设置成2的幂。
RLOG_POOL_SIZE ----最大日志缓冲区的大小 单位:M
RLOG_POOL_SIZE:该参数默认值为256M。
2.3 字典缓冲区
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要I/O才能读取到这些信息
cat dm.ini |grep DICT_BUF_SIZE
DICT_BUF_SIZE:该参数默认值为5M,有效值范围(1~2048)。建议改成50M以上。
2.4 SQL缓冲区
介绍sql缓冲区之前,我们首先需要明白一条sql在dm数据库中的执行过程,大致为:
1、语法义分析。
2、语义分析(存放数据的数据字典表,产生物理读)
3、权限判断
4、查找数据块是否内存(在内存,逻辑读,不在内存,把数据块从磁盘读到buffer)
5、找是否有可用的执行计划。有的直接按照执行计划把结果展示出来。如果没有,生成执行计划,再把数据展示出来。
而Sql缓冲区中存放的就是:最近使用的sql,DMSQL代码,执行计划和最近查询的结果集),用来减少硬解析。
SQL缓冲区提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。很多应用当中都存在反复执行相同SQL语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了SQL语句执行效率,但同时给内存增加了压力。
cat dm.ini |grep CACHE_POOL_SIZE
CACHE_POOL_SIZE默认值20M,一般在内存小于16G的情况下,建议设置为200M,内存大于16G,小于64G,建议设置为1024M,当内存大于64G时,建议设置为2048M。
3.排序区
对数据进行排序,如果内存排序无法完成,把部分排序转到磁盘(temp)
排序区提供数据排序所需要的内存缓冲空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都先申请内存,排序结束后再释放内存。
cat dm.ini |grep SORT_
SORT_FLAG:默认为0,参数含义:0:原排序机制;1:新排序机制。 在内存大于64G时建议使用新排序机制,其他情况使用原排序机制。
SORT_BUF_SIZE:默认为2。在内存小于64G时建议设置为10M,大于64G时建议设置为512M。
SORT_BUF_GLOBAL_SIZE,默认为1000M。当内存小于16G时,建议设置为500M,大于16G小于64G时建议设置为2000,当内存大于64G时,建议设置为5120M。
SORT_BLK_SIZE:默认为 1M,新排序机制下,每个排序分片空间的大小,必须小于 SORT_BUF_GLOBAL_SIZE。
4.哈希区
DM 7提供了为哈希连接而设定的缓冲区,不过该缓冲区是虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用DM 7创新外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是VPOOL内存池进行的哈希操作。
cat dm.ini |grep HJ_BUF
cat dm.ini |grep HAGR_BUF
HJ_BUF_SIZE : 单个 HASH 连接操作符的数据总缓存大小,默认值50M。
HJ_BUF_GLOBAL_SIZE :HASH 连接操作符的数据总缓存大小(>=HJ_BUF_SIZE),默认为500 M。
HAGR_BUF_GLOBAL_SIZE: HAGR、DIST、集合操作、SPL2、NTTS2 以及HTAB 操作符的数据总缓存大小(>= HAGR_BUF_SIZE),默认为500 M。
HAGR_BUF_SIZE: 单个 HAGR、DIST、集合操作、SPL2、NTTS2以及 HTAB 操作符的数据总缓存大小,默认值50M。
在服务器物理内存小于16GB的情况下,建议使用默认值。
当物理内存大于16GB,小于64GB时,建议将HJ_BUF_SIZE 和 HAGR_BUF_SIZE 设置为500M。 HAGR_BUF_GLOBAL_SIZE 和 HJ_BUF_GLOBAL_SIZE 设置为10000M以上。
当物理内存大于64GB时,建议将HJ_BUF_SIZE 和 HAGR_BUF_SIZE 设置为1000M。 HAGR_BUF_GLOBAL_SIZE 和 HJ_BUF_GLOBAL_SIZE 设置为15000M以上。
二、线程有关
cat dm.ini |grep WORKER_THREADS
cat dm.ini |grep TASK_THREADS
工作线程(WORKER_THREADS)这里默认值是2,建议改成逻辑CPU数量。
任务线程(TASK_THREADS)这里的默认值是4。 建议设置规则如下:
1)逻辑CPU数量少于8时设置为4.
2)逻辑CPU数量大于等于64时,设置为16.
修改SQL如下:
SP_SET_PARA_VALUE(2,’WORKER_THREADS’,v_cpus);
SP_SET_PARA_VALUE(2,’TASK_THREADS’,4|16);
文章
阅读量
获赞