IOPSとは何か?
IOPS=I/O per Second
つまり、1IOの速度のこと。
ではIOとは何か?
IO=I/O=input/output
入出力のこと。
ディスク周りの話しなので、ディスクに対し入力もしくは出力した際の1回のディスクアクセスのとこになる。
1IOのサイズは?
使用しているファイルシステムによって異なりますが、一般的にI/Oとはユーザー(もしくはプログラム)が要求したサイズが1IOになります。つまり固定ではなく可変サイズです。
ストレージメーカーEMCで登場するストレージシステムのIO測定ソフト(Navisphere Analyzer)の場合、ストレージシステムのCPUを通過するIOをカウントしているということなので、こちらもほぼOSと同じユーザーが要求したサイズが1IOになります。
クラスタサイズとは?(アロケーションユニットサイズとは)?
windows OS上からディスクに1回のアクセスする最小サイズ単位は、クラスタサイズ(アロケーションユニットサイズ)と呼ばれるサイズ。
ファイルシステム(NTFSやFAT)が管理している最小単位のディスクサイズ(ブロックサイズ)になる。
Windows で使用されるすべてのファイル システムでは、クラスター (アロケーション ユニット) サイズに基づいてハード ディスクが構成されています。クラスターとは、ファイルを保持するために割り当てることのできるディスク領域の最小単位です。このため、ファイル サイズが、クラスター サイズの倍数とは異なる場合、ファイルの格納に冗長部分が生じます (クラスター サイズの倍数との差分が冗長部分となります)。通常のパーティションでは、これにより、平均 (クラスター サイズ)/2 * (ファイル数) に相当する領域が失われます。
通常ファイルシステム上では4KBというサイズという認識が最も多い。
(ディスクデフラグツールで「分析」を行うと、「クラスタサイズ」が表示される。)
OSからのディスクへの1IOは4KB以下のサイズのファイルに1アクセスしたことを言う。
OSから見ると考えIOサイズの最小値がクラスタサイズ(アロケーションユニットサイズ)であるといえます。
ランダムなIOサイズを想定すると、
クラスタサイズ(アロケーションユニットサイズ)が小さければ、容量節約できる。
クラスタサイズ(アロケーションユニットサイズ)が大きいほうが、ディスクパフォーマンスは良い。
チャンクサイズとは?(ストライプサイズとは?)
一般的なサーバーの場合、RAIDアレイを組んでいる。
この場合、OSのファイルシステムというディスク管理の下にさらにRAIDというディスク管理が発生する。
このRAIDアレイが管理している最小単位のディスクサイズ(ブロックサイズ)はチャンクサイズ(CHUNK SIZE)もしくはストライプサイズと呼ばれる。
RAID 0 アレイは複数のディスクドライブから構成されます。各ドライブの平均的な記憶容量はチャンクに分割され、これが複合されたドライブの本来のブロックサイズを表示します。アレイに書き込まれたデータはチャンク毎にアレイ内の各ドライブに書き込まれます。
標準的な場合、64KBを採用している。
RAIDコントローラ(ストレージコントローラ)からディスクへの1IOは、64KBのサイズで1アクセスしたことを言う。
特定IOサイズを想定したときに、ストライプサイズが純粋なディスク性能を決定する。
ランダムなIOサイズを想定すると
チャンクサイズ(ストライプサイズ)は小さいと、IOPSは大きい。小さいIOサイズに対しては早いが大きいIOサイズに対しては遅い
チャンクサイズ(ストライプサイズ)は大きいと、IOPSは小さい。小さいIOサイズに対しては遅いが大きいIOサイズに対しては早い
IOサイズに対するチューニング
つまり、ユーザーからのIO、OS上からのIO、ストレージシステム上(たとえばRAIDコントローラ)でのIOは意味が異なるのです。
一般的にディスクに対してのIOと言っているのはユーザー(もしくはプログラム)からの要求サイズになります。
しかし、その1IO(サイズ)に対し、さまざまなレイヤーでの処理があることがお分かり頂けたかと思います(OS、RAIDコントローラ等)。
その処理のために、ユーザー要求IOサイズによりディスクパフォーマンスは異なりまし、クラスタサイズ・ストライプサイズによりディスクパフォーマンスは変わってきます。
ユーザー(もしくはプログラム)からのIOが、ファイルシステムでのクラスタサイズ単位による管理やRAIDアレイによるストライプ幅サイズ単位による管理によるオーバーヘッドで、IOpsや転送速度(MB/s)のパフォーマンス性能が異なるのです。
逆に言うと、物理的なディスク構成が決定した後も
- ファイルシステムのクラスタサイズ(アロケーションユニットサイズ)
- RAIDアレイのストライプサイズ
のチューニングよってディスクパフォーマンス性能は変わるということです。
ブロックサイズとは?
固定長のサイズでのIOアクセスする場合、その最小単位のサイズをブロックサイズと呼びます(汎用的な用語)
Linuxでいう、ブロックデバイス(ある特定のサイズ単位で入出力するデバイス)・キャラクタデバイス(文字単位で入出力するデバイス)の意味合いからよくブロックサイズという言葉が使われます。
概念としてのIOPS
概念を考えるために、簡単な環境を想定する。
RAIDアレイ構成は使用せず、OSが一つのディスクを操作する場合。
この場合、ディスクを管理しているのはOSのファイルシステムのみなので
OSからのIOPS=純粋にディスクのIOPS
といえる。
IOPSは、ディスクが1秒当たりに処理できるI/Oアクセスの数である。
1回のI/O処理にかかる時間は、平均アクセス時間とデータ転送時間を足した数値。
このI/O処理が1秒当たり何回実行できるかがIOPSである。
IOPS=1/(平均アクセス時間+データ転送時間)
平均アクセス時間=平均ディスク回転待ち時間+平均シーク時間
データ転送時間には、ディスクから磁気ヘッドがデータを読み書きする平均メディア転送速度やインタフェースの転送速度、ドライブの信号処理とデータ転送を制御するCPUの処理時間などが加味される。
正確なデータ転送時間は分からない。
ただし、4Kバイトなど、OSの読み書き単位程度の大きさであれば、数10マイクロ秒から長くても1ミリ秒程度であり、誤差の範囲である。
仮に、4Kバイトのデータを書き込むために必要なデータ転送時間を1ミリ秒とする。
平均アクセス時間6ミリ秒のディスクにデータを4Kバイト単位で書き込むとする。
このディスクのIOPSは、「1/(6ミリ秒+1ミリ秒)=142IOPS」となる。つまり、4Kバイトのデータを毎秒142回書き込めるディスクということになる。
またこの場合、スループットの計算も出来る。
1IOは4KBなので
4(KB)×142(IO/S)=568KB/s
と単純計算できる。読み書き共に同じ値となる。
しかし、実際はRAID構成やキャッシュ効果等の影響も考慮しなければならないので計算は難しいし環境・テスト方法にも依存する。
ストレージは、ストレージ搭載メモリ(RAIDコントローラもメモリを搭載しているNRAM)やディスク単体でディスク・キャッシュも搭載している。
ファイルシステムを管理しているOSにもメモリがあり、キャッシュを搭載している。
ファイル・サーバーやDBサーバーなどデータがディスク上に分散する場合は、ディスク・キャッシュが性能向上に役立つ。
キャッシュ容量が大きければキャッシュのヒット率も上がるため、読み出し性能の大幅な改善を見込める。
重要なのは、純粋なディスクのIOPSではなく、ストレージもしくはシステム環境としてのストレージの性能になる。
IOPSが高ければ高いほど、高性能なディスクと言える。
しかし、IOPSは指標値となる値がわからないので評価が出来ない・・・。
相対評価的になってしまう。IOPSでストレージボトルネックを検出するのは難しい。
しかし、ランダムなアクセスでない場合(シーケンシャルIO)は1620iops以上出るし、IOブロックサイズによっては1620iopsより低い値になる可能性もある。
ホスト・ファイル・システムの影響
ホスト・レベルでは、ファイル・システムはI/O リクエストの最小および最大サイズを決定することにより、アプリケーションI/O 特性にも影響します。
最小I/O サイズ:ファイル・システムのリクエスト・サイズ
ファイル・システムは4 KB、8 KB、64 KB など、最小エクステント・サイズに構成できます。
これはアレイに与えられる最小のリクエスト・サイズで、それ以上分割できません。エクステント・サイズよりも小さいサイズでI/O を実行するアプリケーションでは、不要なデータ移動や読み取り-変更-書き込みアクティビティが発生する場合があります。
最適な設定には、アプリケーションおよびファイル・システムのドキュメントを参照してください。
ファイル・システムによってリクエスト・サイズが制限されないRaw パーティションにはこの制約はありません。
最大I/O サイズ
大量のデータを迅速に移動することが目的の場合、大きいI/O サイズ(64 KB 以上)が役立ちます。
アレイでは、キャッシュ内のシーケンシャル・ライトをRAID グループのフル・ストライプに効率よく結合できるだけではなく、大量のシーケンシャル・リードの事前読み取りも効果的に行うことができます。
さらに、大きいI/O サイズは、ストライプ・トポロジーに従って小さいサイズに分割されるので、ホスト・ベースのストライプから満足できる帯域幅を取得するうえで重要です。
ファイル・システムのフラグメンテーション
フラグメント化したファイル・システムでは、シーケンシャルI/O の機会が減少されるため、全体のスループットが低下します。
フラグメンテーションを避け、ファイル・システムのデフラグメンテーションを定期的に実行してください。
NTFS ファイル・システムがデフォルトのエクステント・サイズ以外の任意のサイズでフォーマットされている場合、ほとんどのツールはそれらのファイル・システムをデフラグメンテーションできません。API でデフラグメンテーションが許可されないためです。
ファイル・レベルのコピーの実行(別のLUN へコピー、またはファイル・システムのバックアップおよびリストアの実行)は、デフラグメンテーションへの効果的なアプローチです。