クラウドでサーバーのディスクストレージを選択する時、どのように選択するべきか基準がわからない人が多いのではないだろうか。データ基盤のボトルネックの多くはストレージのIOで発生する。ストレージのIOの仕組みを理解し、適切にサイジングできるようになることは重要なスキルである。
本記事ではストレージのサイジング方法について記載する。並列IO、ディスクキャッシュ、非同期IO等いろいろなパターンを考慮すると複雑になり基本の理解が難しくなる。基本にフォーカスし複雑なパターンは別の記事で記載する。
主にファイルIOかデータベースIOの負荷を考慮してストレージをサイジングするが、データベースIOもデータベースファイルに対するIOなのでファイルIOについて説明する。また、SSDが主流なのでSSDを前提に記載する。
IOにはシーケンシャルIOとランダムIOの2種類がある。まずは、ランダムIOのサイジング方法を考える。
ランダムIO
例:データベースのインデックスアクセス
以下のようにファイルを最小単位(ブロックサイズ)でアクセスする。ブロックサイズは4KB〜32MB程度であることが多い。100バイトの1行取得する場合でも数KB〜数MBを読み取ることになる。1台のSSDでは1回のIOには0.001msec程度を要する。
よって以下を満たすようにディスクを並列化するようにサイジングする。
対象処理の目標処理時間 < 0.001msec × 対象処理のレコード件数 ÷ ディスク本数
重要:IO回数はレコード件数と等しくなる。(インデックスファイルのIOも発生するがここでは考えない)
シーケンシャルIO
例:データベースのフルスキャン
以下のようにファイルを読み込みのスタート地点から終了地点まで端から順番にアクセスする。
以下を満すようにディスクを並列化する。
対象の処理時間 < 読み込むデータサイズ÷ SSDのチャンクサイズ ×0.001msec ÷ ディスク本数
※チャンクサイズ:SSDが1回のIOで読み込む最大サイズ
重要:IO回数は読み込むデータサイズ÷SSDのチャンクサイズとなる
IO回数と処理時間
ファイルサイズ100GB、レコード件数1億件、SSDチャンクサイズ512KB、ディスク1台の場合で全レコードを読み込む場合の処理時間は以下のようになる。
- ランダムIO:1億×0.001msec → 約30時間
- シーケンシャルIO:100GB÷512KB×0.001msec → 約3分
SSDの場合、HDDと比べてシーケンシャルIOとランダムIOの差が少ないと言われている。これはHDDの場合はランダムIOではディスク装置でシークが発生するためである。SSDの場合は構造上シークがないためシーケンシャルIOとランダムIOの差がIO回数の差のみに依存する。
以下参照
サイジング:HDD vs SSD