Oracleに負荷をかけているプログラムを探す
OracleサーバのCPUの1つのコアが100%利用されている。
LinuxのtopコマンドでoracleORCL(LOCAL=NO)が利用しているのはわかったが、どこからのアクセスでそうなっているのかわからない。
LinuxのプロセスIDからアクセス元を特定できないものか。
V$PROCESS
V$PROCESS.SPIDがプロセスIDのようだ。
1 2 3 4 5 6 | SELECT * FROM V$PROCESS WHERE SPID IN (15254) |
SPIDに指定しているのはtopでCPUを100%使用していたプロセスのプロセスID。
しかし、V$PROCESSだけでは、プログラム名や接続元が取得できない。
V$SESSIONを結合する。
V$SESSION
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT S.PROGRAM, S.USERNAME, -- ORACLE接続ユーザ S.OSUSER, -- OSユーザ S.MACHINE, -- 接続元ホスト名 S.PROCESS, -- 接続元ホストでのプロセスID(取得できれば) S.EVENT FROM V$PROCESS P JOIN V$SESSION S ON P.ADDR = S.PADDR WHERE P.SPID = 19391; |
これで、接続元の情報が取得できた。
なお、動的ディクショナリビュー同士の結合は推奨されないようだ。
MACHINE列に表示されたサーバに接続し、そのサーバでプロセスプロセスIDを検索する。これで犯人がわかった。
ちなみに、プロセスIDの取得ができない場合は1234が設定されるようだ。
接続元情報を得る
この際、負荷の高いプロセスの接続元だけではなく、すべて表示してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SELECT S.PROGRAM, S.USERNAME, S.OSUSER, S.MACHINE, S.PROCESS, S.EVENT, P.PROGRAM, P.SPID FROM V$PROCESS P JOIN V$SESSION S ON P.ADDR = S.PADDR ORDER BY S.PROGRAM, S.MACHINE, S.PROCESS; |
意外と接続されていることが分かった。
まとめ
運用始めてから5年以上経つOracleが、思いもよらないサーバからアクセスされていることに気が付いてしまった。今回の高負荷の原因とは関係ないアクセスだったが、一応ブロックしておこうか。
同じタグの記事
- Oracle MERGE文
- OracleのFLASHBACKテーブルをPURGEする
- ORACLEのMERGE文 補足
- Oracleのパスワードの有効期限
- sqlite3のデータ型
- 手軽なのに強力なsqlite3
同じカテゴリの記事