EBS 的 concurrent manager 進程,ebsconcurrent

來源:互聯網
上載者:User

EBS 的 concurrent manager 進程,ebsconcurrent

首先我們用sqlplus 連上資料庫, 查看一下這個串連的 session

select * from v$session where username='APPS' and program like 'sqlplus%';

查看當前 APPS 使用者用 sqlplus 串連資料庫的session 資訊; 可以看到 SID = 38, SERIAL# = 28631, 

然後查出這個session 的進程:

select p.* from v$process p,v$session s where p.addr = s.paddr and s.sid = 38;
看到 PID = 28, SPID = 5010. SERIAL# = 233.

這時我們設定 10046 trace 事件

alter session set tracefile_identifier='123456';  alter session set events '10046 trace name context forever, level 12';  

重新查 v$process 表, 發現 TRACEID = 123456, 並且 TRACEFILE = "DIR.../VID_ora_5010_123456.trc", 這就設定了SQL trace, 這一次串連的所有資料庫操作都會被記錄到這個檔案中, 檔案名稱以進程 id 和一個標識符組成, 如果標識符為空白, 就只有進程號.

現在我們來看 Form 的資料庫連接進程號, 開啟 Form 之後點 help -> about Oracle Applications, 裡面可以查到 Database Server PID : 5762 (串連方式 frmweb@erik-lnx.oracle.com (TNS V1-V3), 這可以關聯v$process 和 v$session 表查到), 於是在 Form 介面上所有資料庫操作都會被記錄到進程號 5762 的 trace 檔案當中.

現在問題來了, Form 上提交的 concurrent request 進行的資料庫操作會被記錄到哪裡的 trace 檔案中呢?

在 Form 服務和 concurrent manager 服務都開啟的情況下, 查看後台進程 ps -aef, 可以看到 oracle 使用者下面有一些進程, 大概可以分下類:

1. oracleVID (LOCAL=NO) 這類表示資料庫連接, 例如上面的 sqlplus 和 Form 串連, 都是這種, 他們的 PPID = 1, 說明都是由主進程啟動的;

2. ora_w000_VID 這種屬於資料庫自己的進程, 可以不管

3. 我們要關注的是這些

oracle    7451     1  0 Jan25 pts/1    00:00:00 shoracle    7456  7451  0 Jan25 pts/1    00:00:25 FNDLIBR                                                                                                                      oracle    7686     1  0 Jan25 ?        00:00:03 FNDSMoracle    7744  7686  0 Jan25 ?        00:00:00 RCVOLTM14 oracle    7749  7686  0 Jan25 ?        00:00:00 FFTM oracle    7750  7686  0 Jan25 ?        00:00:01 INCTM oracle    7751  7686  0 Jan25 ?        00:00:00 CYQLIB 

這裡有好幾個進程的 PPID = 7686, 然後看下 PID = 7686 的進程叫 FNDSM, 這個就是 concurrent manager 進程了. 由這個進程啟動了其他好多進程, 例如 RCVOLTM (RCV 模組的 online manager), FFTM INCTM... 等等.

這時如果我們去提交一個 RTP 請求,再查看後台進程, 發現多了一個進程叫 RVCTP

oracle    6161  7885  0 18:43 ?        00:00:00 RVCTP

進程 id PID = 6161, PPID = 7885, PID = 7885 的一個進程是 FNDLIBR,  是由 PID = 7686 FNDSM 產生的, 所以總結一下, 就是 FNDSM 產生了FNDLIBR, 然後再產生了RVCTP, 當我們提交請求, 其實就是調用了下面的函數

fnd_request.submit_request('PO','RVCTP',NULL,NULL,FALSE,'IMMEDIATE',p_group_id,...)

於是就建立了RVCTP 這個進程. 但是RVCTP 進程並沒有真正去做資料庫操作, 而是會產生另一個進程, 進程號比RVCTP 的 PID 增加 2 (6163), 去做實際的資料處理, 因此資料庫的訪問會被記錄在 VID_ora_6163_123456.trc 裡面. 查看 VID_ora_6163_123456.trc 就可以看到下面一句話, SQL trace 檔案已經告訴你這是由哪個進程產生的 trace 檔案.

*** MODULE NAME:(RVCTP@erik-lnx.oracle.com (TNS V1-V3)) 2015-01-26 19:54:06.518

RVCTP 進程在處理完之後自動消失.

RCVOLTM 和 RVCTP 不一樣, 這是 on-line transaction manager, 負責處理 online 的請求. 比如我們用 online 模式接收一個PO (實際上是調用 fnd_transaction.synchronous(l_timeout,l_outcome,l_msg,'PO','RCVTPO','ONLINE',p_group_id,...)), 可以看到下面的進程:

oracle    7760  7686  0 Jan25 ?        00:00:00 RCVOLTM14 oracle    7762     1  0 Jan25 ?        00:00:03 oracleVID (LOCAL=NO)

於是產生的trace 檔案是 VID_ora_7762_123456.trc, 這也是因為 RCVOLTM 進程並不真正去做資料處理的工作, 而是產生一個子進程處理. 開啟這個trace 檔案看一下: MODULE NAME:(e:PO:cp:RCVOLTM14), 確實是由 RCVOLTM14 產生的;

這基本上是一個 manager - worker 的結構, 不管是 Form 裡面提交請求, 產生一個 RVCTP 進程, 還是online 模式下運行早已存在的RCVOLTM14 進程, 都會由此產生一個新的子進程, 子進程的 PID = 父進程的 PID + 2. 至於為什麼 +2 而不是 +1, 這就要問寫代碼的人了. 在 Immediate 和 Batch 模式下, 產生的是 RVCTP 進程, 這個進程在調用fnd_request.submit_request() 後產生, 運行結束後進程消失. online 模式下, 會在原本就存在的進程RCVOLTM14 裡運行, 結束後進程不會消失, 依然存在.

RVCTP 和 RCVOLTM 這兩個進程實際上是兩個可執行程式, 我們到 $PO_TOP 下看,

[oracle@erik-lnx bin]$ ls $PO_TOP/binlibpo.a  POCDMC  POCFH  POCIRM  POCISO  POCRMC  POXCON  POXRAF  POXRSR  RCVOLTM  RVCTP 
就可以看到最後兩個檔案, 就是上面我們說的產生上面那兩個進程的程式.

strings RVCTP |grep '$Header'

可以看到裡面有很多檔案, 例如 rvtii.lpc rvtuq.lpc 等等, 這些都是原始碼檔案, 因為 RVCTP 的原始碼是用 C 寫的, 所以要把這些檔案編譯完串連起來才能變成可執行檔 RVCTP/RCVOLTM. 例如 rvtii.lpc 編譯完產生的 rvtii.o 檔案在 $PO_TOP/lib 目錄下, 再用adrelink.sh 命令把所有的 .o 檔案串連成可執行檔.

所以說, concurrent manager 是有層級關係的, 一個進程由另一個進程產生, 有的進程運行完就消失, 有的會一直存在. 所有上面提到的這些進程都有一個父進程, 就是FNDSM (standard manager), 由它產生其他的 concurrent manager, 而FNDSM (PID=7686)  這個進程和 Form 進程(PID = 5762)是處於相同地位的, 也就是說, Form 和 FNDSM 是相同地位的兩個進程, 有時候我們啟動了 Form 服務, 但是沒有啟動 concurrent manager 服務, 那麼提交請求的時候就會報 "no manager" 的警告.

最後說一下怎樣啟動 FNDSM 進程. 在 $ADMIN_SCRIPTS_HOME 目錄下有一些很好用的指令碼, adcmctl.sh 用於管理 concurrent manager 的啟動與停止, adcmctl.sh stop/start apps/apps 可以用來停止/開始 concurrent manager 服務.

[oracle@erik-lnx scripts]$ adcmctl.sh stop apps/appsYou are running adcmctl.sh version 120.17.12010000.5Shutting down concurrent managers for VID ...
[oracle@erik-lnx scripts]$ ps -aef |grep 'FNDLIBR'oracle    8576  6181  0 20:27 pts/1    00:00:00 grep FNDLIBR[oracle@erik-lnx scripts]$ ps -aef |grep 'FNDSM'oracle    8578  6181  0 20:27 pts/1    00:00:00 grep FNDSM

發現 FNDSM 進程已經消失了. 這時提交任何請求都會報 "no manager" 的警告. 重新啟動之後提交的請求就會繼續被處理了.

最後的最後, 說下由不同進程產生的SQL trace 的特點, 開啟 .trc 檔案, 在檔案開頭尋找 MODULE, 就可以看到產生 trace 的進程是哪個了. 例如:

*** MODULE NAME:(SQL*Plus)*** MODULE NAME:(e:PO:cp:RCVOLTM14)*** MODULE NAME:(RVCTP@erik-lnx.oracle.com (TNS V1-V3))*** MODULE NAME:(frmweb@erik-lnx.oracle.com (TNS V1-V3)) --Form 進程*** MODULE NAME:(fnd.framework.service.lookups.server.LookUpAM:R) --OAF 進程


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.