hidemium's blog

日々学んだことをアウトプットする。

ストレージポリシーによるIOPS制限をした仮想マシンのfioによるベンチマーク

前回は、仮想マシンで構築したRook Cephから払い出したPersistentVolumeについてfioを使ってパフォーマンスのベンチマークを取ってみました。その際に比較のために仮想マシンベンチマークを取ってみました。今回は、仮想マシンの状態の比較として、ストレージポリシーによるIOPS制限をかけた場合の仮想マシンの挙動を確認してみます。

hidemium.hatenablog.com

構成

  • vCenter 7.0 U3
  • ESXi 7.0 Update 3
  • Ubuntu 22.04 (テンプレートVM)

ストレージポリシーについて

vSphereの機能のなかで、Storage Policy Based Management (SPBM)というストレージレイヤーを抽象化する機能があります。

SPBMには、 Storage I/O ControlのSIOC v1とSIOC v2が存在します。

SIOC v1は、ストレージ I/Oのレイテンシを監視し、I/Oが競合した場合に、仮想マシンの共有値に基づいて、データストア全体のディスクスケジューラを使用して、I/Oを調整します。

SIOC v2は、vSphere 6.5から導入され、基盤となるストレージに関係なく、仮想マシンのI/O パスに直接アクセスできる vSphere APIs for I/O Filtering (VAIO)を使用して仮想マシン単位で制御を行うことができます。

ストレージポリシーでホスト ベースのサービスを指定することで、SIOC v2を利用することができ、IOPSの制限と予約と共有を行うことができます。

ストレージポリシーによるSIOC v2の設定

ストレージポリシーによって仮想マシンにIOPS制限をかけてみます。

タグを作成します。

タグのカテゴリに Storage Disk Type をつけ、データストアとデータストアクラスタにチェックをいれます。

Storage Disk Type カテゴリ配下に、 NVMe というタグを作成します。

データストアのインベントリに移動し、ストレージポリシーを適用したいデータストアのタグに NVMe を付与します。

ポリシーおよびプロファイル>ストレージ ポリシー コンポーネントにて、作成をクリックします。

名前に Normal-IOPS-limit などの名前を入れます。

IOPS の制限に3000、IOPS の予約に1、IOPS のシェア数に1000の値を入れ、保存します。

ポリシーおよびプロファイル>仮想マシン ストレージ ポリシーにて、作成をクリックします。

名前に Normal-Storage-Policy などの名前を入れます。

ホスト ベースのサービスでホスト ベースのルールの有効化にチェックを入れ、データストア固有のルールにタグ ベースの配置ルールを有効化にチェックを入れます。

ホスト ベースのサービスで、ストレージ ポリシー コンポーネントの使用で先ほど作成した Normal-IOPS-limit をします。

タグ ベースの配置で、タグ カテゴリに Storage Disk Type 、タグに NVMe を指定して、保存します。

仮想マシンへのストレージポリシーの適用

ストレージポリシーの作成ができたため、仮想マシンにストレージポリシーを適用します。

前回作成したUbutuの仮想マシン仮想マシン ストレージ ポリシーの編集から Normal-Storage-Policy を選択し、保存します。

fioによるパフォーマンスのベンチマーク

前回と同様、複数のブロックサイズと複数のI/Oパターンのタイプで測定するため、以下のようなコマンドで実行してみました。128kのブロックサイズを追加しています。

direct=1でnon-buffered I/Oを利用し、iodepth=32でキュー中に待機させるIOリクエストの最大数を32に指定、ioengine=libaioでIOを発生させる方法としてLinux ネイティブの非同期 I/Oを指定、numjobs=8でスレッド数を8に指定、group_reportingで複数スレッドの結果をまとめてレポート、output-format=jsonで計測結果をjson形式で出力という設定を行っています。

# for BS in 4k 8k 16k 64k 128k 1m; do
  for RW in write randwrite read randread; do
    fio -filename=/mnt/rook-vol1/test -direct=1 -iodepth=32 -rw=$RW -ioengine=libaio -bs=$BS -size=1G -numjobs=8 -runtime=30 -name=32-$RW-$BS --group_reporting --output-format=json | \
    jq -cr '[."global options".iodepth,."global options".bs, ."global options".rw, 
            .jobs[0].read.iops, .jobs[0].write.iops, 
            .jobs[0].read.bw, .jobs[0].write.bw]|@csv'
  done
done

こちらが、ストレージポリシーで3000IOPSの制限をかけたUbuntu仮想マシンで測定したfioのパフォーマンスのベンチマーク結果です。

前回の結果も載せておきます。

ブロックサイズが64kまではきれいに3000IOPSで制限されることが分かります。

帯域の制限は、IO数に32KBを加重することで計算されます。今回は3000IOPSのため、3000x32KB=93.75MB/秒の帯域幅の IOPS 制限が設定されます。

以前はIOPSを制限する際に32KBで正規化されていましたが、vSphere6.5以降は正規化されず、ブロックサイズに関係なくIOPSの値で制限されるようになっています。

そのため、ブロックサイズが128kでは、帯域の制限が先にあたり、IOPSが3000より小さい値になったと考えられます。

参考