ITPub博客

首页 > 数据库 > 国内数据库 > DM数据库运维性能诊断

DM数据库运维性能诊断

原创 国内数据库 作者:无所谓先生 时间:2022-06-23 18:02:25 0 删除 编辑
日常工作中,客户在使用应用时出现卡顿是经常会碰到的情况,针对性能问题的第一步是定位问题,然后才能针对问题给出解决办法,作为一个达梦数据库的初学者,整理的一套粗浅的调优的过程供大家参考。
一、从何入手
排除客户端的硬件、网络等原因,应用卡顿可以理解为服务器响应时间过长,而响应时间主要由以下过程组成:客户端发起请求->应用服务器接收请求->应用软件处理请求->应用服务器发送请求至数据库服务器->数据库服务器收到请求->数据库服务器处理请求后再将数据流依序返回至客户端。(需要注意若此时数据库若是集群环境(主备、读写分离、DSC等),需要考虑各个节点之间的网络通信效率)。根据之前工作经验现场情况大体分为以下三种:
情况1:应用整体处于卡顿,客户无法给出明确的原因。
针对上述情况,我们首先需要对服务器的CPU、网络、内存以及磁盘空间等信息进行信息收集,来找到出现问题的服务器,再根据关键进程去定位具体问题。
情况2:应用整体某一段时间内出现了卡顿,客户无法给出明确的原因。
针对上述情况,作为数据库运维人员,首先需要确实是否是数据库在卡顿时间段的情况,是否存在大量等待事务导致响应慢,若当时数据库当时处于比较空闲状态,则需要去配合检查当时的 应用服务器或网络等情况。
情况3:客户可以明确的给出在做某个操作时就会出现卡顿。
针对上述情况,作为数据库运维人员,首先需要确定是否存在问题SQL,需要对操作对应的SQL和存储过程进行诊断,若有问题SQL,需要针对性的性能优化,若无则需要配合去对相关的应用程序做分析。
二、定位问题
在不确定出现性能问题的原因,我们需要针对相关服务器进行以下诊断,以确定是应用程序还是数据库方面出现了问题。
        1.cpu诊断
CPU 是计算机系统的大脑,是计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。
  • cpu信息可以从文件中cpuinfo读取。执行命令:# cat  /proc/cpuinfo。

           

             以下是重要指标的说明:

model name    cpu的名称,型号,主频
cpu Mhz       是实际主频
physical id   单个cpu的标号。
cpu cores     逻辑核所处cpu的物理核
  • 执行top命令,然后按1。可以查看所有逻辑核的负载

            

            以下是重要指标的说明: 

us:  用户空间占用 CPU 百分比。
sy:  内核(系统)空间占用 CPU 百分比。 
id:  空闲 CPU 百分比。
wa:   等待输入输出的 CPU 时间百分比。
hi:  硬件 CPU 中断占用百分比。 
st:  虚拟机(虚拟化技术)占用百分比。

        执行ps aux | grep PID,可以根据PID找到对应其他详细信息以及进程名称,DM数据库的进程最后会指向对应实例的dm.ini文件。

  • 执行 vmstat 1 10 命令,可对操作系统的CPU 活动等进行监视.

            

            以下是重要指标的说明:

r:如果在 procs 中运行的序列 (process r) 是连续的大于在系统中的 CPU 的个数,表示 CPU 
比较忙,系统现在运行比较慢,有多数的进程等待 CPU。如果 r 的输出数大于系统中可用 CPU 个数的 4 倍的话,则系统面临着 CPU 
短缺的问题,或者是 CPU 的速率过低,系统中有多数的进程在等待 CPU,造成系统中进程运行过慢。
b:如果在 procs 中运行的序列 (process b),即处于不可中断状态的进程数,连续为 CPU 的 2~3 倍就表明 CPU 
排队比较严重了。
SYSTEM
in:每秒产生的中断次数。
cs:每秒产生的上下文切换次数。
in 和 cs 这两个值越大,会看到由内核消耗的 CPU 时间会越大。
us:用户进程消耗的 CPU 时间百分。us 的值比较高时,说明用户进程消耗的 CPU 时间多,在服务高峰期持续大于 
50~60,是可以接受,但是如果长期超 50% ,那么我们就该考虑优化程序算法。
sy:内核进程消耗的 CPU 时间百分比。sy 的值高时,说明系统内核消耗的 CPU 资源多,这并不是良性表现,我们应该检查原因。
wa:IO 等待消耗的CPU时间百分比。wa 的值高时,说明 IO 
等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id:CPU 处于空闲状态时间百分比,如果空闲时间 (cpu id) 持续为 0 并且系统时间 (cpu sy) 是用户时间的两倍 (cpu 
us) 系统则面临着 CPU 资源的短缺,在服务高峰期持续小于 50,可以接受。
注意点:如果 r 连续大于 CPU 的个数,甚至几倍 CPU 个数;b 也有持续有值,甚至 CPU 的 2~3 倍,并且 id 也持续小于 50%,wa 也比较小,这就表明 CPU 负荷很严重。
        2.内存诊断
  • 执行free,可以查看内存使用情况     

        以下是指标的说明:

Mem:内存的使用信息
Swap:交换空间的使用信息
total:总计物理内存的大小
used:已使用物理内存
free:可用物理内存
shared:多个进程共享的内存总额
buffers/cached:缓存缓冲使用物理内存大小
available:还可以被应用程序使用的物理内存大小
  • 执行top命令,可以监控 Linux 的内存状况
MEM 一行为系统内存信息
total:     物理内存总量
used:      使用中的内存总量
free:      空闲内存总量
buffers:   缓存的内存量
Swap 一行为swap交换分区信息
total:     交换区总量
used:      使用的交换区总量
free:      空闲交换区总量
cached:    缓冲的交换区总量
  • 执行 vmstat 1 10 命令,可对操作系统的内存进行监视。
MEMORY
swap:切换到交换内存上的内存(默认以 KB 为单位)。如果 SWAP 的值不为 0,或者还比较大,比如超过 100 MB 了,但是 SI 和 SO 的值长期为 0,这种情况我们可以不用担心,不会影响系统性能。
free:空闲的物理内存。
buff:作为 buffer cache 的内存,对块设备的读写进行缓冲。
cache:作为 page cache 的内存,文件系统的 cache 如果 cache 的值大的时候,说明 cache 处的文件数多,如果频繁访问到的文件都能被 cache,那么磁盘的读 IO bi 会非常小。
SWAP
si:交换内存使用,由磁盘调入内存。
so:交换内存使用,由内存调入磁盘。
注意点:si和so在内存够用的时候都是 0, 若此时就算free 很少,也不能认定为内存是不够用了,系统性能这时不会受到影响的。

        3.网络诊断
  • 执行ifconfig -a,可以查看网卡信息
使用ethtool + 网卡可以查看支持的速率
  • 执行ping,可以用来测试本机与目标主机是否联通、联通速度如何、稳定性如何。
注意点:除了网络出现问题造成数据库服务器吞吐量太低外,还需要考虑可能是应用端资源消耗太大,无法向数据库服务器发送请求。
        4.磁盘/IO诊断
  • 执行iostat  或者iotop ,对IO情况进行监控。若没有安装iostat程序,需要先执行 apt install sysstat
  • 执行vmstat 命令了解系统状况    

 

            若通过vmstat查看后判断IO 可能出现性能问题。可以进一步通过 iostat 命令分析。

            指标中的await(表示每次io设备等待时间)和 svctm(表示每次 IO 设备服务时间,一般性能越好的磁盘,这个值越小),当svctm 接近 await ,说明 IO 几乎没有等待,每个 IO 设备都得到及时的响应。如果 svctm 远小于 await ,说明 IO 等待队列可能很长,IO 的得到服务的时间将延长(排队+服务时间)

注意:通过 iostat 了解到如果磁盘 I/O 出现性能瓶颈,我们可以借助 pidstat ,定位出导致瓶颈的进程,分析进程的 I/O 行为,结合应用程序的原理,分析这些 I/O 的来源
三、数据库分析
通过上述服务器相关信息的诊断,若性能问题出现在数据库服务器上,且大量资源都消耗在DM数据库的服务上,则需要对数据库进行分析。
  1. 动态性能视图
达梦数据库提供了大量的内置视图供用户去查询,了解当前数据库运行情况。
v$session:显示会话的具体信息,如执行的 sql 语句、主库名、当前会话状态、用户名等等
V$SESSION_HISTORY:显示会话历史的记录信息,如主库名、用户名等,与 V$SESSIONS 的区别在于会话历史记录只记录了会话一部分信息,对于一些动态改变的信息没有记录,如执行的 SQL 语句等。
V$TRX:显示所有活动事务的信息。通过该视图可以查看所有系统中所有的事务以及相关信息,如锁信息等
V$TRXWAIT:显示事务等待信息。
V$LOCK:显示活动的事务锁信息
V$DEADLOCK_HISTORY:记录死锁的历史信息。目前 DMDSC 环境下暂不支持记录死锁历史信息。
V$WAIT_HISTORY:通过该视图可以查询等待事件的具体信息,如等待的线程 id,会话 id 等。可以查看具体等待事件的信息,如果某个事务等待时间过长,则可以查询到具体事务信息以及所在的线程和所牵涉的对象,分析原因进行优化等操作。
V$SYSTEM_EVENT:显示自系统启动以来所有等待事件的详细信息
V$SESSION_EVENT:显示当前会话等待事件的所有信息。
V$SESSION_WAIT_HISTORY:显示会话等待事件的历史信息。
使用以上的视图的结合可以找出大部分会话的问题,如通过下面的SQL查询出阻塞的信息:
with locks as(
  select o.name,l.*,s.sess_id,s.sql_text,s.clnt_ip,s.last_send_time  
  from v$lock l,sysobjects o,v$sessions s
  where l.table_id=o.id and l.trx_id=s.trx_id),
 lock_tr as (   select trx_id wt_trxid,row_idx blk_trxid 
                from locks 
                where blocked=1),
 res as(select sysdate stattime,t1.name,t1.sess_id wt_sessid,s.wt_trxid,
     t2.sess_id blk_sessid,s.blk_trxid,t2.clnt_ip,SF_GET_SESSION_SQL(t1.sess_id) fulsql,
     datediff(ss,t1.last_send_time,sysdate) ss,t1.sql_text wt_sql       
     from lock_tr s,locks t1,locks t2
    where t1.ltype='OBJECT'  and t1.table_id<>0   
        and t2.ltype='OBJECT'  and t2.table_id<>0
       and s.wt_trxid=t1.trx_id  and s.blk_trxid=t2.trx_id)
select distinct wt_sql,clnt_ip,ss,wt_trxid,blk_trxid  from res;
     2.开启跟踪日志
若进行诊断时,数据库服务器已经恢复正常,无法定位到历史的阻塞和性能差的SQL,则可以开启跟踪日志,将之后出现的慢SQL信息记录下来,为后续 SQL 优化工作提供基础。
操作分为以下几个步骤(具体细则可以登录达梦官网查看,这里不多赘述):
配置数据文件目录下的 sqllog.ini(注意生产环境必须要为异步SQL日志,否则会影响性能)


    配置 dm.ini 中

    SVR_LOG = 1 启用 sqllog.ini 配置:SP_SET_PARA_VALUE(1,'SVR_LOG',1);
    配置成功后可在 dmsql 指定目录下生成 dmsql 开头的 log 日志文件;

    如需进行更为系统全面的分析,可使用 Dmlog 工具对 SQL 进行分类汇总;

    3.AWR日志
达梦AWR和ORACLE有所不同,默认是关闭状态,若之前开启了AWR功能,且快照还在有效时间内则可以导出当时时间段的AWR报告,也可以事后开启,为之后可能出现得性能问题做数据准备。
  • 开启AWR报告
达梦数据库中awr报告是通过 DBMS_WORKLOAD_REPOSITORY 包来实现和管理的,调用以下命令来开启系统包
SP_INIT_AWR_SYS(1)
开启包后,需要设置awr报告的间隔时间,默认为60分钟:
CALL DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(30);
  • 生成AWR报告
            开启AWR报告后,默认是要等待AWR报告指定的间隔时间后系统自动创建快照,当然,也可以手动去创建快照,命令如下:
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
            查看快照信息:
SELECT * FROM SYS.WRM$_SNAPSHOT;
            查看/生成html格式的AWR报告:
--查看
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1,2));
--生成
SYS.AWR_REPORT_HTML(1,2,'D:\','AWR1.HTML');
  • 分析AWR报告
达梦AWR报告类似于ORACLE,这里不针对报告内容进行详细解读。
主要去查看报告中的系统负载情况详细、是否存在大量硬解析、主要的等待事件以及占用相关资源的TOP SQL语句,以往经验中90%的性能问题都出现在TOP SQL语句中.
四、SQL优化
在通过一系列的方法和客户沟通后性能问题定位到了具体的SQL之后,我们需要对该SQL进行调整( 注:如果定位到的是存储过程等语句块,达梦数据库提供了DMDBG对其进行调试,找到其中的慢SQL,DMDBG是用法可以登录达梦官网查看)

          1.查看和解读执行计划
  • 若sql可在可接受范围内执行出来,可通过et查看耗时的执行计划。
SP_SET_PARA_VALUE(1, 'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1, 'MONITOR_TIME',1);
                这两个参数一般都是优化后默认开启的。MONITOR_SQL_EXEC 参数可通过会话级开启。
SF_SET_SESSION_PARA_VALUE('MONITOR_SQL_EXEC',1);
        注:有时会发现执行完后et中无内容,因为et需要加载所有结果集才能获取,所以结果集很多时,可在语句中加上top 80 获取较少结果集来查看et。
  • 对于收集的慢sql,传参和不传参执行计划不同,但都执行很快的现象,这时需要从内存种获取执行计划。
select cache_item,sqlstr
 from v$cachepln where sqlstr like 'select authorized_customer%' ;
            DUMP出执行计划
 alter session set events 
 'immediate trace name plndump level 4788852848,dump_file ''/data/EXPLAN_ 4788852848.log''';

            

        这时可依据内存的执行计划进行分析。必要时可清除该语句的执行计划,让其从新生成。

call SP_CLEAR_PLAN_CACHE(cache_item);
  • 常见操作符解读
NSET:结果集收集
PRJT:投影。
用于选择表达式项的计算。广泛用于查询,排序,函数索引创建等。
AAGR:简单聚集
用于没有 GROUP BY 的 COUNT、SUM、AGE、MAX、MIN 等聚集函数的计算。
SAGR:快速聚集
用于没有过滤条件时从表或索引快速获取 MAX、MIN、COUNT 值。
HAGR:HASH 分组聚集
用于分组列没有索引只能走全表扫描的分组聚集
SAGR:流分组聚集
用于分组列是有序的情况下,可以使用流分组聚集,SAGR2 性能优于 HAGR2。
BLKUP:二次扫描 (回表),先使用二级索引索引定位 rowid,再根据表的主键、聚集索引、rowid 等信息获取数据行中其它列。
CSCN:全表扫描
通过聚集索引扫描全表
SSEK:索引扫描
二级索引扫描即先扫描索引,再通过主键、聚集索引、rowid 等信息去扫描表。
CSEK:索引扫描
聚集索引扫描只需要扫描索引,不需要扫描表,即无需 BLKUP 操作,如果 BLKUP 开销较大时,可考虑创建聚集索引。
SSCN:索引扫描
索引全扫描,不需要扫描表
NEST LOOP:嵌套循环连接
HASH JOIN:哈希连接
MERGE JOIN:归并排序连接
  • 分析执行计划
注:若出现应用程序调用程序或SQL时慢,而通过达梦管理工具或DISQL执行时快,则可能是由于实际入参和sql中的空格缩进等导致执行计划不同。
执行计划中我们需要注意资源消耗大的节点,扫描和连接方式是否合理,举例:
针对全表扫描,需要通过对表的数据以及条件的过滤型进行分析,不一定走索引扫描就可以比全表扫描要快。
针对表之间的连接方式,需要清楚不同连接方式的适用场景,再结合当前情况进行分析,可以通过hint或者语句改写的方式测试。

        2.统计信息更新
达梦数据库查询优化器采用基于代价的计算方法。在优化器估算查询代价时,也是以统计信息或者普遍的数据分布为主要依据的,这跟Oracle数据库基于成本的优化器原理是类似的。所以一张表的统计信息不正确会导致执行计划的错误,特别是一张数据频繁插入或删除大量数据的业务表单。
        使用以下系统包对模式更新统计信息
DBMS_STATS.GATHER_SCHEMA_STATS('模式名',100,true, 'FOR ALL COULMNS SIZE AUTO');
DBMS_STATS.GATHER_SCHEMA_STATS('模式名',100,true, 'FOR ALL INDEXED SIZE AUTO');
        使用下面命令查看看该表或索引等有没有收集过统计信息
dbms_stats.TABLE_STATS_SHOW('模式名','表名');
dbms_stats.column_STATS_SHOW('模式名','表名','列名');
dbms_stats.INDEX_STATS_SHOW('模式名','索引名');
         3.索引优化
索引是与表相关的可选的结构(聚簇索引除外),索引的作用是为了加快对表的查询,更快速的定位到数据。索引包含以下类型:
聚集索引:每一个普通表有且只有一个聚集索引;
唯一索引:索引数据根据索引键唯一;
函数索引:包含函数/表达式的预先计算的值;
位图索引:对低基数的列创建位图索引;
位图连接索引:针对两个或者多个表连接的位图索引,主要用于数据仓库中;
全文索引:在表的文本列上而建的索引。
针对不同场景需要进行分析后针对性的创建,一个错误的索引也有可能会降低DML的SQL性能。
  • 当模糊查询时,where条件为A like '%xxx'时是无法使用到A列上的索引。解决办法为建立函数索引,然后改写对应sql条件;若无法改写sql可以通过调整参数LIKE_OPT_FLAG。
            开启参数LIKE_OPT_FLAG>0后可创建函数索引:
CREATE INDEX index_name ON table_name(POSITION('XXX',A));
  • 存在空值的列上创建索引时需要注意,空值数据信息是不被记录在索引里的,所以当涉及到这些数据的查询时,是无法使用索引的,可以尝试利用一些小技巧,将null的信息也存放在索引中,如创建nvl(列名,0) 或者如下图
CREATE INDEX index_name ON table_name(列名,常量);
  • 建索引时不要将过滤性差或分布很不均匀的列建在最前面,当where中以这个单独列为过滤条件时易将其选择到执行计划中,若传参中数据为多数的那个值会导致回表严重。
  • 若函数索引中使用的确定性函数发生了变更或删除,用户需手动重建函数索引
  • 位图索引:创建方式和普通索引一致, 对低基数的列创建位图索引,能够有效提高,基于该列的查询效率,特别注意位图索引会严重影响到插入和更新操作,不能在业务表上建立。位图索引还具有以下约束:

        4.其他方向
除了以上优化方向,还有如HINT、SQL等价改写以及表设计优化(分区、HUGE表...)等等,这里就不一一说明,根据业务要求和现场实际情况选择对应的优化方式,也可以去沟通调整应用程序来帮助优化,最后的目的只要能达到解决性能问题,让客户满意,都是一个成功的优化。
更多信息请登录达梦社区地址:https://eco.dameng.com/


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70018897/viewspace-2900119/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2022-06-12

  • 博文量
    2
  • 访问量
    3143