Oracleに負荷をかけているプログラムを探す
OracleサーバのCPUの1つのコアが100%利用されている。
LinuxのtopコマンドでoracleORCL(LOCAL=NO)が利用しているのはわかったが、どこからのアクセスでそうなっているのかわからない。
LinuxのプロセスIDからアクセス元を特定できないものか。
V$PROCESS
V$PROCESS.SPIDがプロセスIDのようだ。
SELECT
*
FROM
V$PROCESS
WHERE
SPID in (15254)
SPIDに指定しているのはtopでCPUを100%使用していたプロセスのプロセスID。
しかし、V$PROCESSだけでは、プログラム名や接続元が取得できない。
V$SESSIONを結合する。
V$SESSION
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が設定されるようだ。
接続元情報を得る
この際、負荷の高いプロセスの接続元だけではなく、すべて表示してみる。
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
コメントを残す