これらのユーザー・プロセスは正常に切断されれば終了されますが、強制終了したり、不意にネットワークが切れたりしたときには、サーバー上に残り続けることがあります。
しかも、これらのユーザー・プロセスは CPU を占有し続け、サーバーのパフォーマンスに悪影響を及ぼすこともありますので要注意です。
このようなユーザー・プロセスを発見するには、Oracle、OS の両サイドからアプローチし、両者の情報を照合して対処することになるかと思います。
Oracle サイドからアプローチする場合は、V$SESSION と V$PROCESS の情報を参照します。
例えば、以下の SQL を実行すると、
SELECT
P.PID ORACLE_PID,
P.SPID OS_PID,
S.STATUS,
S.USERNAME ORACLE_USER,
S.OSUSER OS_USER,
S.TERMINAL,
S.PROGRAM,
TO_CHAR(S.LOGON_TIME, 'YYYY/MM/DD HH24:MI:SS') LOGON_TIME
FROM V$PROCESS P
LEFT OUTER JOIN V$SESSION S
ON P.ADDR = S.PADDR
WHERE P.BACKGROUND IS NULL
AND P.PID > 1
ORDER BY PID;
ユーザー・プロセスの情報が以下のように表示されます。ORACLE_PID OS_PID STATUS ORACLE_USER OS_USER TERMINAL PROGRAM LOGON_TIME
---------- ------ ---------- ----------- ---------- ---------- -------------------- --------------------
10 8163 INACTIVE SCOTT 2008/10/03 13:15:26
16 9018 INACTIVE SCOTT 2008/10/03 13:43:11
17 12568 INACTIVE SCOTT 2008/10/03 14:38:22
.
.
.
30 14552 ACTIVE SYSTEM admin CLIENT01 sqlplus.exe 2008/10/03 09:23:51
31 26534 INACTIVE SCOTT 2008/10/03 18:50:39
32 21894 KILLED SYSTEM admin CLIENT02 sqlplus.exe 2008/10/02 23:57:25
33 12679 INACTIVE SCOTT 2008/10/03 19:22:50
ここで注意したいのは、STATUS が "KILLED" のまま長時間が経過しているものと、STATUSが"ACTIVE"となっているが、実際には切断されており、かつ長時間を経過しているものです。このようなユーザー・プロセスは死に損ないの可能性があります。
OS サイド(ここでは Linux)からアプローチする場合は、top コマンドと ps コマンドを使用します。
top コマンドを実行すると、
$ top以下のようにCPUの使用率の高いプロセスをリアルタイムでモニタリングできます。
top - 11:31:18 up 42 days, 19:38, 1 user, load average: 0.00, 0.02, 0.00
Tasks: 159 total, 1 running, 158 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2% us, 0.2% sy, 0.0% ni, 98.3% id, 1.3% wa, 0.0% hi, 0.0% si
Mem: 4086452k total, 4043916k used, 42536k free, 166016k buffers
Swap: 8385760k total, 40392k used, 8345368k free, 3414832k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7721 oracle 16 0 3208 1004 768 R 0 0.0 0:00.06 top
17649 oracle 16 0 1249m 509m 507m S 0 12.8 5:14.72 oracle
1 root 16 0 1700 548 468 S 0 0.0 0:04.04 init
.
.
.
また、以下のように ps コマンドを実行すると、$ ps -ef | grep oracle
プロセスの一覧が Oracle 関連のプロセスに絞って表示されます。
oracle 3513 1 0 Aug28 ? 00:00:24 ora_pmon_ORCL oracle 3515 1 0 Aug28 ? 00:00:00 ora_mman_ORCL oracle 3517 1 0 Aug28 ? 00:04:06 ora_dbw0_ORCL . . . oracle 13338 1 0 Sep04 ? 00:00:03 oracleORCL (LOCAL=NO) oracle 13377 1 0 Sep04 ? 00:00:05 oracleORCL (LOCAL=NO) oracle 13379 1 0 Sep04 ? 00:00:08 oracleORCL (LOCAL=NO) oracle 13381 1 0 Sep04 ? 00:12:50 oracleORCL (LOCAL=NO) oracle 13388 1 0 Sep04 ? 00:00:02 oracleORCL (LOCAL=NO) . . .これらのプロセスのうち、"oracle{SID} (LOCAL=NO)"となっているものがユーザー・プロセスになります。
top コマンドの結果と ps コマンドの結果をプロセスIDで照合し、top コマンドで常に CPU の使用率が高い Oracle プロセスがあり、それがユーザー・プロセスであった場合、それらのプロセスは死に損ないのユーザー・プロセスの可能性があります。
このようにして、Oracle サイドから得られた情報と OS サイドから得られた情報をプロセスID をキーに照合し、また、実際の Oracle の利用状況を確認した上で、死に損ないのユーザー・プロセスであると判断できた場合、これらのプロセスは OS 上で強制終了させます。
$ kill -9 {PID}