前言
遇到数据库性能问题,一般从以下几个方面分析
一、操作系统
在操作系统层面主要从以下几个方面入手
1. cpu
可使用top命令查看cpu使用率
这里主要查看DMSERVER 的CPU使用情况
另一方面看USR/SYS的使用率,如果比较高的话也需要注意一下
2.磁盘I/O
使用iostat命令查看磁盘I/O使用情况
我们需要关注util%,如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈,这个时候需要关注一下对应的rkB/s和wkB/s,在200M左右最好,如果太低可能达不到数据盘的要求。
提示:%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
也可以使用dstat工具,更直观,可以收集CPU/IO/NET信息,但它的弊端是不能区分设备
3.内存
使用free命令查看内存使用情况
free -m
关注服务器剩余可用内存(free列),另外还需要关注磁盘缓存(buff/cache 列)
4.nmon
使用nmon工具监控系统一段时间的整体情况
输入c代表cpu,m代表Memory,d代表磁盘io,n代表network,可以全部显示
打印nmon结果集
nmon -s 2 -c 300 -F xxx.nmon
注:每2秒采集一次,总共采集300次
5.perf top
使用perf top命令查看系统热点情况
perf top会生成函数调用热力图,来判断哪些函数占用大量的cpu时间
[root@localhost ~]# perf top -e cpu-clock
分析:如果发现数据库主机的cpu、I/O、内存等使用率很高,往往说明数据库存在性能瓶颈。也可能是硬件本身存在问题,但这种可能性比较小,也容易排除
二、实例
1.数据库架构
确认数据库架构是否最优
2.INI参数优化
配置对应INI优化参数
3.数据库会话监控
可使用下面的sql监控数据库状态
--查询活动会话数
select count(*) from v$sessions where state='ACTIVE';
--已执行超过2秒的活动SQL
select * from (
SELECT sess_id,sql_text,datediff(ss,last_send_time,sysdate) Y_EXETIME,
SF_GET_SESSION_SQL(SESS_ID) fullsql,clnt_ip
FROM V$SESSIONS WHERE STATE='ACTIVE')
where Y_EXETIME>=2;
--锁查询
select o.name,l.* from v$lock l,sysobjects o where l.table_id=o.id and blocked=1
--阻塞查询
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;
三、SQL
1.生成sqllog
开启sql日志功能
--sqllog.ini 配置示例
[SLOG_ALL]
FILE_PATH = ..\log
PART_STOR = 0
SWITCH_MODE = 2
SWITCH_LIMIT = 512
ASYNC_FLUSH = 1
FILE_NUM = 4
ITEMS = 0
SQL_TRACE_MASK = 2:3:22:25:28
MIN_EXEC_TIME = 100
USER_MODE = 0
USERS =
2.sql汇总分析
使用日志转换工具生成sql汇总
3.确定目标sql
对于高并发sql,思路是单个SQL调到最快以及优化应用,减少执行次数
对于一般并发sql,思路是使用索引优化,改写sql
4.sql性能分析工具
ET是DM自带的分析工具,能统计SQL每个操作符的时间花费,从而定位到有性能问题的操作,指导用户去优化
总结
以上就是dm数据库性能优化思路
达梦技术社区:https://eco.dameng.com