2012年2月20日月曜日

フラッシュメモリのストライピングは善か悪か?

SSDなど、フラッシュメモリを用いたストレージデバイスは非常に高速です。このようなデバイスをストライピングするとさらに上を目指せる、、、ように感じられますが、実はストライピングで常にアプリケーションの性能が上がるわけではありません。


デバイス単体、2台ストライプのレイテンシ特性

以下のグラフは、フラッシュメモリデバイスへのランダム4KB書き込み時のレイテンシ分布(ドライブ単体および2台をストライプ)を示したものです。

グラフ1



左側がいちばんレイテンシが低い状態、右にいけばいくほどレンテンシが増えていった状態を示していおり、線が左に寄っているのは、すなわち高速に応答していることを示しています。

デバイス単体の場合(赤)、レイテンシ分布は非常に高速な状態(1)に偏っており良好な状態です。ストライプした場合(青)、先と比べると(2)の値が高くなっていて、つまりレイテンシが大きくなっていると言うことになります。この状態であれば間違いなく赤、つまりデバイス単体の性能のほうが応答が早いことになります。

この結果ですが、すこし条件を変えて測定してみると —— 以下のようになります。

グラフ2



このグラフでは、ストライプ構成(青)のほうがデバイス単体(赤)よりよいレイテンシ性能を示しています。

条件の違いは?

この先の2つのグラフ、一体何を変えたと思いますか?  答えはI/Oスレッド数です。

グラフ1 …… 1スレッド
グラフ2 …… 64スレッド

つまりグラフ1の場合よりグラフ2の場合のほうが大きなワークロードがかかっています。つまりワークロード次第でレイテンシ分布は変化します。

さて。
デバイス単体で使ったほうがお得でしょうか?
それとも、ストライピングしておいたほうがお得でしょうか?

ヒント

  • 複数デバイスにストライプすると、各デバイスからの応答を待ち合わせる必要があるため、レイテンシが幾らか悪化する。

  • 転送するデータのサイズに比例して、フラッシュメモリのレイテンシは変化する。

2012年2月19日日曜日

フラッシュメモリデバイスのレイテンシ差がアプリケーションに与える影響

たまにはブログを書こうかと。今日はこのブログではじめてフラッシュメモリの話題を扱うことにしましょう。


個人的に大好きなプレゼンテーションがあります。タイトルは Mythbusting Flash Performance 、元Sun(現Oracle)の Solaris プラットフォーム エンジニアリングのバイスプレジデント Bill Neshim 氏が Flash Memory Summit 2011 のキーノートとして講演した際のスライドのようです。


このプレゼンテーションには衝撃的なグラフが入っていて、これを見たとき衝撃を受けました。それ以来このプレゼンテーションはお気に入りとして常にマシンの中に入っています:)


予期可能なレイテンシ性能のフラッシュメモリデバイス、そうでないフラッシュメモリデバイス

フラッシュメモリデバイスは、使用されているNANDフラッシュメモリのパッケージごとの性能もありますが、それを管理・制御するコントローラにより、最終的なデバイスの仕上がりが大きく変わることが知られています。

フラッシュメモリデバイスの性能は IOPS (単位時間あたりのIO回数)と帯域幅で語られがちですが、さらにレイテンシという軸で探ってみると、デバイスの本当の性能がよく見えてきます。

IOPSの比較

以下は、先のプレゼンテーションからの引用です。具体的なデバイスの機種名は明かされていませんが、2つのフラッシュメモリデバイスのIOPS性能を比較しています。

Device A


Screen_shot_20120219_at_13550_2



Device B


Screen_shot_20120219_at_13555_2


このふたつの違いは明白です。前者は書き込みスレッド数により IOPS 性能が決まってくる、つまり性能が予期できることがわかります。後者は、もちろんスレッド数が少ない方がIOPS数が多いもののおよそランダムな状態です。これが、性能が予期できないフラッシュメモリデバイスの特性です。

レイテンシの比較

続いて、次のスライドは2つのデバイスのレイテンシ性能を比較しています。



Screen_shot_20120219_at_13611_2



縦軸は頻度、横軸はIO時に発生したレイテンシの大きさです。つまりグラフが左側に寄っていればそれだけ応答が速いデバイスである、と見ることができます。


このグラフで登場している2つのデバイスは、実際に Oracle の本番環境で利用されており、非常にレイテンシ特性が似ています。しかし、 OLTP ワークロードをかけた際のグラフを見ると、 Dev1 はレイテンシが大きくなる頻度が Dev2 より大きい —— つまり、実際のアプリケーション負荷をかけるとレイテンシがより悪化するデバイスである、ということです。

これについて Bill 氏は「I/Oのうち最も遅い 1% がデバイスの性能を決める。しかし、多くのデバイスベンダはこの部分の軽く見がちだ」と述べています。

どうして氏が 1% に拘るのか……それは次のスライドに答えがあります。



Screen_shot_20120219_at_13613_2



このスライドは、さきほどの「最も遅い1%」が データベースの OLTP に性能にどのような影響をもたらすかを示しています。縦軸はデバイスのレスポンスタイムタイム、横軸は時間です。このグラフでは、 Dev 2 が非常に安定したレスポンスタイムで応答しているのに対し Dev 1 のレスポンスタイムは明らかにムラがあります。


Dev 2 を使ったデータベースでは一定の間隔で応答してきますが、 Dev 1 は、まるで混雑した道路で渋滞にハマっているかのように動いたり止まったり……を繰り返しているのです。この結果、データベースの実行速度には大きな差が現れるのです。

まとめ

フラッシュメモリデバイスの性能は IOPS (単位時間あたりのIO回数)と帯域幅で語られがちです。しかし、それだけでなく、レイテンシが安定しているか、という観点での評価もとても重要です。それも一定時間の平均値ではなく、レスポンスタイムの分布まで含めてはじめて、アプリケーション性能への影響がわかります。


p.s. @yoshikaw さんにエントリ中のバグをご指摘いただき修正しました。ありがとうございます!