HelloDBA [English]
搜索Internet 搜索 HelloDBABA
  Oracle技术站。email: fuyuncat@gmail.com  MSN: fuyuncat@hotmail.com   acoug  acoug 

通过Parallel Trace分析并行过程

[English]

作者: fuyuncat

来源: www.HelloDBA.com

日期: 2009-05-10 14:59:44

分享到  新浪微博 腾讯微博 人人网 i贴吧 开心网 豆瓣 淘宝 推特 Facebook GMail Blogger Orkut Google Bookmarks

1、并行化跟踪设置

 

OLAPDSS系统中,或者在OLTP中大批量处理数据时,我们经常会借助于并行化处理来最大化利用硬件资源使作业在更短的时间内返回结果。由于影响并行化的因素比较多,如cpu数量、系统参数设置、分区等等,在并行化过程中,又可能会遇到一些意想不到的问题,例如,语句不能并行化或者并行度(DOP  Degree Of Parallel)和预期的不一致。这时我们就可以通过Parallel Trace对并行过程进行分析,找出问题所在。

9i之前,可以通过设置10384~10399 event对并行会话进行trace,在9i以后,可以通过在会话中设置“_px_trace”来实现:

alter session set "_px_trace"=[[Verbosity,]area],[[Verbosity,]area],..,[time]; 

例如:

alter session set "_px_trace"=high,execution,medium,execution,time; 

其中参数可以设置的值:

Verbosity:

Ø       high

Ø       medium

Ø       low

Area:

Ø       scheduling - ( 与某些1038410390事件相同)

Ø       execution - (与某些10390事件相同)

Ø       granule - (与某些1039010391事件相同)

Ø       messaging - (与某些1039210393事件相同)

Ø       buffer - (10399事件相同)

Ø       compilation

Ø       all - all of the above

Ø       none - none of the above.

Timing

Ø       time 

2、跟踪文件解析

 

下面我们产生一个trace文件,并分别解释Trace文件中各个部分的含义(蓝色字体部分为解释): 

SQL> ALTER SESSION FORCE PARALLEL DML;
 
Session altered.
 
SQL> alter session set "_px_trace"= "all";
 
Session altered.
 
SQL>  UPDATE /*+ PARALLEL(CT,10) */ CS2_CT_MVMT CT
  2  SET CT.LAST_MOD_DT = NVL((SELECT TL.MSG_GMT_DT
  3  FROM CS2_TXN_LOG TL
  4  WHERE CT.MSG_ID = TL.MSG_ID),CT.LAST_MOD_DT)
  5  WHERE CT.MSG_ID > 9000000000000000000;
 
ERROR at line 1:
ORA-01013: user requested cancel of current operation
 
SQL> alter session set "_px_trace"=”none”;
 
Session altered. 

·         文件头,关于Oracle DB Server的基本信息: 

/home/oracle/admin/cs2prd/udump/cs2prd1_ora_27073.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
ORACLE_HOME = /home/oracle/RAC/10.2.0
System name:     Linux
Node name:       pmrac01.cargosmart.com
Release: 2.6.9-55.ELsmp
Version: #1 SMP Fri Apr 20 16:36:54 EDT 2007
Machine: x86_64
Instance name: cs2prd1
Redo thread mounted by this instance: 1
Oracle process number: 153
Unix process pid: 27073, image: oracle@pmrac01.cargosmart.com (TNS V1-V3) 

·         以下为并行度信息: 

*** ACTION NAME:() 2009-03-16 17:31:25.122
*** MODULE NAME:(SQL*Plus) 2009-03-16 17:31:25.122
*** SERVICE NAME:(SYS$USERS) 2009-03-16 17:31:25.122
*** SESSION ID:(1802.17915) 2009-03-16 17:31:25.122
Kkfdapdml --- 函数名称
        pgadep:0 pdml mode:2 PQ allowed DML allowed not autonomous => allowed 
--> 从这段信息看,Parallel DML已经激活了
The table : 65109 ---> 相关对象的object_id
kkfdPaPrm
        DOP = 10 (computed from hint/dictionary) --->并行度(及并行度的来源,这里是从HINT或者数据字典中——即对象属性设置中来)
        use hint DOP on table ---> 最终使用HINT中的DOP设置
kkfdPaForcePrm force DML d = 32767 ---> 当强制使用PDML时,DOP可能的最大值为 32767
The table : 64796 ---> 下一个相关对象的object_id
… …
kxfrDefaultDOP --> 计算默认DOP的函数
        DOP Trace -- compute default DOP
            # CPU       = 8  ---> CPU数量
            Threads/CPU = 2 ("parallel_threads_per_cpu") ---> parallel_threads_per_cpu的设置值
            default DOP = 16 (# CPU * Threads/CPU) --> 单个实例的默认DOP=CPU数量*parallel_threads_per_cpu
            default DOP = 32 (DOP * # instance)  --> RAC的默认DOP=单个实例的默认DOP*RAC实例数
… …
The table : 65109
kkfdPaPrm
        DOP = 10 (computed from hint/dictionary)
        use hint DOP on table
kkfdtip 
        serial - DOP = 1 (from kkfdPaPrm()) or index not part'd  ---> 对象未分区
The table : 65109
… …
kkfdPiAlo
        DOP = 4 (kkfdpideg)
        Part. No. = 0 (kkfdpiPnum)
        No Pruning Info
        Pararllel Operation Type = 6 (kkfdpiOpType)
        Flags = 48 (kkfdpiflg)
        min. tranx free list = 65535 (kkfdpimgi) --> Min Transaction Freelists, 限制了DOP的最大值
… … 

·         以下开始请求和分配并行进程:

 
kxfralo 
        DOP trace -- requested thread from best ref obj = 10 (from kxfrIsBestRef
        ()) ---> 根据最佳对象的DOP来请求线程数.
kxfralo 
        threads requested = 10 (from kxfrComputeThread())  ---> 请求分配线程数
kxfralo 
        adjusted no. threads = 10 (from kxfrAdjustDOP()) ---> 根据相关算法调整后的线程数
kxfralo 
        about to allocate 10 slaves --> 最终准备分配的线程数
kxfrAllocSlaves
        DOP trace -- call kxfpgsg to get 10 slaves ---> 调用函数kxfpgsg来获取slave进程
kxfpgsg 
        num server requested = 10
kxfplist
        Getting instance info for open group
kxfpiinfo
        inst[cpus:mxslv] ---每个实例的CPU数量和parallel_max_servers的设置,我们这里是2个实例的RAC环境
        1[8:160] 2[8:0]  -- 第一个实例中有8CPUparallel_max_servers160,第二个实例中有8CPUparallel_max_servers0
kxfpclinfo
        inst(load:user:pct:fact)aff  --->各个实例的负载信息,Oracle会根据这些负载在并行化时进行负载均衡。 
        1(6:0:100:133) 2(7:0:100:114) 
---> 实例1的负载为6,并行用户数为0,能100%的利用系统资源(即没有资源限制),负载因子为133



---> 实例2的负载为7,并行用户数为0,能100%的利用系统资源(即没有资源限制),负载因子为114
---> 这里最关键的数据为负载因子,它是由前3个数据计算得出,表明该机器还能接受多大量的负载,数字越大,说明能接受的负载越多



kxfpAdaptDOP
        Requested=10 Granted=10 Target=128 Load=13 Default=32 users=0 sets=2
---> 请求10个进程, 并同意了这10个请求 



---> 根据整个RAC的资源状况,128个负载是一个最佳的负载状态. 
如果这个值小于请求数,那么可能会抛出ORA错误或者自动减少进程数(如PARALLEL_AUTOMATIC_TUNING或者PARALLEL_ADAPTIVE_MULTI_USER被设置为true时) 



---> 当前负载为136+7. 
----> 默认DOP32
---> 当前并行用户数为0.
---> 请求的进程集数为2. 
kxfpgsg 
        load adapt num servers requested to = 10 (from kxfpAdaptDOP())
kxfpsori
        Sorted: 1(6:133) 2(7:114) --->根据实例的负载情况排序将有限从排序更前的实例中分配进程
kxfrDefaultDOP
        DOP Trace -- compute default DOP
            # CPU       = 8
            Threads/CPU = 2 ("parallel_threads_per_cpu")
            default DOP = 16 (# CPU * Threads/CPU)
            default DOP = 16 (DOP * # instance) 
kxfpldbl
        compute default DOP = 64 (from kxfrDefaultDOP()) for loadbalancing
kxfpunit
        var=1 limit=64 use_aff=0 aff_num=0 unit=5 ---> 每次以5个为单位发出进程分配请求.
kxfpgsg 
        getting 2 sets of 10 threads, client parallel query execution flg=0x30 ---> coordinator请求分配2个进程集(可参加语句的查询计划)
        Height=0, Affinity List Size=0, inst_total=2, coord=1
        Insts     1  2  ---> 每个进程集准备从各个实例请求分配的进程数
        Threads  10  0  ---> 从实例1请求分配10个,从实例2请求分配0

--- 开始为第一个进程集分配进程

kxfpg1srv
        trying to get slave P000 on instance 1 –--> 试图从实例1中获取P000 slave进程
kxfpg1sg
        Got It. 1 so far. ---> 成功获取到进程,到目前为止已分配了1个进程
……
kxfpg1sg
        Got It. 10 so far. ---> 成功为第一个进程集分配到了10个进程
kxfpg1sg
        got 10 servers (sync), returning...

--- 开始为第二个进程集分配进程

kxfpg1srv
        trying to get slave P000 on instance 1
kxfpg1srv
        trying to get slave P001 on instance 1
kxfpg1srv
        trying to get slave P002 on instance 1
… …
kxfpg1sg