[Oracle] 終了したはずのユーザー・プロセスがOS上に残り続ける... | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracle では、専用サーバー構成の場合、サーバー上にはセッションごとにユーザー・プロセスが立ち上がります。

これらのユーザー・プロセスは正常に切断されれば終了されますが、強制終了したり、不意にネットワークが切れたりしたときには、サーバー上に残り続けることがあります。

しかも、これらのユーザー・プロセスは 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}