I/Oボトルネック解消に必要な2つのアプローチ
連載第2回では、大規模データ処理におけるディスクI/Oのボトルネックが発生する原因や、かんたんな分析手法について紹介しました。では、I/Oボトルネックを改善するには、どのようにすればいいのでしょうか。大きく分けると、以下の2つのアプローチがあります。
- ①I/Oを高速化する
ストレージ数やストレージあたりのディスク数の増設、ディスクやコントローラの高速化、DB-ストレージ間のネットワークの帯域拡張など、おもにハードウェアの増強や性能アップでボトルネックを改善します。
- ②I/O量を減らす
おもにロジック(SQLや実行計画)の改善、断片化の解消、Oracle Databaseの機能などによってボトルネックを改善します。
第2回で紹介したI/Oボトルネックの発生パターンは、すべて上記のアプローチを適切に取ることで解消します。
Oracle ExadataはどのようにしてI/Oを高速化しているのか
前回紹介したとおり、データベースのI/O時間は、下記のように表されます。
- I/O時間 = ストレージがデータを取得する時間
- + ストレージからデータベースへデータを転送する時間
- + データベースサーバでI/O処理を行う時間
「ストレージがデータを取得する時間」は、多くの高速なディスクに対して同時にI/Oを発行することで短くなります。
「ストレージからデータベースへのデータ転送時間」は、ディスクI/Oと同等以上にネットワーク帯域を拡張することで短くなります。
大規模データ処理を行うデータベースにおいては、I/O時間の短縮が肝になります。そのため、ハードウェアレベルの増強は必須と言えます。
Oracle Exadata Database Machine X3-2(以降、Exadata)では、I/O性能を向上させるために、以下のようにしてハードウェアの最適化が図られています。
「ストレージがデータを取得する時間」の短縮
Exadata内には、12本のディスクと高速なFlash Diskを搭載したストレージサーバが複数台(Full Rackモデルの場合は14台)含まれています。
Exadataでは、ストレージ管理機能として採用しているASM(Automatic Storage Management)により、すべてのDiskにまたがってI/Oを発行します。これにより、全ディスクのI/O性能を最大限活用し、GB/sから数10GB/sレベルの広I/O帯域を実現しています。
また、このようにデータを分散配置することにより、特定のディスクに対するアクセスの競合も発生しづらくなっています。
「ストレージからデータベースへのデータ転送時間」の短縮
ExadataのDBサーバとストレージサーバは、4GB/sの実効帯域を持つInfiniBandネットワークで接続されています。そのため、GB/sクラスのI/O帯域をそのままデータベースに提供することができます。
I/Oを劇的に減らす「Exadata Smart Scan」と「Exadata Storage Index」
I/Oの削減は、必要なデータのみをストレージに読み込ませ、DBサーバに返すことで実現します。
というと、当たり前のことのように思えるかもしれません。しかし、前回紹介したように、フルスキャンのSQLでは、どのような絞り込み条件が指定されていても、Oracle Databaseはすべての表データを取得するようストレージに要求してしまいます。データのフィルタリングは、DBサーバ側で実施しなければなりません。
数件のデータのみを取得するSQLでは、索引によって必要なデータのみをピンポイントで取得すればI/O量を削減できます。しかし、フルスキャンがおもになる大規模データ処理の場合は、いかにスキャン対象データを絞りこめるかが重要になるのです。
このフルスキャンの対象データを絞り込める手段として、Oracle Databaseには「パーティション」という機能があります。これは、表を複数の論理的なセグメント(パーティション)に分割し、SQLの絞り込み条件を満たすパーティションのみをストレージに要求することでI/O量を削減できるという機能です。
Exadataには、このパーティション機能に加え、I/Oを劇的に減らす以下の2つの機能があります。
Exadata Smart Scan
Exadata Smart Scan(Smart Scan)は、SQLの絞り込み条件や列リストをストレージサーバが認識し、必要なデータのみをDBサーバに返す機能です。
これにより、DBサーバ―ストレージ間のデータ転送時間と、DBサーバでのフィルタリング時間を短縮することができます。
Exadata Storage Index
Exadata Storage Index(Storage Index)は、ストレージサーバ上で透過的に作成される索引により、SQLの絞り込み条件を満たすデータのみをストレージがスキャンするようにする機能です。
このStorage Indexが使用されると、読み込み範囲が限定されるため、ストレージ側でI/Oを大幅に削減する効果があります。
パーティションと異なり、この2機能についてはストレージ側で透過的に実施されるため、追加設計が不要であることも大きなメリットです。
これらは、ストレージサーバ上で動作するExadata Storage Server Softwareによって実現されています。
Exadataの公開事例(PDF)では、「100倍高速化」などの圧倒的な速度が実現されたケースが紹介されています。そのような成果を実現できたのは、このようにハードウェア/ソフトウェアの両面から、大規模データ処理において最大のボトルネックとなるI/Oを高速化しているためです。
通常のOracle Databaseでも使える3つのI/O時間短縮機能とは
ちなみに、ASMやパーティションと同様に、Exadataでなくとも使用できるI/O時間短縮機能があります。おもなものは下記のとおりです。
- NOLOGGING実行
- ⇒REDO生成量を抑制し、更新処理を高速化する
- スマートフラッシュキャッシュ
- ⇒Exadataと同様に、Flash Diskを利用しI/Oを高速化させる
- パラレル実行
- ⇒単一のSQLを複数プロセスで分割処理し、単位時間あたりのI/O発行量を増やす
ここまで紹介してきたとおり、大規模データ処理を行うデータベースでは、ハードウェアとソフトウェア双方の観点から、I/Oボトルネックが発生しづらい構成をあらかじめ設計段階で考慮しておくことが重要になります。
次回からは、大規模データ処理におけるCPUボトルネックの発生要因と、その改善策について紹介していきます。