注册
性能问题排查
技术分享/ 文章详情 /

性能问题排查

夜未央丶 2023/09/09 2060 3 0

前言

博主总结了排查性能问题时用的命令。

操作系统层面排查

查看操作系统资源的消耗情况,可帮助定位找出性能瓶颈

IO

方式1:nmon ---> 按d
image.png
方式2:iostat -d 5
image.png

CPU

方式1: pidstat
image.png

方式2:top
命令:top ---> 按C(注意是大写)
作用: 按CPU 消耗情况排序
image.png

命令:top -Hp <进程号>-n 1 -b
作用:打印对应进程所有线程的CPU消耗情况,可以配合方式3的pstack,可以找出对应线程堆栈。
image.png

命令:ps -eLo pcpu,pid,lwp,%cpu |grep <进程号>;echo 'pcpu,pid,lwp,%cpu'
作用:打印进程启动至今的CPU汇总
image.png

方式3: pstack <进程号>
image.png

方式4: nmon ---> 按c
image.png

内存

方式1:top --->按M(注意是大写)
image.png

方式2: free -h
image.png

网络

方式1: nmon 按 n
image.png

其它

dstat

dstat 可打印cpu、IO、网络情况
image.png

数据库层面排查

以下执行的SQL,尽量用sysdba 查看,否则只会打印对应用户的执行状态

获取当前执行的SQL

1.打印全部SQL

select
        sysdate                    ,
        SF_GET_SESSION_SQL(SESS_ID), --获取完整 SQL
        sess_id                    ,
        sess_seq                   ,
        sql_text                   ,
        state                      ,
        seq_no                     ,
        user_name                  ,
        trx_id                     ,
        create_time                ,
        clnt_ip
from
        v$sessions
where
        state='ACTIVE';

2.打印执行超过2s 的SQL

select  *  from
        (
                SELECT
                        user_name                               ,
                        clnt_ip                                 ,
                        sess_id                                 ,
                        sql_text                                ,
                        datediff(ss, last_send_time, sysdate) ss,
                        SF_GET_SESSION_SQL(SESS_ID) fullsql   
                FROM
                        V$SESSIONS
                WHERE
                        STATE='ACTIVE' and user_name!='SYSDBA'
        )
where ss>=2 order by 5 desc;

锁排查

1.打印锁占用情况

SELECT
        DS.SESS_ID "被阻塞的会话ID",
        DS.SQL_TEXT "被阻塞的SQL",
        DS.TRX_ID "被阻塞的事务ID",
        (CASE L.LTYPE WHEN 'OBJECT' THEN '对象锁' WHEN 'TID' THEN '事务锁' END CASE ) "被阻塞的锁类型",
        DS.CREATE_TIME "开始阻塞时间",
        SS.SESS_ID "占用锁的会话ID",
        SS.SQL_TEXT "占用锁的SQL",
        SS.CLNT_IP "占用锁的IP",
        L.TID "占用锁的事务ID"
FROM
        V$LOCK L
LEFT JOIN V$SESSIONS DS
ON
        DS.TRX_ID = L.TRX_ID
LEFT JOIN V$SESSIONS SS
ON
        SS.TRX_ID = L.TID
WHERE
        L.BLOCKED = 1

2.释放锁
SP_CLOSE_SESSION ( 占用锁的会话 ID );

3.查询死锁记录
select
dh.trx_id ,
sh.sess_id,
wm_concat(top_sql_text)
from
V$DEADLOCK_HISTORY dh,
V$SQL_HISTORY sh
where
dh.trx_id =sh.trx_id
and dh.sess_id=sh.sess_id
group by
dh.trx_id, sh.sess_id;

事务排查

1.查询有事务未提交的表

SELECT b.object_name, c.sess_id, a.*
FROM v$lock a, dba_objects b, v$sessions c
 WHERE a.table_id = b.object_id AND ltype = 'OBJECT' AND a.trx_id = c.trx_id;

2.查询实例中已执行未提交的 SQL

SELECT t1.sql_text, t1.state, t1.trx_id
 FROM v$sessions t1, v$trx t2
 WHERE t1.trx_id = t2.id AND t1.state = 'IDLE' AND t2.status = 'ACTIVE';

SQL资源消耗情况

1.查询执行在 1 秒以上的SQL语句使用的内存

SELECT "SESSID", MAX_MEM_USED||'KB',SQL_TXT FROM V$SQL_STAT order by MAX_MEM_USED DESC;

2. 查询占用 io 较大的 sql

select
        s.sess_id      ,
        s.sql_text     ,
        s.user_name    ,
        s.state        ,
        st.PHY_READ_CNT,
        st.iO_WAIT_TIME
from
        v$sessions s, v$session_stat st
where
        s.sess_id=st.sessid and s.state  ='ACTIVE'
ORDER BY  5 DESC;

3.查找性能相对较差的 sql

select
        SQL_TXT       ,EXEC_TIME     , PARSE_CNT     ,
        PARSE_TIME    ,HARD_PARSE_CNT,HARD_PARSE_TIME
FROM
        v$sql_stat
ORDER BY
        HARD_PARSE_CNT DESC,
        EXEC_TIME DESC;

查询缓存命中率

1.查看缓存命中率

select
      name 缓冲池名称,
      sum(page_size)*sf_get_page_size 缓冲池大小_G,
      sum(rat_hit) /count(*) 命中率
from
      v$bufferpool
group by name;

tips:数据缓冲区设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁

2.查看缓冲池情况

SELECT * FROM V$SCP_CACHE;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服