ablog

不器用で落着きのない技術者のメモ

Oracle Database や OS の性能統計情報と財務諸表の共通点

このエントリは JPOUG Advent Calendar 3日目への参加記事です。
"Advent Calendar" の意味を調べてみたところ、

アドベントカレンダー」(Advent Calendar)とは、クリスマスまでの期間(待降節アドベント)をより楽しく過ごすため、12月1日から24日までの間カウントダウンしていく“日めくりカレンダー”のことです。
(中略)
IT業界では、このアドベントカレンダーの風習に習って、12月1〜24日の間、何かのテーマや、何らかの制限事項(縛り)を設けてWebにコラム記事を書くというイベントを楽しむようになりました(なかには25日や年末まで続けるものもあるようです)。

師走を楽しもう。技術系アドベントカレンダーの魅力とは:安藤幸央のランダウン(59) - @IT

ということらしいです。


お役立ちTIPSとか思い浮かばなかったので読み物を書きます。
この世には様々な事象がありますが、抽象化してみると本質は同じということがよくあると感じます。今回は Oracle Database と OS の性能統計情報、さらに会計の財務諸表(貸借対照表損益計算書)に共通すると感じたことを書きます。なぜ抽象化するかというと、Oracle Database で学んだことを抽象化して本質を理解すると他の分野でも活かせると感じるからです*1。抽象化については地頭力を鍛える 問題解決に活かす「フェルミ推定」という本の説明がわかりやすかったので少し引用します。

地頭力を鍛える 問題解決に活かす「フェルミ推定」

地頭力を鍛える 問題解決に活かす「フェルミ推定」

P.158

そもそも抽象化して考えることがなぜ必要なのか。それは「限られた知識の応用範囲を飛躍的に広げる」ためである。(中略)我々の身の回りでも、一見違うものに対して本質を見きわめて単純化すれば同一の原理を多数のものに適用して解を導くことが可能になるのである。

P.173

およそこの世の中で起きていることというのは、表面的にはすべて異なっているものの根本的な構図を掘り下げていけばほとんど同じ構造になっていることが多い。自然科学においては、量子力学相対性理論等ごく少数の理論によって宇宙の森羅万象がほとんど説明できるというのが現在の物理学の教えるところである。さらに人間の行動に目を向けてみても、人間の行動の根本的なモチベーションというのは心理学者のマズローの分析結果にあるように、生理的欲求、安全の欲求、自己実現の欲求といった基本的なものであって、環境が多少変わっても根本原理というのはそれほど変わるものではない。

前置きはこの辺にして本題へ。Oracle Database の AWR や Statspack、UNIX系OSの vmstat や top などのコマンド、会計の財務諸表(貸借対照表損益計算書)には共通点があると思います。それは「アクティビティを数値化して記録して累計していき特定の期間での変動(増加もしくは減少)を見る」というものです。では、Oracle Database から順番に見ていきます。

Oracle Database の性能統計情報

AWRレポートとは、任意の2時点で取得したスナップショットに基づき、データベースパフォーマンスに関連した統計をレポート形式で出力したものです。データベース全体のアクティビティやアプリケーションの傾向、待機イベントの発生状況などの負荷状況をチェックし、チューニングするのに非常に役立つデータを取得できます。

AWR(Automatic Workload Repository/自動ワークロード・リポジトリ)の使い方~レポート、見方、ライセンス | Oracle オラクルエンジニア通信 - 技術資料、マニュアル、セミナー Blog

オラクルエンジニア通信からの引用です。このように AWR や Statspack の説明として、スナップショットを取得し、2つの時点の差分(後 - 前)を算出してレポートを作成するという説明をよく見かけます。

定期的にスナップショットを取って、2つの時点の差分を計算(後 - 前)して、その期間の変動(増減)を見ます。一般的に AWR や Statspack は1時間毎、30分毎といった間隔でスナップショットを取得していることが多いのではないかと思います。例えば、V$SYSSTAT や V$SYSTEM_EVENT などの情報を30秒間隔といった間隔で取得しておくと瞬間的な変動を把握することができます。これらのV$ビューの情報は累計値であるため差分を算出して分析するので、ある時点の累計値を取得して(スナップショット)他の時点の累計値との差分を算出して分析するという点では AWR や Statspack と考え方は同じです。

OS の性能統計情報

OS の性能統計情報についても同じことが言えます。例えば vmstat で5秒間隔で表示させると5秒間毎にCPU使用率などの性能統計情報が表示されますが、これはカーネル空間(メモリ)に累計されていく性能統計情報を5秒間隔で取得して差分や平均を計算して表示していると思われます*2

[oracle@localhost ~]$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 699480  17404 153760    0    0  1479   121 1057  240  4  9 70 17  01行目は見ない
 0  0      0 699480  17420 153784    0    0     0    34 1002   33  0  0 99  1  0
 0  0      0 699480  17428 153776    0    0     0     2  991   25  0  1 99  0  0
 0  0      0 699480  17428 153784    0    0     0     0  999   28  0  1 99  0  0
 0  0      0 699480  17436 153776    0    0     0     2  989   25  0  1 99  0  0
 0  0      0 699480  17436 153784    0    0     0     0  997   29  0  1 99  0  0

vmstat の最初の行は起動時からの平均値になるため現在の瞬間的な状況を見るためには使わないのはそのためです。普通に考えると、最初の1回目は「現在の値 - 5秒前の値」や「(現在の値 + 5秒前の値) / 2」などとしようとしたときに5秒前の値が存在しないことがわかると思います。また、ps コマンドには5秒間隔などインターバルの指定ができないので、CPU使用率などがプロセス起動時から現在の平均になるのも納得がいくのではないでしょうか。累計値を取得して差分や平均を算出しているという点では、top、iostat なども同じと思われます。
少し脱線すると、Linux で strace コマンドでこれらのコマンドが発行しているシステムコールを調べるとプロセスファイルシステム(/proc)にアクセスしていることがわかります。プロセスファイルシステムにはディレクトリやファイルとしてアクセスできますが、実体はカーネル空間にある性能統計情報です。ファイルというシンプルなインターフェースが用意されていることで容易にアクセスできるようになっています。例えば、シェルスクリプトでプロセスファイルシステムにアクセスして性能統計情報を表示させるといったことも簡単にできます。Oracle Database ではファイルではなくビュー(V$ビュー)にアクセスすることで共有メモリにある性能統計情報を参照することができます。こちらもビューという汎用的なインターフェースが用意されているため、SQLで好きなように性能統計情報を参照することができます。Statspack のスナップショット取得時はV$ビューにアクセスしています*3。全てのものをファイルとして扱うUNIXの哲学と全てのものをデータベースオブジェクトとして扱う Oracle Database の哲学?*4には共通点を感じます。

会計の貸借対照表損益計算書

最後に貸借対照表損益計算書です。数字は見るな! 簿記があなたの会計力をダメにするという本の絵が直感的にわかりやすいので紹介します。

数字は見るな! 簿記があなたの会計力をダメにする

数字は見るな! 簿記があなたの会計力をダメにする

P.92

P.145

複式簿記では日々の支出や収入を仕訳入力します。貸借対照表がスナップショットで損益計算書が2時点の差分(Oracle Database でいうAWRレポート)になります。例えば、貸借対照表でその時点でいくら現金があるかはわかりますが、1年間で現金が増えたか減ったかはわかりません。損益計算書を見ると2時点の差分がわかり、前年より現金が増えたのか減ったのかわかります。

まとめ

一応まとめておきます。

  • 性能統計情報は定期的に累計値のスナップショットを取得しての2時点の差分を算出して見ることが多い。
  • 「アクティビティを数値化して記録して累計していき特定の期間での変動(増加もしくは減少)を見る」という点では Oracle Database や OS の性能統計情報も会計の貸借対照表損益計算書も似ている。
  • 抽象化して考えると限られた知識の応用範囲を飛躍的に広がる。

前提

記事の主旨からして、あまり重要でないので最後に前提を書いておきます。


明日はいつもハイクオリティーな情報をブログ等で発信されている yoshikaw さん、楽しみです。

*1:実は役に立つかどうかというより、俺のゴーストの囁きに従っているだけ

*2:ソースコードは見ていません

*3:AWRの場合はMMONプロセスが直接共有メモリにアクセスしています

*4:そんな哲学があるかどうかは知りませんが、私はあるように感じます

*5:部分的にはUNIX系以外のOSでも通用するところもあると思います