檢視並行程式的一些簡單資訊

dbhelper發表於2014-11-26
在使用並行的時候,總能看到程式中出現一些ora_p這樣的程式。有時候檢視問題的時候只看到並行程式在執行,卻沒有思路去查詢倒底是哪些session在幹些什麼,下面簡單分析一下。怎麼去對映系統級的程式和資料庫級的並行程式。
從系統程式中可以看到一些並行session在執行。
SQL> !ps -ef|grep ora_p|grep TESTDB
testdbuser 17422     1  0 Aug29 ?        00:04:56 ora_pmon_TESTDB
testdbuser 17425     1  0 Aug29 ?        00:01:12 ora_psp0_TESTDB
testdbuser 20847 26200  0 20:54 pts/1    00:00:00 /bin/bash -c ps -ef|grep ora_p|grep TESTDB
testdbuser 32541     1  2 10:09 ?        00:18:23 ora_p000_TESTDB
testdbuser 32543     1  2 10:09 ?        00:17:41 ora_p001_TESTDB
testdbuser 32545     1  2 10:09 ?        00:18:51 ora_p002_TESTDB
testdbuser 32547     1  2 10:09 ?        00:15:55 ora_p003_TESTDB
testdbuser 32549     1  3 10:09 ?        00:19:22 ora_p004_TESTDB
testdbuser 32551     1  3 10:09 ?        00:24:52 ora_p005_TESTDB
testdbuser 32553     1  3 10:09 ?        00:21:43 ora_p006_TESTDB
testdbuser 32561     1  3 10:09 ?        00:24:52 ora_p007_TESTDB
testdbuser 32563     1  1 10:09 ?        00:08:30 ora_p008_TESTDB
testdbuser 32565     1  1 10:09 ?        00:07:20 ora_p009_TESTDB

如果檢視v$session,會發現program中有一些session是和並行相關的session。
SQL> select sid,username,program from v$session where sid in (select sid from v$px_session ) and username='TESTDB';
       SID USERNAME                       PROGRAM
---------- ------------------------------ ------------------------------------------------
      2738 testdb                        oracle@dbserver (P000)
       666 testdb                        oracle@dbserver (P001)
      1371 testdb                        oracle@dbserver (P002)
      1590 testdb                        oracle@dbserver (P003)
      2183 testdb                        oracle@dbserver (P004)
      2671 testdb                        oracle@dbserver (P005)
      3125 testdb                        oracle@dbserver (P006)
      4084 testdb                        oracle@dbserver (P007)
      3053 testdb                        sqlplus@dbserver (TNS V1-V3)
9 rows selected.
在並行中3053 是相當於這個並行處理的代言人,協調者,其他的session都是在後臺默默的工作著。各個並行程式對處理完的資料進行最後的合併都是由3053這個程式來最後完成,展現給使用者。
有時候定義了並行度,想對並行的情況進行一個簡單的監控,至少可以知道目前系統是否還有足夠的資源。並行資源的使用情況等。
可以參考v$px_session, v$px_process,v$session,v$process,v$px_sesstat,v$pq_sesstat來完成。
簡單舉個例子來分析一下。
如果目前我執行一個指令碼,設定的並行度為8,檢視一下執行的並行度情況
select pxsess.sid,sess.username,pxsess.serial#,pxsess.qcsid,pxsess.qcserial#,pxsess.degree,pxsess.server#,pxsess.req_degree from v$px_session pxsess,v$session sess where pxsess.sid=sess.sid and sess.username='TESTDB';

這個例子顯示了並行相關的session,列acsid就是對應的協調session,可以看到顯示的都是6620.,可以透過欄位degree,req_degree看到申請了8個程式,然後也得到了8個程式。server_set中可以看到
       SID USERNAME                          SERIAL#      QCSID  QCSERIAL#     DEGREE SERVER_SET REQ_DEGREE
---------- ------------------------------ ---------- ---------- ---------- ---------- ---------- ----------
      4539 testdb                              7255       6620      49463          8          1          8
      4921 testdb                              2967       6620      49463          8          2          8
      5295 testdb                             31077       6620      49463          8          3          8
      5487 testdb                             29109       6620      49463          8          4         8
      5671 testdb                             48021       6620      49463          8          5          8
      5863 testdb                             10191       6620      49463          8          6          8
      6051 testdb                              9337       6620      49463          8          7          8
      6238 testdb                              2979       6620      49463          8          8          8
      6620 testdb                             49463       6620
得到了基本的資訊來看看對應的程式資訊。
SQL> !ps -ef|grep ora_p|grep TESTDB
testdb 17422     1  0 Aug29 ?        00:04:56 ora_pmon_TESTDB
testdb 17425     1  0 Aug29 ?        00:01:12 ora_psp0_TESTDB
testdb 20847 26200  0 20:54 pts/1    00:00:00 /bin/bash -c ps -ef|grep ora_p|grep TESTDB
testdb 32541     1  2 10:09 ?        00:18:23 ora_p000_TESTDB
testdb 32543     1  2 10:09 ?        00:17:41 ora_p001_TESTDB
testdb 32545     1  2 10:09 ?        00:18:51 ora_p002_TESTDB
testdb 32547     1  2 10:09 ?        00:15:55 ora_p003_TESTDB
testdb 32549     1  3 10:09 ?        00:19:22 ora_p004_TESTDB
testdb 32551     1  3 10:09 ?        00:24:52 ora_p005_TESTDB
testdb 32553     1  3 10:09 ?        00:21:43 ora_p006_TESTDB
testdb 32561     1  3 10:09 ?        00:24:52 ora_p007_TESTDB
testdb 32563     1  1 10:09 ?        00:08:30 ora_p008_TESTDB
testdb 32565     1  1 10:09 ?        00:07:20 ora_p009_TESTDB
我們現在來做一個對映,看看在資料庫中的程式和系統程式的對映關係,可以看到分配的程式還是比較富裕的,有2個程式還是available的狀態,剩下的都在使用,都是in use.
SQL> select *from v$px_process;
SERV STATUS           PID SPID                            SID    SERIAL#
---- --------- ---------- ------------------------ ---------- ----------
P000 IN USE           224 32541                          4539       7523
P001 IN USE           226 32543                          4921       3235
P002 IN USE           228 32545                          5295      31345
P003 IN USE           229 32547                          5487      29377
P004 IN USE           230 32549                          5671      48289
P005 IN USE           231 32551                          5863      10459
P006 IN USE           232 32553                          6051       9605
P007 IN USE           233 32561                          6240      32193
P009 AVAILABLE        238 32565
P008 AVAILABLE        237 32563
10 rows selected.

比如說程式32541這個程式
testdb 32541     1  2 10:09 ?        00:18:23 ora_p000_TESTDB
在資料庫中的資訊如下,可見對映是完整的。
SERV STATUS           PID SPID                            SID    SERIAL#
---- --------- ---------- ------------------------ ---------- ----------
P000 IN USE           224 32541                          4539       7523

然後如果想知道更多協調程式的資訊,可以使用v$session,v$process來關聯。我們看到協調程式的sid是6620
select paddr, sid,serial#,username,osuser ,machine,process,terminal,type,to_char(LOGON_TIME,'yyyy-mm-dd hh24:mi:ss')login_time from v$session
where sid=6620


PADDR                   SID    SERIAL# USERNAME                       OSUSER                         MACHINE    PROCESS                  TERMINAL                       TYPE       LOGIN_TIME
---------------- ---------- ---------- ------------------------------ ------------------------------ ---------- ------------------------ ------------------------------ ---------- -------------------
00000002597CEB88       6620      49463 TESTDB                         testdb                         testdb      21568                    pts/3                          USER       2014-10-06 20:52:55

有了這些資訊,來和v$proess關聯就能夠看到對應的程式了。可以看到系統程式是21569.
ADDR             SPID                            PID
---------------- ------------------------ ----------
00000002597CEB88 21569                           115

SQL> !ps -ef|grep 21569
testdbuser 21569 21568 16 20:52 ?        00:06:33 oracleTESTDB (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
testdbuser 26835 26200  0 21:32 pts/1    00:00:00 /bin/bash -c ps -ef|grep 21569
testdbuser 26837 26835  0 21:32 pts/1    00:00:00 grep 21569

所以這些檢視還是很實用的,至少在看到很多的並行程式的時候,能夠有思路去查詢倒底是哪兒在執行這些,可能有問題的部分。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347003/,如需轉載,請註明出處,否則將追究法律責任。

相關文章