Oracle ASH(Active Session History) 说明

以下转自:http://blog.csdn.net/tianlesoftware/article/details/6448765

作者:Dave

分类: Oracle Performance 2011-05-26 23:24 7168人阅读 评论(0) 收藏 举报 session oracle report parallel file database

Oracle 10g中,推出了一些与DB 性能相关的功能,比如AWR, ADDM, STA, 已经这篇讲的ASHActive Session History)。

关于其他的几个功能说明,参考我之前的Blog

Oracle AWR 介绍

http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4682300.aspx

Oracle ADDM 自动诊断监视工具介绍

http://blog.csdn.net/tianlesoftware/archive/2010/05/28/5630942.aspx

如何用 SQL Tuning Advisor (STA) 优化SQL语句

http://blog.csdn.net/tianlesoftware/archive/2010/05/28/5630888.aspx

.官网说明

Performance tuning and problem diagnosis are the two most challenging and important management tasks that any database administrator performs. In line with the primary drive of the server manageability effort, the Autometic Database Diagnostic Monitor (ADDM) attempts to make, performing these two tasks, a lot simpler and easier. ADDM employs an iterative top-down approach and drives a rule-based expert system, to identify bottlenecks in a system and suggest relevant recommendations to tackle them.

ASH acquires the information it requires to sample the active session’s activity from the database kernel’s session state objects. The quantity of information sampled by ASH could be quite voluminous, and therefore, ASH maintains a fixed sized circular buffer in the database System Global Area (SGA). The fixed sized circular buffer will be allocated during database start-up time. Since the information collected by the ASH infrastructure compliments the information present in SWRF snapshots, and can be used for drilldown purposes during problem diagnosis or performance tuning, the ASH data is also periodically flushed to disk.

-- ASH 的数据也会定期的写入磁盘

The flushing and purging policies of ASH, including the way ASH respects SWRF baselines, are completely tied with SWRF policies. Still, flushing the entire content of ASH on to disk could be too populous to be feasible, and therefore, only one out of every ten active session samples will be flushed to disk.

-- 将整个ASH 内容频繁的写入磁盘不容易,所以只有1/10active session 数据写入磁盘

In addition to ADDM using the ASH to achieve its objectives, the ASH contents will also be displayed in the Oracle Enterprise Manager (EM) / Mozart [OEM-SWRF] performance screen. The graph that summarizes the ASH contents in the EM performance screen will be a stacked graph showing the distribution of the elapsed database time onto various wait times and CPU time, during every minute. The ASH infrastructure will provide a single V$ view (V$ACTIVE_SESSION_HISTORY), to view the in-memory contents of ASH.

--可以通过V$ACTIVE_SESSION_HISTORY 视图查看内存中ASH 的信息

The ASH infrastructure will also provide a way to dump the in-memory contents of its circular buffer onto an external file in a human readable format. The ASH dump file can be transported to another system, imported onto a user table, and analyzed using the ADDM in that system.

-- 也可以将内存中的ASM 数据dump 到外部文件,并转移到其他系统进行分析。

ASH Memory Size

==============
Size of ASH Circular Buffer = Max [Min [ #CPUs * 2 MB, 5% of Shared Pool Size, 30MB ], 1MB ]

--最小1M,最大30M

Catagoreising the Active Session

============================
i. Present inside a user call
ii. Not a recursive session
iii. Not waiting for the ‘IDLE’ wait-event
iv. If it is a background process, not waiting for its usual timer-event
v. If it is a parallel slave, not waiting for the PX_IDLE wait event.

So will not see any info if a process is waitting for "SQL*Net message from client".

online offline 分析示例

Let start with ONLINE analysis
========================
I have open two session. first one (SID 16) is running the DML like

SQL> delete test where rowid='AAAKB9AAEAAAAAiAAA';

From second session (SID 15) run the same DML, and it is obvious that second session will wait for first session to commit.

Lets check the info in V$ACTIVE_SESSION_HISTORY.
------------------------------------------------
Run the following script.
SQL> select SESSION_ID,NAME,P1,P2,P3,WAIT_TIME,CURRENT_OBJ#,CURRENT_FILE#,CURRENT_BLOCK# from v$active_session_history ash, v$event_name enm where ash.event#=enm.event# and SESSION_ID=&SID and SAMPLE_TIME>=(sysdate-&minute/(24*60));

Input is

Enter value for sid: 15
Enter value for minute: 1 /* How many minutes activity you want to see */

output is 59 lines as it is wiatting more than 1 minute more than 1 minute

SESSION_ID NAME P1 P2 P3 WAIT_TIME CURRENT_OBJ# CURRENT_FILE# CURRENT_BLOCK#
---------- ------------------------------ ---------- ---------- ---------- ---------- ------------ ------------- --------------
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
continue .............
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34
15 enq: TX - row lock contention 1415053318 589825 143 0 41085 4 34

So you have object details with problem info.

Lets do the OFFLINE analysis of ASH
==============================
So if your are not able to find the problem online, you can dump the ASH to a trace.

Command would be like below: where level means minute. lets dump for 10 minutes history

1. SQL> alter session set events 'immediate trace name ashdump level 10';
or

2. SQL> alter system set events 'immediate trace name ashdump level 10';

or

3. SQL> oradebug setmypid

SQL> oradebug dump ashdump 10;

So you will get the trace file in udump.

Output of trace would be like

<<>>
2594829169,1,161390,"07-18-2003 16:05:21.098717000",13,1,0,"",65535,0,0,2,0,0,0,4294967295,0,0,2,35,100,0,0,10

05855,0,"oracle@usunrat21 (MMNL)","","",""

Oracle has provide an utility under $ORACLE_HOME/rdbms/demo (Location may change), by which you can upload the ASH trace dump to a database table and do the analysis.


Please see the following Note
Note 555303.1 ashdump* scripts and post-load processing of MMNL traces
for the scripts.

Script Details
============

1. "ashdump_loader" -> Main script to run with one argument. Argument is the the name of tracefile. (available in 10g only)
2. "ashdump_table.sql" -> It would be called by the main script to create the table

called SYSTEM.ACTIVE_SESSION_HISTORY_DUMP.

3. "ashdump_sqlldr.ctl" -> It is the third script called by main script to load the trace into

table called SYSTEM.ACTIVE_SESSION_HISTORY_DUMP.

注意:You must use the same oracle version to compare the OFFLINE trace with the other view.

.ASH 说明

ASHV$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成。

ASH buffers 的最小值为1MB,最大值不超过30MB。内存中记录数据。期望值是记录一小时的内容。

ASH报告生成脚本:@?/rdbms/admin/ashrpt.sql

ASH内存记录数据始终是有限的,为了保存历史数据,引入了自动负载信息库(Automatic Workload Repository ,AWR) 由后台进程MMON完成。ASH信息同样被采集写出到AWR负载库中。由于内存不是足够的,所以MMNL进程在ASH写满后会将信息写出到AWR负载库中。ASH全部写出是不可接受的,所以一般只写入收集的10%的数据量,而且使用direct-path insert完成,尽量减少日志的生成,从而最小化数据库性能影响。

内存中的ASH 信息可以通过V$ACTIVE_SESSION_HISTORY查询,而写出到AWR负载库的ASH信息,可以通过AWR的基础表wrh$active_session_hist查询,wrh$active_session_hist是一个分区表,Oracle会自动进行数据清理。

一般来说,我们在监控数据库时,如果是当前正在发生的问题,我们可以通过v$session+v$sqlarea来找出性能最差的SQL语句。如果在一个小时以内发生的我们可以通过生成ASH报告来找出SQL。如果是1小时以上或几天我们可以通过AWR报告来找出几小时,几天以来最影响系统的SQL语句。ADDM报告基于AWR库,默认可以保存30天的ADDM报告。

相关查询试图:

v$session(当前正在发生)

v$session_wait(当前正在发生)

v$session_wait_history(会话最近的10次等待事件)

v$active_session_history(内存中的ASH采集信息,理论为1小时)

wrh$_active_session_history(写入AWR库中的ASH信息,理论为1小时以上)

dba_hist_active_sess_history(根据wrh$_active_session_history生成的视图)

. ASH 报告生成示例

ASH组件以v$active_session_history视图为基础,生成ASH报表,ASH报表与statspack类似,可以提供以下信息:

Top User Events

Top Background Events

Top Event P1/P2/P3 Values

Top Service/Module

Top Client IDs

Top SQL Command Types

Top SQL using literals

Top Blocking Sessions

Top DB Objects

Top DB Files

Top Latches

Activity Over Time

报表间隔时间可以精确到分钟,因而ASH可以提供比STATSPACKAWR更详细的关于历史会话的信息,可以作为statspackawr的补充。ASH报告通过@$ORACLE_HOME/rdbms/admin/ashrpt.sql脚本生成,包括hmtltext两种格式。

SYS@anqing1(rac1)> @?/rdbms/admin/ashrpt.sql;

-- 调用脚本

Current Instance

~~~~~~~~~~~~~~~~

DB IdDB NameInst Num Instance

----------- ------------ -------- ------------

715014091 ANQING1 anqing1

Specify the Report Type

~~~~~~~~~~~~~~~~~~~~~~~

Enter 'html' for an HTML report, or 'text' for plain text

Defaults to 'html'

Enter value for report_type: text

-- 选择生成的ASH 报告类型,是text 还是html

Type Specified:text

Instances in this Workload Repository schema

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DB IdInst Num DB NameInstanceHost

------------ -------- ------------ ------------ ------------

7150140911 ANQINGanqingsingledb

* 7150140911 ANQINGanqing1rac1

7150140912 ANQINGanqing2rac2

Defaults to current database

Using database id: 715014091

Defaults to current instance

Using instance number: 1

ASH Samples in this Workload Repository schema

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Oldest ASH sample available:19-May-11 14:49:59[10585 mins in the past]

Latest ASH sample available:26-May-11 23:14:34[1 mins in the past]

Specify the timeframe to generate the ASH report

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Enter begin time for report:

--Valid input formats:

--To specify absolute begin time:

--[MM/DD[/YY]] HH24:MI[:SS]

--Examples: 02/23/03 14:30:15

--02/23 14:30:15

--14:30:15

--14:30

--To specify relative begin time: (start with '-' sign)

---[HH24:]MI

--Examples: -1:15(SYSDATE - 1 Hr 15 Mins)

---25(SYSDATE - 25 Mins)

Defaults to -15 mins

Enter value for begin_time: 8:00

-- 输入ASH 开始的时间,时间格式上面的示例有说明

Report begin time specified: 8:00

Enter duration in minutes starting from begin time:

Defaults to SYSDATE - begin_time

Press Enter to analyze till current time

Enter value for duration:

-- 输入ASH 结束时间,默认是SYSDATE - begin_time

Report duration specified:

Using 26-May-11 08:00:00 as report begin time

Using 26-May-11 23:15:12 as report end time

Specify Slot Width (using ashrpti.sql) for 'Activity Over Time' section

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-- Explanation:

--In the 'Activity Over Time' section of the ASH report,

--the analysis period is divided into smaller slots

--and top wait events are reported in each of those slots.

-- Default:

--The analysis period will be automatically split upto 10 slots

--complying to a minimum slot width of

--1 minute,if the source is V$ACTIVE_SESSION_HISTORY or

--5 minutes, if the source is DBA_HIST_ACTIVE_SESS_HISTORY.

Specify Slot Width in seconds to use in the 'Activity Over Time' section:

Defaults to a value as explained above:

Slot Width specified:

Specify Report Targets (using ashrpti.sql) to generate the ASH report

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-- Explanation:

--ASH Report can accept "Report Targets",

--like a particular SQL statement, or a particular SESSION,

--to generate the report on. If one or more report targets are

--specified, then the data used to generate the report will only be

--the ASH samples that pertain to ALL the specified report targets.

-- Default:

--If none of the report targets are specified,

--then the target defaults to all activity in the database instance.

Specify SESSION_ID (eg: from V$SESSION.SID) report target:

Defaults to NULL:

SESSION report target specified:

Specify SQL_ID (eg: from V$SQL.SQL_ID) report target:

Defaults to NULL: (% and _ wildcards allowed)

SQL report target specified:

Specify WATI_CLASS name (eg: from V$EVENT_NAME.WAIT_CLASS) report target:

[Enter 'CPU' to investigate CPU usage]

Defaults to NULL: (% and _ wildcards allowed)

WAIT_CLASS report target specified:

Specify SERVICE_HASH (eg: from V$ACTIVE_SERVICES.NAME_HASH) report target:

Defaults to NULL:

SERVICE report target specified:

Specify MODULE name (eg: from V$SESSION.MODULE) report target:

Defaults to NULL: (% and _ wildcards allowed)

MODULE report target specified:

Specify ACTION name (eg: from V$SESSION.ACTION) report target:

Defaults to NULL: (% and _ wildcards allowed)

ACTION report target specified:

Specify CLIENT_ID (eg: from V$SESSION.CLIENT_IDENTIFIER) report target:

Defaults to NULL: (% and _ wildcards allowed)

CLIENT_ID report target specified:

Specify PLSQL_ENTRY name (eg: "SYS.DBMS_LOB.*") report target:

Defaults to NULL: (% and _ wildcards allowed)

PLSQL_ENTRY report target specified:

Specify the Report Name

~~~~~~~~~~~~~~~~~~~~~~~

The default report file name is ashrpt_1_0526_2315.txt. To use this name,

press <return> to continue, otherwise enter an alternative.

Enter value for report_name: /u01/daveash.txt

-- 输入ASH 报告的名称,可以指定生成的目录,默认情况是当前登陆sqlplus的目录。这里的扩展最好加上,如果不加扩展名,扩展名会变成lst. 但不影响数据。

Using the report name /u01/daveash.txt

Summary of All User Input

-------------------------

Format: TEXT

DB Id: 715014091

Inst num: 1

Begin time: 26-May-11 08:00:00

End time: 26-May-11 23:15:12

Slot width: Default

Report targets : 0

Report name: /u01/daveash

ASH Report For ANQING/anqing1

DB NameDB IdInstanceInst Num ReleaseRAC Host

------------ ----------- ------------ -------- ----------- --- ------------

ANQING715014091 anqing11 10.2.0.4.0YES rac1

CPUsSGA SizeBuffer Cache Shared PoolASH Buffer Size

---- ------------------ ------------------ ------------------ ------------------

1272M (100%)144M (52.9%)96M (35.3%)2.0M (0.7%)

Analysis Begin Time:26-May-11 08:00:00

Analysis End Time:26-May-11 23:15:12

Elapsed Time:915.2 (mins)

Sample Count:795

Average Active Sessions:0.01

Avg. Active Session per CPU:0.01

Report Target:None specified

Top User EventsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

Avg Active

EventEvent Class% ActivitySessions

----------------------------------- --------------- ---------- ----------

latch freeOther8.550.00

CPU + Wait for CPUCPU7.170.00

log file syncCommit2.260.00

-------------------------------------------------------------

Top Background EventsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

Avg Active

EventEvent Class% ActivitySessions

----------------------------------- --------------- ---------- ----------

control file sequential readSystem I/O36.73 0.01

control file parallel writeSystem I/O28.300.00

log file parallel writeSystem I/O4.910.00

CPU + Wait for CPUCPU3.400.00

db file parallel write System I/O3.400.00

-------------------------------------------------------------

Top Event P1/P2/P3 ValuesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

Event% EventP1 Value, P2 Value, P3 Value % Activity

------------------------------ ------- ----------------------------- ----------

Parameter 1Parameter 2Parameter 3

-------------------------- -------------------------- --------------------------

control file sequential read36.73"0","11","1"21.01

file#block#blocks

"0","3","1"11.45

"0","4","1"1.64

control file parallel write28.30"2","3","2"28.30

filesblock#requests

latch free8.68"817412680","389","0"8.55

addressnumbertries

log file parallel write4.91"2","2","2"1.13

filesblocksrequests

db file parallel write3.40"1","0","2147483647"3.40

requestsinterrupttimeout

-------------------------------------------------------------

Top Service/ModuleDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

ServiceModule% Activity Action% Action

-------------- ------------------------ ---------- ------------------ ----------

SYS$BACKGROUND UNNAMED80.25 UNNAMED80.25

SYS$USERSUNNAMED9.43 UNNAMED9.43

DBMS_SCHEDULER5.16 MYJOB4.91

1.891.89

racgimon@rac1 (TNS V1-V31.01 UNNAMED1.01

-------------------------------------------------------------

Top Client IDsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

No data exists for this section of the report.

-------------------------------------------------------------

Top SQL Command TypesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

-> 'Distinct SQLIDs' is the count of the distinct number of SQLIDs

with the given SQL Command Type found over all the ASH samples

in the analysis period

DistinctAvg Active

SQL Command TypeSQLIDs % ActivitySessions

---------------------------------------- ---------- ---------- ----------

SELECT71.380.00

-------------------------------------------------------------

Top SQL StatementsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

SQL IDPlanhash % Activity Event% Event

------------- ----------- ---------- ------------------------------ ----------

4gd6b1r53yt88N/A1.38 PX Deq: reap credit0.75

** SQL Text Not Available **

531sc6y5xdd41N/A1.01 SQL*Net break/reset to client0.63

** SQL Text Not Available **

-------------------------------------------------------------

Top SQL using literalsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

No data exists for this section of the report.

-------------------------------------------------------------

Top PL/SQL ProceduresDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

No data exists for this section of the report.

-------------------------------------------------------------

Top SessionsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

-> '# Samples Active' shows the number of ASH samples in which the session

was found waiting for that particular event. The percentage shown

in this column is calculated with respect to wall clock time

and not total database activity.

-> 'XIDs' shows the number of distinct transaction IDs sampled in ASH

when the session was waiting for that particular event

-> For sessions running Parallel Queries, this section will NOT aggregate

the PQ slave activity into the session issuing the PQ. Refer to

the 'Top Sessions running PQs' section for such statistics.

Sid, Serial# % Activity Event% Event

--------------- ---------- ------------------------------ ----------

UserProgram# Samples ActiveXIDs

-------------------- ------------------------------ ------------------ --------

160,1 39.87 control file parallel write28.30

SYSoracle@rac1 (CKPT)225/55K [0%]0

control file sequential read11.45

91/55K [0%]0

167,124.91 control file sequential read22.64

SYSoracle@rac1 (LMON)180/55K [0%]0

CPU + Wait for CPU1.51

12/55K [0%]0

148,235618.55 latch free8.55

SYSoracle@rac1 (J002)68/55K [0%]0

161,14.91 log file parallel write4.91

SYSoracle@rac1 (LGWR)39/55K [0%]0

162,13.40 db file parallel write3.40

SYSoracle@rac1 (DBW0)27/55K [0%]0

-------------------------------------------------------------

Top Blocking SessionsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

-> Blocking session activity percentages are calculated with respect to

waits on enqueues, latches and "buffer busy" only

-> '% Activity' represents the load on the database caused by

a particular blocking session

-> '# Samples Active' shows the number of ASH samples in which the

blocking session was found active.

-> 'XIDs' shows the number of distinct transaction IDs sampled in ASH

when the blocking session was found active.

Blocking Sid % Activity Event Caused% Event

--------------- ---------- ------------------------------ ----------

UserProgram# Samples ActiveXIDs

-------------------- ------------------------------ ------------------ --------

161,12.26 log file sync2.26

SYSoracle@rac1 (LGWR)130/55K [0%]0

-------------------------------------------------------------

Top Sessions running PQsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

No data exists for this section of the report.

-------------------------------------------------------------

Top DB ObjectsDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

No data exists for this section of the report.

-------------------------------------------------------------

Top DB FilesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

No data exists for this section of the report.

-------------------------------------------------------------

Top LatchesDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

Max Sample

Latch% LatchBlocking Sid % ActivityWait secs

------------------------------ ---------- --------------- ---------- ----------

# Waits# Sampled Wts# Sampled Wts# Sampled Wts# Sampled Wts

Sampled< 10ms10ms - 100ms100ms - 1s> 1s

-------------- -------------- -------------- -------------- --------------

latch: JS slv state obj latch8.55Held Shared8.550.000000

00000

-------------------------------------------------------------

Activity Over TimeDB/Inst: ANQING/anqing1(May 26 08:00 to 23:15)

-> Analysis period is divided into smaller time slots

-> Top 3 events are reported in each of those slots

-> 'Slot Count' shows the number of ASH samples in that slot

-> 'Event Count' shows the number of ASH samples waiting for

that event in that slot

-> '% Event' is 'Event Count' over all ASH samples in the analysis period

SlotEvent

Slot Time (Duration)Count EventCount % Event

-------------------- -------- ------------------------------ -------- -------

08:00:00(84.0 min)67 control file sequential read273.40

control file parallel write202.52

CPU + Wait for CPU81.01

09:24:00(92.0 min)71 control file sequential read232.89

control file parallel write222.77

CPU + Wait for CPU101.26

10:56:00(92.0 min)64 control file sequential read283.52

control file parallel write222.77

CPU + Wait for CPU40.50

12:28:00(92.0 min)66 control file sequential read293.65

control file parallel write212.64

CPU + Wait for CPU111.38

14:00:00(92.0 min)56 control file sequential read303.77

control file parallel write222.77

SQL*Net break/reset to client10.13

15:32:00(92.0 min)77 control file sequential read293.65

control file parallel write222.77

CPU + Wait for CPU151.89

17:04:00(92.0 min)76 control file sequential read354.40

control file parallel write253.14

CPU + Wait for CPU40.50

18:36:00(92.0 min)159 latch free688.55

control file sequential read334.15

control file parallel write222.77

20:08:00(92.0 min)80 control file sequential read334.15

control file parallel write243.02

CPU + Wait for CPU50.63

21:40:00(92.0 min)73 control file sequential read253.14

control file parallel write243.02

CPU + Wait for CPU101.26

23:12:00(3.2 min)6 CPU + Wait for CPU40.50

control file parallel write10.13

log file parallel write10.13

-------------------------------------------------------------

End of Report

Report written to /u01/daveash.txt

SYS@anqing1(rac1)>

这个就是用ashrpt.sql脚本来生成报告,当然也可以使用Toad 来生成,这个也是比较方便的一个工具。


你可能感兴趣的:(oracle,ash)