SSDによるデータベース高速化

少し前にチューニングしたデータベースで
さらにパフォーマンスアップする必要が出たので
最近流行?のSSDを使ったデータベースの高速化について検討してみたのでメモ。
ここ間違ってない?等フィードバック下さると嬉しい。

現在のサーバー構成

パフォーマンスアップ対象のデータベースサーバーは
データベースファイルをNAS(NFSv3接続)においている。
数TBレベルの比較的大規模なデータベースサーバー。

SSDの特性

リードは早いがライトが遅い

基本的にはエンタープライズ向け製品であればリード/ライトスピード両方ともがHDDより数倍向上するが
一般向け製品の中にはランダムライト速度がHDDより劣る製品もある。
SLCタイプはMLCタイプに比べてライト速度が早いためデータベース用途ではSLCタイプを選択したほうが良い。

書き換え回数に上限がある

ウェアレベリング(書き込み分散化技術)やキャッシュメモリの搭載などの緩和策が取られているSSDを選択したほうが良い

容量あたりの単価がHDDと比較して極めて高価
HDDのような大容量品が少ない


詳しくはwikipediaで確認

SSDインターフェース

大きく分けてSATAタイプとPCIExpressタイプと2種類のタイプが存在する。

SATAタイプ

簡単にHDDの代わりとして活用することができRAIDによる大容量化&冗長化も可能だが、
PCIExpressバスに比べてSATAバスは低スピードのためバススピードがボトルネックになりやすい。
SATA2.6の場合は300MB/sec程度のスピードが出る。

PCIExpressタイプ

PCIExpressタイプは大容量化&冗長化は難しいが、
PCI Express1.1の場合は250MB/sec程度のスピードが出る。
PCI Express1.1 x4の場合は1000MB/sec程度のバススピードが出る。
単純にHDDを置き換えるという使い方は出来ないため利用する際は注意が必要。


HDDとSSDの価格を比較すると同容量で5〜10倍程度の価格差があるため、
現在の数百本あるNASのディスクを全てSSDに変えることは難しい。
またNASのディスクをSSDに変えたところで所詮NFSv3接続のため
ネットワーク&バス側がボトルネックになり応答時間の向上はすぐに限界になる。
今回はPCIExpressのSSDを利用した性能向上にターゲットを絞って検討する事とする。

SSDのレイテンシ

HPのSSDでレイテンシは50マイクロ秒以下となっている。
DDRメモリのレイテンシが約40ナノ秒程度と考えるとメモリの代わりにはならない。
これは今後改善されていくと思われる。

PCIExpressのSSDを使ったデータベースの高速化

PCIExpressタイプのSSDは容量が限られる為
どの領域をSSD上に移すかがパフォーマンスアップの肝となる。


SSDに移行する領域の判断時は以下の3つの点を考慮するとよい。

  • セグメント容量:容量が限られるため少ない容量でいかに高速化するかを考える
  • I/O頻度:アクセス頻度の高い領域を移さないと勿体無い
  • I/O特性:ライトよりリードの多い領域をSSDに移すと効果的
ログ領域

セグメント容量:小さい
I/O頻度:高い
I/O特性:ライトが多い

ログ領域はライトが多いため逆に遅くなる可能性があるが、
HPのSSDはデータ転送速度:Read時 最大700MB/s、Write時 最大600MB/s、
最大100,000 IOPS、遅延約50マイクロ秒のため検証の価値はある。

テンプ領域

セグメント容量:小さい
I/O頻度:高い
I/O特性:リード&ライト

ETLアプリケーションではテンプ領域でソートと集計を行う事が多いので効果的。

インデックス領域

セグメント容量:大きい
I/O頻度:色々
I/O特性:リード&ライト

物理アクセスが多いセグメントのTOP5をSSDに移行するなどが効果的。

データ領域

セグメント容量:非常に大きい
I/O頻度:色々
I/O特性:リード&ライト

物理アクセスが多いセグメントのTOP5をSSDに移行するなどが効果的。

データベースの物理アクセス情報の取り方

OracleだとAWRレポートにあるSegments by Physical Readsが判断の材料になる。
Informixだと以下のサイトのスクリプト等を活用して情報をとるとよい。

PCIExpress SSDのバックアップ方法

データベースファイルレベルのバックアップを行っている場合は
NASのバックアップに合わせてSSD内のファイルもバックアップする必要がある。


データベース静止モードでバックアップをとっている場合は
SSD to NASの場合はデータベース静止時間が長くなるため
PCIExpressのカードを2枚挿し同一筐体内でのSSD to SSDバックアップが現実的と思われる。
(製品によってはカード内部でバックアップ機能?を持つものもあるようだ)


たとえばデータベースのデータファイルをSSD-1とSSD-2に交互に作成し、
お互いファイルを相手のSSDにバックアップするという泥臭い方法も検討。

参考情報

検証にあたって以下のエントリーを参考にさせていただいた。Blog主に感謝。


またOracle OpenWorld Tokyo 2009のDELL社&EMC社のSSDに関するセッションも非常に参考になった。
DELL社から近いうちにOracle&DELL&EMCの検証に関するホワイトペーパーが出るようだ。


EMC社が公開している以下の情報も参考になった。
技術情報を公開してくださっているOracle社&DELL社&EMC社に感謝。

参考:メモリディスクによるデータベース検証

Solarisマシンにて小規模データベースを作り
メモリディスクを使う事によりOLTPの処理時間がどの程度変動するかを確認した。

注意点
  • 古いマシンで検証を行ったためCPUがボトルネックになってた
  • SSDは一般的に書き込みが遅いといわれているのでメモリディスクとは差が出る
  • データ容量はログ領域 < インデックス領域 < データ領域
検証結果
  • ALLローカルディスク:約450秒
  • ALLメモリディスク:約421秒
  • インデックス領域,データ領域をメモリディスク:約426秒
  • インデックス領域をメモリディスク:約437秒
  • ログ領域をメモリディスク:約432秒