Oracle DB 上的 V_$SYSTEM_EVENT 等待时间极长

Oracle DB 上的 V_$SYSTEM_EVENT 等待时间极长

我正在对存在一些常规性能问题的 Oracle DB 进行故障排除。我运行了以下查询:

SELECT event AS "Event|Name",
       total_waits "Total|Waits",
       round(time_waited / 100, 0) "Seconds|Waiting",
       total_timeouts "Total|Timeouts",
       average_wait / 100 "Average|Wait|(in secs)"
  FROM sys.v_$system_event e
  ORDER BY time_waited DESC;

前几行返回结果如下。等待时间长达数百万秒!(相比之下,我们的其他数据库对于热门事件的等待时间不到 10 秒。)这些事件有什么作用,什么可能导致这些巨大的等待时间?数据库已运行 30 天,因此我们看到了这么长时间的聚合。

Event Name                                 Waits    Seconds Timeouts  Avg Wait
----------------------                 ---------   -------- --------  --------
SQL*Net message from client            488397968   32050594        0    0.0656
rdbms ipc message                       91335556    2455744  9529486    0.0269
DIAG idle wait                           5214769     347077  5214769    0.0666
Streams AQ: qmn coordinator idle wait     186521     173696    93278    0.9312
Streams AQ: qmn slave idle wait            95359     173692       51    1.8215
Space Manager: slave idle wait            523165     173647   521016    0.3319
pmon timer                                968303     173630   870108    0.1793
fbar timer                                  8770     173403     8713   19.7723
smon timer                                 14103     173278     7006   12.2866
log file sync                           57967889      90402   649458    0.0016
og file parallel write                  86618366      39509        0    0.0005
db file sequential read                244286101      11171        0         0
control file parallel write              1274395       3949        0    0.0031
db file scattered read                 157316868       1635        0         0
db file parallel read                   11948170       1190        0    0.0001

答案1

“SQL来自客户端的净消息”是数据库等待客户端要求执行某项操作所花费的时间(我也会将其解释为 SQL数据库处理的网络请求)。询问汤姆有更多有关该事件的信息。平均等待时间看起来也不是很长,所以也许你的应用正在向服务器发出大量小请求?30 天内的等待时间非常长(平均每天 16M)。

对于 rdbms ipc 消息,这意味着(Oracle 10g 参考)

“后台进程(LGWR、DBWR、LMS0)使用此事件来表明它们处于空闲状态,并正在等待前台进程向它们发送 IPC 消息来执行某些工作。”

从调整角度来看,这通常不是什么事件。(伯勒森)

答案2

仅从 v$system_event 中进行选择用处有限。该视图包含自数据库上次启动以来的总等待时间和所有等待事件的计数。数据库上次启动时间可能是一年前或几分钟前,但无论哪种情况,我通常只对我的 sql 语句、批处理作业或最终用户现在的情况感兴趣。最终用户等待非空闲非后台等待,但 v$system_event 包含所有事件,包括 50 多个空闲事件和许多负责数据库的后台、非用户进程的等待。不要运行此查询,而是尝试运行 AWR 报告或 statspack 报告或查看企业管理器中的性能或顶级活动屏幕。查看数据库现在正在发生的事情的快速方法是运行以下选择语句:

select  nvl(s.username,s.program) username
,   s.sid sid
,   s.serial# serial
,   s.sql_hash_value sql_hash_value
,   substr(decode(w.wait_time, 0, w.event, 'ON CPU'),1,15) event
,   w.p1 p1
,   w.p2 p2
,   w.p3 p3
from    v$session s
,   v$session_wait w
where   w.sid=s.sid
and s.status='ACTIVE'
and s.type='USER';

它将告诉您谁在等待,谁在使用或请求 CPU。通过反复运行查询,您可以了解系统上存在哪些瓶颈。Oracle 10g 及更高版本的视图 v$active_session_history 包含每秒采样一次的信息。它比 v$system_event 更强大,但数据可能很难挖掘。要挖掘数据,您可以使用企业管理器的顶级活动屏幕,但如果您没有 OEM,有一个很酷的免费工具

http://timurakhmadeev.wordpress.com/2010/02/18/ash-viewer/

相关内容