はじめに
データベースではクライアントから投げられたクエリがぶん回ってリソースを消費してしまう、という事がたまにあります。このような時、通常はOSへログインしてtop等からCPUリソースを消費しているプロセスを特定し、そのプロセスをkillするような対応を取ります。
RDSではOSへのログインができないため、そのような場合にどのプロセスがCPUリソースを消費しているか、特定がし辛いというものが以前はありました。
しかしながら、現在では 拡張モニタリング を利用することでOSのリソース使用状況を確認することができます。
今回は RDS for Oracle を利用して、クライアントからのクエリがぶん回っているときに該当のセッションを切断する一連の流れを示します。
拡張モニタリング
拡張モニタリングはRDSのOSリソースを確認できるツールになります。
拡張モニタリングはRDSの設定で「拡張モニタリングの有効化」を行うことで利用することができます。
OSリソースなどの他、プロセスリストも表示することができ、プロセスリストではCPU利用率などでソートすることが可能です。
どのようなメトリクスが監視可能かは、拡張モニタリングの OS メトリクス に記載されています。DBエンジンによって一部違いがあったりしますので、確認ください。
拡張モニタリングでのプロセス確認
RDS for Oracleの[Monitoring] (モニタリング) セクションを表示すると、右側にメトリクスのカテゴリを表示するボタンがありますので、そちらから「OSプロセスリスト」を選択します。
OSプロセスリストは以下のように表示されます。特にCPUは利用されていないことがわかります。
この状態の時に、裏からSQLをぶん回して負荷をかけると、以下のような状態になりました。
oracleTESTDB01[7774] というプロセスがCPUを25%(4VCPUなので1CPU占有)していることが確認できます。
該当のプロセスの状態を確認すると、以下のような状況でした。
(v$process の SPID が 7774 であるセッションを確認)
SQL> select sid, s.serial#, pid, spid, s.username, osuser, s.program
2 from v$process p, v$session s
3 where p.addr=s.paddr
4 and p.spid=7774;
SID SERIAL# PID SPID USERNAME OSUSER PROGRAM
---------- ---------- ---------- ------------------------ ---------- ---------- --------------------------------------------------
635 6403 45 7774 ADMIN ec2-user sqlplus@ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.i
該当のプロセス(のセッション)を、SIDとSERIAL#を指定して強制切断します。
SQL> exec rdsadmin.rdsadmin_util.kill(635,6403);
PL/SQL procedure successfully completed.
SQL> /
no rows selected
ふたたびOSプロセスリストをみると、CPUを利用していたプロセスはいなくなっていることが確認できます。
まとめ
RDSではOSにログインできませんが、今回紹介した拡張モニタリングをはじめ色々なメトリクスが用意されているので、何か起きているときの現象を把握することは比較的DB on IaaSと比べても難しくはないと考えています。DBのメトリクスだけだと辛いときは、拡張モニタリングも確認してみましょう!
ちなみに切断された側のセッションは以下のようになってました。
ERROR:
ORA-01012: not logged on
Process ID: 7774
Session ID: 635 Serial number: 6403
begin
*
ERROR at line 1:
ORA-00028: your session has been killed
実はこんなことしなくても、Performance Insightsを利用するともう少し簡単に特定が可能ですので、次回はそちらを紹介します。