我正在对存在一些常规性能问题的 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,有一个很酷的免费工具