孔老师,DB2 使用实例共享内存监视堆 mon heap存放 DB2实例、数据库、应用连接等各个层次的监视指标供各种监视接口访问。
1、“MON_GET”监视表函数作为轻量级、in-memory metrics访问接口是否可以向 db2pd那样无需任何资源锁直接 attach 到 mon heap共享内存上,访问所需要的监视数据?还是采取了其他机制?
2、mon heap 监视堆是否会像 Oracle ASH buffers 那样由于设置太小,导致 mon heap被写满后不久前的数据被覆盖重写上新的监视数据?
如果存在这种情况,被监控的系统的 mon heap 大小设置多大才合理呢?
1、V$SESSION 是监控内存中 数据库活动 的记录,是 ASH 的数据起源;
2、V$SESSION_WAIT 将当前会话中正在等待的会话状态复制一份到该视图,断开后消失(等待会话生命周期最后1次等待,一个session对应一条记录);
3、V$SESSION_WAIT_HISTORY 是对 V$SESSION_WAIT 的简单增强,记录活动 SESSION 的最近10次等待;
4、V$ACTIVE_SESSION_HISTORY 是 ASH 的核心,ASH 每秒从 v$session_wait 中采样一次(等待会话每秒的快照) ,保存到 ASH buffers 的此视图中,用以记录活动 session 的历史等待信息,期望值是记录一个小时的数据;
5、WRH$ ACTIVE_SESSION_HISTORY 是 V$ACTIVE_SESSION_HISTORY 在 AWR 中的存储位置,V$ACTIVE_SESSION_HISTORY中记录的信息会被定期(每小时一次)的刷新到 AWR负载库中,并缺省保留 7天用于分析。
6、DBA_HIST_ACTIVE_SESS_HISTORY视图是WRH$_ACTIVE_SESSION_HISTORY 视图和其他几个视图的联合展现,通常通过这个视图进行历史数据的访问。
ASH 与 AWR 的关系
ASH 以 v$session 为基础,每秒钟从 v$session_wait 采样一次,记录活动会话等待的事件。ASH采样的等待会话信息被滚动写入 SGA 中的 ASH buffers,在需要时早期的信息是会被覆盖的。ASH记录的信息可以通过v$active_session_history视图来访问,对于每个活动session,每次采样会在这个视图中记录一行信息。
AWR 的采样工作由后台进程 MMON 每60分钟执行一次,ASH信息会被采样写出到 AWR 负载库。当 ASH buffers 写满之后,另外一个后台进程 MMNL 将会主动将 ASH 信息写出。由于数据量巨大,把所有的 ASH 数据写到磁盘上是不可接受的。一般是在写到磁盘的时候过滤这个数据,写出的数据占采样数据的10%,写出时通过direct-path insert完成,尽量减少日志生成,从而最小化数据库性能影响。
你这个问题太专业了,尤其是将oracle的awr和ash等讲的特别细致。我之前一直没有遇到过mon heap不够的情况。因为db2不存历史,所以监视元素量是可以看做固定的,因此不需要多大的空间来存放。我们在监控package cache的时候遇到SQL数量太多导致mon语句返回慢,但是也不会丢失信息。因为这个信息是放在package cache里的。反倒是package cache太小会导致有些SQL累加信息会被挤掉,这个和mon heap也没关系。mon get表函数其实不能算轻量级,db2pd才是真正轻量级工具。
收起