Hatena::ブログ(Diary)

ablog このページをアンテナに追加 RSSフィード

2012-12-02

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

このエントリは JPOUG Advent Calendar 3日目への参加記事です。

"Advent Calendar" の意味を調べてみたところ、

アドベントカレンダー」(Advent Calendar)とは、クリスマスまでの期間(待降節アドベント)をより楽しく過ごすため、12月1日から24日までの間カウントダウンしていく“日めくりカレンダー”のことです。

(中略)

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

師走を楽しもう。技術系アドベントカレンダーの魅力とは - @IT

ということらしいです。


お役立ちTIPSとか思い浮かばなかったので読み物を書きます。

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

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

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

P.158

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

P.173

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

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


Oracle Database の性能統計情報

f:id:yohei-a:20121203022645j:image:w360

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

no title

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

f:id:yohei-a:20121203025613p:image:w640

定期的にスナップショットを取って、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  0 ★1行目は見ない
 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

f:id:yohei-a:20121203032843j:image:w360

P.145

f:id:yohei-a:20121203032730j:image:w360

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


まとめ

一応まとめておきます。

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

参考文献


前提

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


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

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

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

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

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

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

2012-08-30

DBAのタスクにはどんなものがあるか

DBAのタスクにはどんなものがあるか世の中の情報を集めてみた。

タイプ別DBAのタスク

DBAの3タイプ データベースコンサルタントのノウハウちょい見せ より

開発者側DBAの担当タスク
運用側DBAの担当タスク
全体最適DBAの担当タスク
  • 未然防止や横展開
  • 標準ガイド作成と展開
  • 標準構成作成と展開
  • ツール作成と展開
  • DB関連のレビュー
  • トラブル対応(インシデント対応)
  • 高品質な運用

書籍の目次より

Oracle運用・管理の鉄則

第1章 データベース管理の鉄則(メモリ管理を自動化する圧縮機能を使用して効率よくデータを格納する ほか)

第2章 バックアップ&リカバリの鉄則(メディアリカバリの時間を短縮するクラッシュ・リカバリの時間を制御する ほか)

第3章 パフォーマンス・チューニングの鉄則(表や索引バッファキャッシュに固定するSQL問合せ結果のキャッシュ ほか)

第4章 トラブル・シューティングの鉄則(ORA‐60:「デッドロックが発生しました」に対処するORA‐1555:「“スナップショットが古すぎます”が発生しました」に対処する ほか)

第5章 Real Application Clustersの鉄則(RAC環境におけるデータベース自動起動を変更するVirtual IPを他のノードに移動する ほか)

即戦力のOracle管理術 ~仕組みからわかる効率的管理のノウハウ

第1章 データベース運用の仕事を理解しよう

1-1 システムにおけるデータベース運用の位置付け

1-2 データベース運用の担当者の仕事

1-3 サービスの品質を保証する(サービスレベル管理)

1-4 ユーザーが納得できるサービスを提供する(キャパシティ管理)

1-5 システムを正常に動作させる(定期メンテナンス

1-6 システムを停止させない(可用性管理)

1-7 システムをすぐに復旧できるようにする(IT継続性管理)

1-8 データベースへの不正なアクセスを防ぐ(セキュリティ管理)

1-9 運用ポリシーを定義する(運用管理)

第2章 データベース管理アーキテクチャを理解しよう

2-1 データベース管理アーキテクチャの全体像

2-2 OracleEnterpriseManagerからデータベースを見てみよう

2-3 データ構造を理解し,データにアクセスしてみよう

2-4 トランザクションの管理を理解しよう

2-5 Oracleデータベース記憶域構造を理解しよう

2-6 データベースインスタンスを理解しよう

第3章 データベース運用の基本を学ぼう

3-1 外敵からデータベースを守る

3-2 いざというときのためのバックアップを用意する

3-3 データベースに溜まったゴミを掃除する

3-4 データベースの声に耳を傾けよう

第4章 不測の事態に備えよう 〜トラブルとの付き合い方〜

4-1 トラブルを起こさない

4-2 トラブルを見過ごさない

4-3 トラブルを長引かせない(1)現状分析

4-4 トラブルを長引かせない(2)問題の切り分け

4-5 トラブルを長引かせない(3)解決策を検討・実施する

4-6 こんな問題が発生したらどうする?

第5章 最新・最速のSQLチューニングテクニック

5-1 SQLチューニングの4大項目

5-2 SQLの実行計画を理解する

5-3 オプティマイザ統計情報を理解する

5-4 待機イベントを理解する

5-5 パフォーマンス統計を理解する

5-6 基本のSQLチューニング

5-7 高度なSQLチューニングテクニック

5-8 EMを使用したかんたんSQLチューニングテクニック

第6章 確実・高速Oracleバックアップテクニック

6-1 DataPump を最大限に活用するテクニック

6-2 RMANによる確実なバックアップ取得テクニック

6-3 RMANによる高速バックアップ取得テクニック

6-4 RMAN バックアップのサンプルスクリプト

即戦力のDB2管理術 ?仕組みからわかる効率的管理のノウハウ

第1章 データベースの基本とDB2の仕組み

1-1 データベースに求められる5つの機能

1-2 DB2の内部構造を知る

第2章 DB2の基本的な操作と設定をマスターする

2-1 インスタンスを作成/起動する

2-2 データベースと表を作成する

2-3 DB2のコマンドを実行する

2-4 データベースを作成する前に考慮しておきたい4つのこと

2-5構成パラメータを設定する

2-6本番環境で使用するための最低限の設定

第2部 日々の運用のための基本ノウハウ

第3章 バックアップでデータを守る

3-1バックアップの基本をおさえる

3-2 実際のバックアップ運用に求められるもの

3-3バックアップ計画を立てる

3-4 その他のバックアップ方法

3-5小〜中規模データベース向けのバックアップ運用

第4章 表を再編成してパフォーマンスを維持する

4-1 表の再編成の基本

4-2 効率的に表を再編成する

第5章 統計情報を更新してアクセスプランの精度を上げる

5-1 アクセスプランと統計情報が必要になる理由

5-2 統計情報を更新するための基本

5-3 効率的に統計情報を更新するには

第6章 自動保守で管理を効率化する

6-1 自動保守の基本

6-2 自動保守機能を利用する時の注意点

第3部 安定運用のための監視・問題判別のコツ

第7章 監視で事前に問題を発見する

7-1 何を,何のために監視するのか

7-2DB2の「今の状態」を知る

7-3 DB2リソースを監視する

7-4 DB2のパフォーマンスを監視する

第8章 トラブル解決のための問題判別の考え方

8-1 問題判別の4ステップ

8-2 原因が特定しきれない場合の対処法

8-3 イベントモニターの使い方

8-4 DB2が異常終了した際の情報を取得する

第4部 ひとつ上の性能を引き出す 〜パフォーマンスチューニング

第9章 パフォーマンスチューニングの基本

9-1 パフォーマンスのチューニングの基本的な考え方

9-2 ベンチマークを行う

9-3 アクセスプラン(実行計画)を把握する

第10章 パラメータを調整して高速化する

第11章 物理設計を変更して高速化する

プロとしてのOracle運用管理入門

Part 1 データベース管理者の役割とOracleの起動・停止

CHAPTER 01 データベース管理者の役割

CHAPTER 02 Oracleの起動・停止

Part 2 領域管理

CHAPTER 03 領域管理の全体像と永続表領域の管理

CHAPTER 04 UNDO領域の管理

CHAPTER 05 一時表領域の管理

Part 3 オブジェクトの管理

CHAPTER 06 テーブルの管理

CHAPTER 07 索引の管理

CHAPTER 08 その他のオブジェクトの管理

Part 4 ユーザー管理と監査

CHAPTER 09 ユーザー管理

CHAPTER 10 監査

Part 5 パフォーマンスの管理

CHAPTER 11 パフォーマンス管理の概要とStatspackレポートの分析

CHAPTER 12 メモリの管理

CHAPTER 13 実行計画とオプティマイザ統計

CHAPTER 14 SQLチューニングの基本

Part 6 バックアップ/リカバリとデータ管理

CHAPTER 15 バックアップ/リカバリの概要

CHAPTER 16 バックアップの取得とファイル管理

CHAPTER 17 障害復旧

CHAPTER 18 論理バックアップ

Part 7 構成・設定管理

CHAPTER 19 初期化パラメータの変更

CHAPTER 20 構成ファイルの管理とパッチ適用

CHAPTER 21 ネットワーク管理

Part 8 ログファイルの管理と障害対応

CHAPTER 22 ログファイルの管理・分析

CHAPTER 23 エラーと障害対応

CHAPTER 24 セッション管理

Oracle Database11g運用・管理ガイド

第1章 Oracle Database 11g 概要

1-1 Oracle Database 11g 概要

1-2 基本アーキテクチャ

1-3 インストール

1-4 データベースの作成

1-5 ネットワークの設定

第2章 Oracle Enterprise Managerによるデータベース管理

2-1 OEMアーキテクチャと構成要素

2-2 セットアップと設定変更

2-3 OEMの利用

2-4 監視

2-5 インスタンスの管理

2-6 ジョブの管理

2-7 SQL実行環境

第3章 領域管理

3-1 領域管理概要

3-2 表領域の管理

3-3 アーカイブ・ログ・ファイル

3-4 ASMの管理

3-5 フラッシュバック・データ・アーカイブ

第4章 パフォーマンス管理とチューニング

4-1 パフォーマンス管理概要

4-2 チューニングの基礎

4-3 実行計画

4-4 SQLアドバイザ

第5章 セキュリティ

5-1 ユーザー管理

5-2 監査

5-3 ネットワークセキュリティ

5-4 暗号

5-5 Database Vauit

第6章 バックアップリカバリ

6-1 バックアップリカバリ概要

6-2 Automatic Diagnostic Repository(ADR)

6-3 Data Recovery Adviser

6-4 基本天気なバックアップ

6-5 Recovery Managerによるバックアップ

6-6 データベースリカバリ

6-7 論理バックアップ

6-8 SQL* Loader

第7章 高可用性構成

7-1 Oracle Real Application Clusters

7-2 Oracle Data Guard

第8章 Oracle Real Application Testing

8-1 データベースリプレイ

8-2 SQLパフォーマンス・アナライザ

2012-04-29

Windows XP のチューニング

自分が設定している Windows XP のチューニング設定をリストアップしてみた。

自分のPCの性能統計情報から判断して設定しているものもあり、どの環境でも同じように設定すればよいというものではありません。


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"DisablePagingExecutive"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]
"IoPageLockLimit"=dword:00010000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"NtfsDisableLastAccessUpdate"=dword:00000001
  • スタートメニューをクラシック表示にする
[スタート]-[設定]-[タスクバーと[スタート]メニュー]-[[スタート]メニュー]
クラシック[スタート]メニュー
  • ページングファイルを使わない
[スタート]-[設定]-[コントロールパネル]-[システム]-[詳細設定]-[パフォーマンス]-[設定]-[詳細設定]-[仮想メモリ]-[設定]
ページングファイルなし
  • 視覚効果で「パフォーマンスを優先する」設定にする
[スタート]-[設定]-[コントロールパネル]-[システム]-[詳細設定]-[パフォーマンス]-[設定]-[視覚効果]
パフォーマンスを優先する
  • プロセッサのスケジュールとメモリ関連の設定(実験的に変えてみた)
[スタート]-[設定]-[コントロールパネル]-[システム]-[詳細設定]-[パフォーマンス]-[設定]-[詳細設定]
プロセッサのスケジュール: バックグラウンドサービス
メモリ使用量: システムキャッシュ
  • 起動時にバナーを表示しない
    • 1.スタートメニューから「ファイル名を指定して実行」を開いてコマンドラインに「msconfig」と入力し、OKをクリック。
    • 「システム構成ユーティリティ」ダイアログボックスが起動したら、「BOOT.INI」タブをクリック。
    • 「multi(0)disk(0)rdisk(0)partition(1)\ WINDOWS="Microsoft Windows XP Professional" / fastdetect」の行をクリックして選択状態にし、「ブートオプション」の「/NOGUIBOOT」にチェック。
    • 「multi(0)disk(0)rdisk(0)partition(1)\ WINDOWS="Microsoft Windows XP Professional" / fastdetect」のうしろに「/noguiboot」と追加されたことを確認して「OK」をクリック。

参考

2012-04-26

DataPump でデータだけインポートするとき

データだけ。統計情報とか変えたくないとき。

impdp scott/tiger directory=test_dir dumpfile=exp.dmp tables=emp content=data_only

2012-04-17

SQL*Net関連の待機イベントと統計情報

  • SQL*Net message from client

サーバー・プロセス(フォアグラウンド・プロセス)は、クライアント ・プロセスからのメッセージが到着するまで待機します。

待機時間: クライアントに最新のメッセージを送信してから、クライアントからメッセージが到着するまでに必要な時間

  • SQL*Net more data from client

サーバーは、すでに開始されている操作で、そのクライアントのシャドウ・プロセスに追加データを送信するためにクライアントで待機中です。

待機時間: データの受信に必要な時間(待機中の時間を含む)によって異なります。

  • SQL*Net message to client

サーバー(フォアグラウンド・プロセス)はクライアントにメッセージを送信しています。

待機時間: 送信に必要な実時間

  • SQL*Net more data to client

サーバー・プロセスは、クライアントへの追加データまたはメッセージを送信しています。クライアントに対する前回の動作も送信でした。

待機時間: 送信が完了するまでに必要な実時間

  • SQL*Net roundtrips to/from client

クライアントとの間で送受信した、Oracle Net Servicesのメッセージの合計数

  • bytes received via SQL*Net from client

Oracle Net Servicesを介してクライアントから受信したバイトの合計数

  • bytes sent via SQL*Net to client

フォアグラウンド・プロセスからクライアントへ送信したバイトの合計数


参考


追記(2013/04/23):

参考

"SQL*Net message to client" does NOT measure network latency! It merely measures how long it took to putthe response message into TCP send buffer on the server!

Once the response packet is put into TCP send buffer, Oracle server process continues on and starts waiting for "SQL*Net message FROM client" again. It’s up to TCP stack to deliver this packet from this point and Oracle server process has no way for measuring directly when did the packet arrive (it would have to start intercepting TCP ACK packets at kernel level for that).

This behaviour also explains, why the "SQL*Net message TO client" waits are usually unbelievably short – like 1 microsecond etc.

...

Note that you can see longer times spent waiting for “SQL*Net message to client” when sending large amounts of data. This happens when your TCP send buffer gets full, thus TCP stack can not accept further packets. Sending will be blocked until the remote site sends back further ACK packets which state up to which byte in the TCP transmission stream it has received the data.

So, if you’re sending loads of data over a slow link or misconfigured TCP connection, the “SQL*Net message to client” wait time can be used as a low-confidence indicator of your SQL*Net throughput (in conjuction with “bytes sent via SQL*Net to client”), but never a measure of network latency!

SQL*Net message to client wait isn’t really what it’s thought to be | Tanel Poder's blog: IT & Mobile for Geeks and Pros

I’ll reiterate that both SQL*Net message to client and SQL*Net more data to client waits only record the time it took to write the return data from Oracle’s userland SDU buffer to OS kernel-land TCP socket buffer. Thus the wait times of only microseconds. Thanks to that, all of the time a TCP packet spent “flying” towards the client is actually accounted in SQL*Net message from client wait statistic. The problem here is though, that we don’t know how much of this time was spent on the wire and how much of it was application think time.

SQL*Net message to client vs SQL*Net more data to client | Tanel Poder's blog: IT & Mobile for Geeks and Pros

Anyway, as I said in my Oracle-L reply, these breaks are caused by bad application design which allows too many unhandled exceptions to be propagated all the way up to the client.

The solutions would be to reduce or eliminate the number of errors occurring, or at least put that code into PL/SQL blocks where errors would be handled and not propagated back to client every time.

SQL*Net break/reset to client | Tanel Poder's blog: IT & Mobile for Geeks and Pros

What is happening is that an attempt is made to insert a row, most of the time a duplicate error results, the code catches this exception and does an update.

I was wondering if its the duplicate error and the exception handling which results in this wait event showing up.

My answer to that was following:

Yes, a SQL*Net break/reset happens when an error/unhandled exception is raised during a call (which means that the call executed didn’t complete normally, thus the call state must be reset).

SQL*Net break/reset to client | Tanel Poder's blog: IT & Mobile for Geeks and Pros

たとえば、アプリケーションで送受信される大半のメッセージが8KB未満の場合は、70バイトをオーバーヘッドと考慮して、SDUを8KBに設定すれば問題ありません。利用可能なメモリーが十分にある場合は、SDUの最大値を使用すると、システム・コール数やOracle Net Servicesのオーバーヘッドを最小限に抑えることができます。

パフォーマンスの最適化