2012/12/08

コンカレンシーにまつわるアレ・コレ

最初に

今日は、JPOUG Advent Calendarのエントリです。
昨日の小田さんに続き、私は、1μmも役には立たないエントリとなります !

最近思うこと

昨今、データベースシステムを構成するハードウェアは大量のコア、一昔では考えられないほどの大量のメモリーが搭載し、さらにデータベースのボトルネックの王者たる風格さえ漂っていたI/Oにも高速化の波が押し寄せてきています。

そんな中、古くて新しい、そして、RDBMSとしての真価を問われるコンカレンシーの問題がボトルネックとして浮かび上がっているような気がしています。

このコンカレンシーの問題は、曲者で、どんなに高速なCPUを沢山搭載しても、どんなに沢山のメモリーを積んでも、ロケットばりの高速ストレージを使っても、コンカレンシーがボトルネックとなると全くパフォーマンスがスケールしません。(まぁー、極端な言い回しですが)



そんな事を、つらつら考えつつ、コンカレンシーの問題が大きく関係するBuffer Cache上で繰り広げられる様々な動きを考えて見ることにします。

ここで、登場するボトルネックの原因となるWait Eventは、こんな物です。

  • latch: cache buffers chains
  • latch: cache buffer lru chain
  • free buffer waits
  • read by other session


まず、SELECT文のEXEC/FETCHフェーズを想像して下さい。

上記のWait Eventを噛み砕くと、こんな感じでしょうか?

latch: cache buffers chains

「僕の探しているブロックはキャッシュされていますか~」を多くの人(Session)が聞きたがっている。でも、キャッシュされているか答えをもらうためのチケット(cache buffers chains latch)は一つ(もしくは非常に少ない)なので、なかなか、その順番が回ってこない。なので、「待つ」

* ちなみに latch: cache buffers chains は"聞く"だけなら、コンカレンシーの問題は起こらないのですが、このラッチは、「ブロックをキャッシュするので、ちゃんと管理しておいて~」の場合には、他の人が触れないようにする必要がある("聞く"こともできない)ので、コンカレンシーの問題が発生します。

latch: cache buffer lru chain

先ほどのキャッシュされているか答えてもらうチケット(cache buffers chains latch)を使って、「そのブロックはキャッシュされてないです」と分かった場合、ディスクから目当てのブロックを探して、バッファ・キャッシュに乗せる必要がある。

でも、バッファ・キャッシュのどこにでも乗せて良いわけがなく、「バッファ・キャッシュの空いてる場所はどこですか~」を多くの人が聞きたがっている。でも、空いている場所を教えてもらうためのチケット(cache buffer lru chain latch)は一つ(もしくは非常に少ない)なので、なかなか、その順番が回ってこない。なので、「待つ」

free buffer waits

さらに、「バッファ・キャッシュの空いてる場所はどこですか~」で空きがあれば良いのですが、「残念ながら空きはないです」と言われると、バッファ・キャッシュ上で、あまり使ってないだろうと思うブロックを捨てる。でも、その捨てようとしたブロックが、ダーティ・ブロックだった場合、DBWRに「これ、ダーティなので、データファイルにちゃんと書いといて」とお願いする必要がある。で、その書き出しが終わって、「使っていいよ」と言われるまで、「待つ」

read by other session

さらにさらに、上記を経て、待ちに待った、キャッシュの乗せる作業に移るわけですが、面倒なことに、「今まさに、バッファ・キャッシュに乗せようとしている、そのブロック、そう、そのブロックを僕にも下さい」と他の誰かが言い出した。

今、まさに、バッファ・キャッシュに乗せようとしている人は、ディスクから持ってこようとシングル・ブロック・リード(db file sequential read)やマルチ・ブロック・リード(db file scattered read)で頑張っている最中。なので、他の誰かは、「待つ」

ちなみに2セッションで、同一テーブルをフルスキャンすると1つのセッションはdb file scattered readで頑張り、もう1つのセッションはread by other sessionで待つ。という、なにか、こう、切ない感じがするのは私だけでしょうか...


ということで

ということで、キャッシュ上のブロックの管理も一苦労なわけで、それを、一度に沢山の人にお願いされると、コンカレンシーの問題が浮上するわけです。

最初の話に戻りますが、多くのCPUにより多くのセッションを同時に処理することが可能になるわけです。しかしながら、CPU間の同時実行から特定のリソースを保護する必要はあるわけで、CPUパワーを上手く使うことができない残念な結果も発生してしまいます。

ただこれば、今まではディスクのI/Oがボトルネックだ。とか言って見えていないコンカレンシーのボトルネックがハードウェアに進化とともに、また、というか、昔とは別の意味で見えてきたということでしょう。

ハードウェアが進化して、単純な問題は解決され、より複雑なデータベース自体の実装周りの問題が、今後のチューニング対象となっていくんだろうと思う、今日この頃です。

最後に

明日は yoshidasingo さんです。よろしくお願いします!

2012/04/08

Oracle OpenWorld 2012 Unconference presented by JPOUG

2012/04/06に六本木アカデミーヒルズにてOracle OpenWorld 2012 Unconference presented by JPOUGとして多くのセッションが行われました。お越しいただいたい全ても皆様、セッションを担当して頂いた方々、Unconferenceの運営を任せて頂いた関係者各位に感謝申し上げます。

Unconferenceの中で、私も1つのセッションを担当しました。本質的には、

- プリミティブな世界の変化により、アプリケーションは変わらなければいけないし、変わらざるを得ない
- 今まさに、データベースにおいても、その変化が起きている

つまり、我々データベースに携わるものも変わらなければいけないし、変わらざるを得ない

ということですが、セッション終了後、私がセッション内でお題として扱った


同一SQLをネタにして、 
同一の実行計画により、 
異なるI/Oパターン


の方法論について質問がありました。本セッションの本質ではないため、あまり説明はしませんでした。(本当は、ちょっと異なるI/Oパターンとしては無理くり感があり、恥ずかしかったので...) しかし、質問がありながら、公開しないほどのものではないので、本ブログにセッション内で使用した資料も合わせて掲載しておきます。

- DIRECT PATH READ
11gR2が検証環境でしたので、十分大きいセグメントに対しては自動的にdirect path readをオプティマイザが選択するので、本検証環境は何も特別なことは実施していません。
古いバージョンでは"_serial_direct_read"等にて制御可能です。

- DB FILE SCATTERED READ
alter session set events '10949 trace name context forever, level 1';
alter session set "_very_large_object_threshold"=500000;

"_very_large_object_threshold"はこちらで説明してました。
http://kojishinkubo.blogspot.jp/search/label/_very_large_object_threshold

- DB FILE SEQUENTIAL READ
alter session set db_file_multiblock_read_count=1;

簡単に検証可能ですので、皆さんも、プリミティブな世界をお楽しみください。


2012/03/04

ROracle: OCI based Oracle database interface for R

先日、ROracleがOCIベースに変更されたようなので、気になって入れてみました。

そもそも、私自身、Rから積極的にOracleを使おうと考えてなかった(それほど、大量データを扱わない)のですが、Oracleにあるデータをサクっと抽出してサラっと分析できると便利だろうと思います。ROracle自体はCRAN(The Comprehensive R Archive Network)にソースの状態で置かれているので別途コンパイルが必要です。以下、R(および必要であればRStudio)とROracleのコンパイル方法をまとめておきます。

* 基本的にはココをベースにしています。(http://cran.r-project.org/web/packages/ROracle/INSTALL)

まず、R自身をインストールしないと話は始まらないので以下からダウンロードします。
(私はWindows版2.14.2をダウンロードしてインストールしました)

http://cran.r-project.org/

続いてGUIツール(コンソールだけで良ければ必要ありません)もインストールしておきます。(v0.95)

http://rstudio.org/download/desktop

また、Windows環境でmake等のツールが必要になるのでcygwinを含めた一式(Rのバージョンに合わせて)Rtoolsをダウンロードしてインストールしておきます。

http://cran.r-project.org/bin/windows/Rtools/

あと、Oracleのinstant client(basicとSDK)を以下に配置しておきます。(どうもパスは固定のようです。32bitの方はx64の部分をx32としてください)
C:\instantclient\x64\instantclient_11_2

最後にROracleをダウンロードしておきます。

http://cran.r-project.org/web/packages/ROracle/index.html

では、コマンドプロンプト(RStudioではシェル)を起動して
* パスは適宜読み替えてください

C:\> PATH=%PATH%;C:\Rtools\bin;C:\Rtools\MinGW64\bin
C:\> R CMD INSTALL --build ROracle_1.1-1.tar.gz

これでC:\にROracle_1.1-1.zipというパッケージが作成されます。

今度はRのコンソールから

> install.packages("DBI")
> install.packages("png")
> install.packages("C:/ROracle_1.1-1.zip", contriburl = NULL)

以上でコンパイルとインストールはおしまい。あとは適当に使ってみます。
手元にあるデータがSwingbenchのSHスキーマだったので、salesテーブルから各月毎の売上高(ちょっと怪しいですが)を計上してみます。

> # ROracleのロード
> library(ROracle)
> # ドライバーの設定
> drv <- dbDriver("Oracle")
> # SQL*Plusライクに接続
> conn <- dbConnect(drv,"sh","<password>","//<hostname>/<service_name>")
> # SQLを実行し、フェッチしてdata変数に格納
> data <- fetch(res <- dbSendQuery(conn, "select /*+ parallel(48) use_hash(s, p) */ sum(s.AMOUNT_SOLD * p.PROD_LIST_PRICE) SOLD from sales s, products p where s.PROD_ID=p.PROD_ID group by to_char(s.TIME_ID, 'yyyymm') order by 1"))
> # 時系列オブジェクトに変換
> tmp <- ts(data,start=c(1995,1),frequency=12)
> # とりあえずプロットしてみる
> ts.plot(tmp)

結果、こんな感じのチャートが出来上がります。エクセルで、データの加工と分析も良いのですが、Rで分析するとデータを別の切り口で見ることが可能です。ご興味のある方は是非お試しください。 * ちなみに私はRに関しては素人同然なのですが、これを機に再度勉強しようと思っています。


2012/02/20

JPOUGの正式オープン


「優れたエンジニアに接することが成長への近道――幹事に聞く「JPOUG」の真の意義」でも触れましたがJPOUG(Japan Oracle User Group)が、ボードメンバーの方をはじめ様々な方のお力を借りwww.jpoug.orgとして正式にオープンしました。これから、本格的にセミナー、情報共有を図っていきたいと考えています。Facebook、Google Groupも同時に公開しました。皆様のコミュニケーションの場になれば。と思っています。

Facebook
http://www.facebook.com/jpougfan

Google Group
https://groups.google.com/group/jpoug/

また、4月に開催されるOracle OpenWorld において "Oracle OpenWorld Unconference presented by JPOUG" としてアンカンファレンスを行う予定ですので、お楽しみに。