SSS.SH で systemstate を解析しよう !! – Getting Start –

systemstate はファイルが長くて、はっきり言ってウンザリだぜ、と感じている方?
それ、SSS.SH という shell script が解決してくれるかもしれませんよ!!

JPOUG Advent Calendar 2015 の 20日目です。
そして本投稿は、このブログの初の記事です!!

systemstate_paper_imagepng



systemstate は Oracle Database インスタンスにおける各プロセスの状態を詳細に確認できますが...
シンプルに、こんなSQLを実行した結果も出してくれると嬉しいのです。

SELECT *
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR

という要望を受けて作成したのが SSS.SH です!!



今回より数回に渡って本ブログにて SSS.SH を使用したハング時における systemstate の解析方法について紹介してゆきます!!

初回である今回は、SSS.SH の概要と、 "とりあえず SSS.SH を実行してみる" という内容までをお裾分けしたいと思います。

本稿は、次の方々にお読み頂けると幸いです

  • for DBA/SE/PG
    systemstate の読み方が分からないけど、すぐに・自力で解析したい(前提として Oracle Database のロッキングメカニズムについては理解している)

  • for Support Engineer
    systemstate の解析方法を覚えたいけど、確認ポイントが分からない
    年に2,3回しか読まないので毎回読み方を忘れてしまう
    読み方は知っているけど時間がない!!


ところで systemstate とは?

Oracle Database の運用時に、クライアントから実行したSQLが何分たっても終了しない、いつもは1分程度で完了するのに...
というケース(ハング、スピン)において、詳細に原因を分析する際に取得する資料が systemstate です。

どんな情報が表示される?

systemstate にはインスタンス上で動作しているプロセスがどの様な状態であるかが "SO (State Object)" という単位で出力されています。
SO には次の様に複数タイプが存在ており、Process SO を親として階層構造になっています。

  • Process
  • Session
  • Transaction
  • Call
  • Enqueue
  • Library Object Lock
  • Library Object Pin
  • ..., etc

State Object の階層構造とは?

各SOがどの様な階層構造になっているかは、systemstate に出力される "SO のアドレス" と "Owner のアドレス" から確認できます。

Process SO と Session SO には、それぞれ v$process / v$session に相当する情報が出力されていますので、これらの情報を整理してゆく事で次の SQL を実行した際に得られる結果と同様の情報を得る事ができます。

SELECT *
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR

ハング時の systemstate から何を読み取る?

ハング時の特徴を捉える為には、Latch, Mutex, Enqueue, ... といったロッキングメカニズムを理解して、更にそれらのリソースが各プロセスでどの様に獲得/要求されているかを systemstate から読み取ります。
例えば、Enqueue の競合が発生している場合には、次の様な出力を systemstate より読み取ります。

  • (Session SO からも読み取れますが...) Pid:20 は Pid:19 に待たされている
  • (Session SO からも読み取れますが...) Pid:19 はクライアントからの応答待ち(SQL*Net message from client)
  • (Session SO からも読み取れますが...) Pid:20 はイベント(waiting for 'enq: TX - row lock contention')にて待機中
  • Pid:19 は排他モード(mode:X)で Enqueue(TX-00030011-000002AB)を獲得している
  • Pid:20 は排他モード(req:X)で Enqueue(TX-00030011-000002AB)を要求している

systemstate、はっきり言ってウンザリだぜ、と感じている方?

systemstate のファイルサイズは インスタンスに存在する Oracle Database のプロセス数に比例して大きくなります。
12cR1 では最低でも数万行、ファイルサイズは数MB、大規模環境では 数百MB から 数GBになる事もあります。
ハング・スピン時において通例は、systemstate を数分おきに3回程度取得します。つまり、systemstateの取得回数分、解析する事になります。

systemstateの解析を何度も行ったことのある経験豊富なエンジニアでも、複雑なケースでは確認には時間を要するのではと思います。

それ、SSS.SH が解決してくれるかもしれませんよ!!

SSS.SH の概要

SSS.SH のコンセプトは「systemstate を、短時間で、見やすい・見たい情報をレポートする」です。

どの様なレポートが作成されるのか? 次の画像をクリックして表示してみてください!!

sss.sh.image

この内容であれば、どうにかして読もうと思えそうでしょうか?
SSS.SH が出力した解析結は、2 つのセクションより systemstate 取得時におけるプロセス(セッション)の特徴を確認する事ができます。

"proc/sess state summary" セクション

このセクションでは systemstate 採取時の v$process、v$session に相当する情報を確認できます。

"waiter/holder summary" セクション

このセクションでは待機関係にあるプロセスを確認できます。

例えば、プロセスAが、emp 表の行を update 後、commit/rollback する前にプロセスBで同一行を更新すると、プロセスBは待ち状態になります。
この例の場合では、"プロセスAがプロセスBを待たせている" という状況を このセクションより確認できます。

各セクションの読み方については今後のブログにて紹介します

ライセンス

SSS.SH は GPLv3 ライセンスを適用して、GitHub にて公開しております。
つまり、誰でもタダで使用可能です。

GPLv3 ライセンスが適用されているソフトウェア "A" を改造して
新たなソフトウェア "B" を作成した場合
ソフトウェア "B" のソフトウェアソースを公開する義務が生じます。

ダウンロード方法

SSS.SH は GitHub リポジトリにて公開しております。
(リポジトリのページはこちらのリンクよりアクセスできます)
また、こちらのリンク より最新の script を取得する事もできます。

SSS.SH は1つの shell script のみで動作する為、ダウンロードが必要なファイルは1つのみです。

wget を使用できる環境では次のコマンドを実行することで、SSS.SH をダウンロードする事ができます。

$ # ダウンロード
$ wget https://raw.githubusercontent.com/cosol/sss.sh/master/sss.sh

環境要件

SSS.SH の内部では次のコマンドを使用していますので、これらのコマンドがインストールされている必要があります。

  • gawk (Version 4.x.x 推奨)
  • bc
  • rev

上記コマンドが使用できる環境であれば、Cygwin でも SSS.SH を利用可能です!!

実行方法

次の様に systemstate が含まれたトレースファイルを指定して SSS.SH を実行します。

$ # ダウンロード
$ wget https://raw.githubusercontent.com/cosol/sss.sh/master/sss.sh

$ # 実行権限付与
$ chmod u+x sss.sh 

$ # SSS.SH の実行
$ sss.sh TraceFileName > OutputFileName

Now Analyzing SYSTEM STATE (level=10, with short stacks) 2014-10-30 09:56:17.152 ### systemstateの採取日時
.......................... ### プロセス1つ分の解析毎に、"." が標準エラー出力されます

$ cat OutputFileName
### 省略 : sysytemstate の解析結果が表示される!!

基本的な実行方法は上記の通りですが、level オプションを指定する事で
HTMLモードで解析結果を出力する事や、より詳細に解析を行う事も可能です。
SSS.SH の実行方法については、help オプションからも確認できます!

$ ./sss.sh -h

  usage: ./sss.sh [systemstate-file [level=###] | -h | --help ]

  level   1: create html report
  level   2: analyze the running sql

################################################################################
# SSS.SH is program that analyzes the SystemState developed by Shunya suzuki.
# Copyright (C) 2015 CO-Sol Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
################################################################################

おわりに

次回は SSS.SH の level オプションに関して話したいと思います!!

明日の JPOUG Advent Calendar 2015 は YousukeYada-san です!!

Comments

This post currently has one response

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です