刚刚下岗的Oracle DBA学了这个国产数据库技能后,下午就上岗了

前言

alt

我们都知道,当Oracle数据库出现性能故障后,需要分析故障原因时候,一般在线上实时诊断数据库性能问题,特别是资源突然打高场景,这个时候用到ASH的数据,就能很大程度上准确定位问题所在。

Oracle ash

alt

在Oracle数据库中,实时捕获相关性能数据是通过ASH工具来实现的。

ash是v$session 为基础,1s采样一次,记录活跃会话等待的事件。采样工作由后台进程MMNL来完成。

dba_hist_active_sess_history是视图v$active_session_history的历史数据,dba_hist_active_sess_history视图默认每十秒收集一次信息储存在磁盘中。

MMON负责执行与AWR相关的任务。包括收集数据库统计信息,收集AWR快照,启动各种自动维护作业JOB,生成超过阀值告警信息。 MMNL负责执行与ASH相关的任务。

MogDB ASH

ASP (ACTIVE SESSION PROFILE) 是Mogdb 中提供的对活跃会话样本收集的功能。类似ORACLE中ASH。ASP可以让用户查询活跃会话样本的基本信息。对于数据库运行期间的实时 监控以及性能问题诊断有重要作用。

MogDB继承了社区开源版本openGauss的ASH能力(下面称ASP)在此基础上进行企业版增强,称为"SQL运行状态观测",主要是通过在采样数据中增加SQL执行算子的采样来完成的。

alt

从采样中统计出活跃Session的统计指标,这些统计指标从客户端信息、执行开始、结束时间,SQL文本,等待事件,当前数据库对象等维度,反映活跃Session的基本信息,状态,持有的资源。 基于概率统计的活跃Session信息,可以帮助用户诊断系统中哪些Session消耗了更多的CPU、内存资源,哪些数据库对象是热对象,哪些SQL消耗了更多的关键事件资源等,从而定位出有问题Session,SQL,数据库设计。

Session采样数据分为两级,如图1所示:

  • 第一级为实时信息,存储在内存中,展示最近几分钟的活跃Session信息,具有最高的精度,视图DEB_PERF.local_active_session,显示内存 记录的实时活跃会话信息;
  • 第二级为持久化历史信息,存储在磁盘文件中,展示过去很长一段时间的历史活跃Session信息,从内存数据中抽样而来,适合长时间跨度的统计分析,系统表GS_ASP(或ASP log文件),存放持久化的信息。
alt

如图2所示 各session工作线程将各自的状态信息存储在共享内存t_thrd.shemem_ptr_cxt的 BackendStatusArray数组中。后台采样线程ASH_WORKER每隔一个采样周期将t_thrd.shemem_ ptr_cxt.BackendStatusArray内容采集写入到g_instance.stat_cxt.active_sess_hist_arrary中。当采样填满了active_sess_hist_arrary时,ASH_WORKER会将内存中的采样数据按比例刷新到GS_ASP表或 者log文件中以供历史查询。而内存active_sess_hist_arrary中的实时信息可以通过视图DEB_PERF.local_active_session查询。

MogDB企业版增强

MogDB企业版增强的ASH能力,称为"SQL运行状态观测",主要是通过在采样数据中增加SQL执行算子的采样来完成的。 MogDB在上述视图中增加了plan_node_id字段来记录每次采样时,SQL正在执行的算子情况,将该算子与其它性能视图中记录的SQL执行计划来关联,即可知道对于出现性能问题的SQL具体是慢在了执行计划的哪个步骤上。

以下参数,会对企业版ASH功能产生影响:

  • resource_track_level 参数指定为operator,则会开启算子采样能力,默认值是query,只会记录SQL级别采样。

ASP数据收集流程

alt MogDB启动后会检查enable_asp是否开启,如果开启,就会启动一个后台采样线程ASH_WORKER。该采样线程每隔一个采样周期将t_thrd.shemem_ptr_cxt.BackendStatusArray内容采集写入到g_instance.stat_cxt.active_sess_hist_arrary中。采样周期由GUC参数asp_sample_interval控制,默认采样周期为1秒。当采样填满了active_sess_hist_arrary(由guc参数asp_sample_num控制,默认为100000个采样)时,会将内存中的采样数据刷新到GS_ASP表或者ASP log文件中以供历史查询。

MogDB ASP参数

有以下几个主要参数,会对ASH功能产生影响:

  • enable_asp 设置为on或者off,表示是否开启ASH功能,默认为开启; asp_sample_interval 指定每次采样的间隔,默认为1s采样一次,如果想减轻采样压力,可以将该参数设置为更长间隔,最长允许设置为10s;
  • asp_sample_num 指定在内存表LOCAL_ACTIVE_SESSION中保留的样本总数,超过该数,将会触发将内存中的样本刷盘记录到GS_ASP系统表中的行为,默认为10万条。当发生刷盘行为后,LOCAL_ACTIVE_SESSION中的所有记录会被清空,重新开始采样;
  • asp_flush_rate 指定哪些内存中的样本数据会被刷盘记录到GS_ASP表中,判断时会计算LOCAL_ACTIVE_SESSION中记录的sampleid字段值,其中 sampleid%asp_flush_rate == 0的记录会被标志为need_flush_sample=true,这些记录都会被持久化保存(在内核函数Asp::SubAspWorker中定义)。可以简单地理解为,该参数默认值为10,也就是1/10的样本会被持久化保存;
  • asp_retention_days 指定在GS_ASP中保留的数据的时限,默认为2天,最多7天。

ASP常用SQL

查看session之间的阻塞关系

select sessionid, block_sessionid from pg_thread_wait_status;

采样blocking session信息

select sessionid, block_sessionid from DBE_PERF.local_active_session;

Final blocking session展示

select sessionid, block_sessionid, final_block_sessionid from DBE_PERF.local_active_session;

最耗资源的wait event

SELECT s.type, s.event, t.count
FROM dbe_perf.wait_events s, (
SELECT event, COUNT (*)
FROM dbe_perf.local_active_session
WHERE sample_time > now() - 5 / (24 * 60)
GROUP BY event)t WHERE s.event = t.event ORDER BY count DESC;

查看最近五分钟较耗资源的session把资源都花费在哪些event上

SELECT sessionid, start_time, event, count
   FROM (
SELECT sessionid, start_time, event, COUNT(*)
   FROM dbe_perf.local_active_session
WHERE sample_time > now() - 5 / (24 * 60)
   GROUP BY sessionid, start_time, event) as t ORDER BY SUM(t.count) OVER (PARTITION BY t. sessionid, start_time)DESC, t.event;

最近五分钟比较占资源的SQL把资源都消耗在哪些event上

SELECT query_id, event, count
   FROM (
SELECT query_id, event, COUNT(*)
   FROM dbe_perf.local_active_session
WHERE sample_time > now() - 5 / (24 * 60)
   GROUP BY query_id, event) t ORDER BY SUM (t.count) OVER (PARTITION BY t.query_id ) DESC, t.event DESC;

正在执行的SQL的包括历史采样的所有信

select
 las.sample_time,
 las.application_name,
 las.unique_query_id,
 las.event,
 scr.query ,
 scr.query_plan
from
 dbe_perf.local_active_session las,
 dbe_perf.statement_complex_runtime scr
where
 las.thread_id = scr.pid
 and scr.pid <> pg_backend_pid();

本文由 mdnice 多平台发布

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值