ストレージの基本。RAIDとread/write io
ハードディスクドライブの性能の考え方
一般的にHDDの性能は以下のポイントで評価される。
•スループット 秒間のデータ転送速度(MB/s)
•IOPS 秒間のI/O数
•応答時間 I/O要求を受けてから応えるまでに要する時間(ms)
ここで、データアクセスに要する平均時間と、ディスクが対応可能な秒間I/O数(IOPS)は下記の式によって算出することができる。
応答時間 = 平均シークタイム + 平均回転待ち時間 + データ転送時間
IOPS = 1 / 応答時間
平均シークタイム 磁気ヘッドが目的のセクタのあるトラックまで平行移動し、位置決めを完了 するまでの時間の平均値
平均回転待ち時間 回転待ち時間は位置決め完了後トラック上のセクタがヘッド位置に来るまで の時間、平均回転待ち時間はディスクが半回転する時間を表す
データ転送時間 データ量を内部データ転送速度で除した数値
また、HDDは内部にデータを一時的に蓄えるバッファやI/O順序を制御し、効率的にデータアクセスするロジックを組み込むことで性能向上を図っている。
■Read I/O
サーバのデータ読み取り要求(Read I/O)を受け取ったストレージは、まずキャッシュ内のデータを確認する。該当するデータがキャッシュ内に見つかった場合(Read Hit)、即時にサーバへデータを送信し処理を完了する。データが見つからない場合(Read Miss)は、HDDからデータの読み取りが必要となる。そして、データをサーバに送信する際、キャッシュにデータを配置する。これはキャッシュ内に参照頻度の高いデータを多く確保することで、後続するRead I/Oのパフォーマンス向上を狙っている。さらに以下のような工夫により、容量に限りのあるキャッシュを有効に利用する。
LRU(Least Recently Used)アルゴリズム
キャッシュ容量の上限に達した場合、参照頻度の低いデータから消去し、参照頻度の高いデータを多く確保する(実装はLRUではなく擬似的なLRU)。
プリフェッチ
ブロックアドレス(セクタアドレス)の連続するデータ要求(シーケンシャルRead I/O)に対し、サーバのRead I/O前にキャッシュ上にデータを配置することで読み取りパフォーマンスの高速化を図る。
プリフェッチは、シーケンシャルなアクセスに対して効果を発揮する。しかし、HDDの広い範囲を対象としたランダムなアクセスではその効果を期待することはできない。
■Write I/O
データ書き込み要求(Write I/O)における処理は、キャッシュの空きや書き込むデータサイズによって異なる。
キャッシュの空きがある場合
キャッシュに書き込んだ時点でI/Oを完了(Write Hit)
キャッシュの空きがない場合
ディステージ待機(Write Miss)
そして、ストレージはキャッシュの空き容量を確保するため、次のタイミングでデータのディステージを実施する。
•コントローラのアイドル時間
•事前に設定したWriteキャッシュ容量の閾値に達した時点
またサイズの大きなWrite I/Oにおいて、キャッシュ制御のオーバーヘッドによるスループット低下を防ぐため、直接HDDに書き込む機能(Write Through)を持つストレージもある。
連続した読み込みや小サイズデータの書き込みなどキャッシュを利用するI/Oは、ある程度の容量のキャッシュ搭載が効果的に機能する。しかし、ランダムな読み取りやキャッシュを介さない書き込み、長時間連続する書き込みなどのパフォーマンスは、結局次に説明するキャッシュ ― HDD間の性能に依存することになる。
キャッシュ ― HDD間の性能改善の工夫
サーバ ― キャッシュ間に加えてキャッシュ ― HDD間にもストレージ性能向上の工夫が施されている。キャッシュ ― HDD間のデータ処理は、Read I/Oでは主にRAID技術による工夫のみとなるが、Write I/Oはフルストライプ書き込み(後述)などキャッシュとの組み合わせで性能改善に貢献する。
■Read I/O
HDDからのデータ読み出しパフォーマンスは、基本的に“ストレージ性能の基礎”の考え方が適用される。従って、高回転のHDDを採用することで単体性能の向上を図ると同時に、複数のHDDをRAID構成することで多数の(多重度の高い)I/Oに対応する。ランダムI/Oの場合、基本的にHDDの本数に比例して対応可能なIOPSが増加するが、I/Oあたりのレスポンスタイムは変わらない。また、シーケンシャルI/Oの場合は連続したデータを読み出す動作となるため、HDD本数はランダムI/Oほど性能に寄与しない。
■Write I/O
Write I/OはRead I/Oと異なり、RAID構成(RAIDレベル)の違いが、書き込みパフォーマンスに大きく影響する。
RAID 1/0系
データを複数のHDDへ分散して書き込む際、パリティ計算や既存データ読み込み(更新時)などオーバーヘッドが生じないため高いパフォーマンスを持つ。そのため、RAIDグループ当たりのHDD本数がそのまま対応可能 なI/O数に比例する。
RAID 5/6系
データを複数のHDDへ分散して書き込む際、パリティ計算や既存データ読み込み(更新時)などオーバーヘッドは避けられない。しかし、キャッシュ上のシーケンシャルI/Oや大きなデータサイズのI/Oでは、フルストライプ書き込みを併用することでオーバーヘッドを軽減することができる。
※補足 フルストライプ書き込み
RAID 5/6系では、ストライプサイズを満たす書き込みは、構成するディスクに対してシーケンシャルな書き込みとなるため、HDDの性能を最大限発揮することができる
基本的にはRead I/O,Write I/OともにHDD本数が多いほど性能面で有利となる。ここでサーバのI/Oのパターン(シーケンシャル,ランダム)に対して応答時間、IOPSなど性能を向上させる対策を下の表にまとめた。
I/Oパターン |
アプリケーション例 | 対策 | 備考 | |
シーケンシャル | Read | 動画ストリーミング、ディスクバックアップ、データベース(意思決定支援システム)など | HDD I/F帯域の確保、バックエンドポートの帯域確保 |
SATAディスクの利用も可 |
Write | HDD I/F帯域の確保、バックエンドポートの帯域確保 | SATAディスクの利用も可 | ||
ランダム | Read | メールサーバ、ファイルサーバ、データベース(OLTP)など | 多数のHDDの採用、高回転ディスクの採用、RAID 1+0系の採用 | 多重度の高いI/Oには、高回転ディスクよりもディスク本数を増やしたほうが効果的 |
Write | 大容量キャッシュの採用、多数のHDDの採用、高回転ディスクの採用、RAID 1+0系の採用 | 多重度の高いI/Oには、高回転ディスクよりもディスク本数を増やしたほうが効果的 |