Search

OakieTags

Who's online

There are currently 0 users and 36 guests online.

Recent comments

Affiliations

ASH Viewer

In-Memory Parallel Query環境でメモリがだんだん足りなくなると

前回In-Memory PQはdirect path readではなくてsequential readとscattered readでbuffer_cacheに読み込むと書いた。
今回のシナリオは、

  • 対象が全てIn-memoryに有り、最高のスループットを出していた
  • しかし、月日の経過とともにデータ量が増え始め、ディスクI/Oで「継ぎ足しながら」In-Memory PQが動くようになった
同時4セッションで」のhammerora TPC-Hを動かした状況で

ASH Viewerでみると、scatterd readとsequential readの待ちが多く発生している。
read by other sessionのコンテンションが際立っている(前回の新久保君のコメント通り)。
もう少しデータを増やしてみると:

memory_targetで指定した領域が足りなくなり、3セッションがdirect path readでbuffer_cacheを使わないParallel Queryを行うように変わった。

こんな状況になってたら(#572406;">cache buffers chainsラッチミス より):

■データ量に「見合わない」実メモリしか積んでいないと「あきらめる」
■In-Memory Parallel Queryを使わない。pararell_degree_policy=MANUALに戻す。
■或いは、Partition化してbuffer_cacheに収まるサイズに縮小する

前回は、強引に「cache buffers chainsラッチミスが慢性的に発生しているときは」と書いてしまったけど、In-Memory Parallel Queryが使えない状況をLatch Timeoutのような「いち」現象から言い当てるのは難しいです。
なぜならば、AUTO指定でParallel Queryが動いたとたん、待機要素のパーセンテージはdirect path readに独占されるからです。(テストで使用しているSSD x 4のRAID0は、何度も書いていますが、520MB/sでデータ転送をしているのにも拘らずです。)

PQ, In-Memory PQ, In-Memory Non PQを比較する

hammeroraのTPC-Hベンチマークの10回繰り返しを行いASH Viewerで結果をモニタリングした:

A,B Parallel Query (PQが得意なCOMPRESSモードで実行)
C,D In-Memory Parallel Query (In-Memoryが得意なNOCOMPRESSモードで実行。ただしlineitemのみ)
E,F In-Memory Non Parallel Query (同上)

それぞれ、同時1セッションと2セッションの結果だ。

  • 時間軸(X軸)を見るとCおよびDのIn-Memory Parallel Queryが一番速いのが分かる
  • AのPQ 1セッションとCのIn-Memory PQのCPU(緑)を見るとCのIn-Memory PQの方がCPUを使っているように見えるが、In-Memory PQはCPU dpend?で証明したようにParallel QueryのCPU使用時間の方が大きい。I/O待ちでCPUが回らないだけ
  • BのPQ 2セッションではI/O待ち(青)が限界となり、1セッションの2倍ぐらいの時間がかかっている
  • TPC-Hの結果でも以下のように書いた:

    Parallel Queryは同時2セッションが限界で、それ以上は安定した計測値が出ないし、時間も掛かり過ぎた

  • Cの1セッションIn-Memory PQは、初めにphysical readsを行いbuffer_cacheにデータを読み込んでいるが、I/O待ちは発生しないので(青)が出ていない
  • Dの2セッションIn-Memory PQは1セッション実行より若干時間は掛かったが優秀にスケーラブルであった
  • しかし同時3セッションで全てのCPUスレッドが一杯になり、4セッションでRun Queue待ちが予測できる
  • E,FのIn-Memory Non PQはスケーラブルにほぼ同一時間内に終了している
  • そして、同時8セッションまである程度スケーラブルに処理されることが予測できる
  • TPC-Hの結果でも以下のように書いた:

    それから、
    In-Memoryはスケーラビリティでは大勝です。
    でも、メモリに収まるサイズだからです。。。

    でも、よくよく考えてみると、当たり前だな、同時8セッションまではスケーラブルで、それ以上は動かなくなるんだろう。

    そして、Parallel Queryは初めから限界ディスク転送量を出してしまうので「同時実行制御」の工夫が必要だということが、今回のテストを通じて理解できた。

    In-Memory non Parallel Queryじゃダメなんだよ!の中で書いたけど、In-Memory (Non) PQにも同じことが言える。In-Memory PQにはQueueing制御があるのだけど、

    8セッションからのキューイング管理は実装CPUのスレッド数から割り出されているのだろうけど、今回使用しているCore i7 860だと、管理が始まる8セッションは少し遅すぎるのではないかと感じる。
    実際4セッションでCPUは振り切れている。「In-Memory Parallel Queryセッション数」

    同時8セッションまで動かしてしまうと、全てが動かなくなるので、やはり、同時制御の工夫が大事だと思う。

    最後に、
    Parallel QueryはCOMPRESSが得意。
    In-Memory PQはNOCOMPRESSが得意。だから、

    ALTER TABLE lineitem MOVE PARTITION 今月 NOCOMPRESS;
    ALTER TABLE lineitem MOVE PARTITION 2ヶ月前 COMPRESS;
    ALTER TABLE lineitem MOVE PARTITION 3ヶ月前 COMPRESS;
    ..
    ALTER TABLE lineitem MOVE PARTITION 1年前 COMPRESS;

    のように工夫する。