前回は、仮想マシンで構築したRook Cephから払い出したPersistentVolumeについてfioを使ってパフォーマンスのベンチマークを取ってみました。その際に比較のために仮想マシンのベンチマークを取ってみました。今回は、仮想マシンの状態の比較として、ストレージポリシーによるIOPS制限をかけた場合の仮想マシンの挙動を確認してみます。
構成
- vCenter 7.0 U3
- ESXi 7.0 Update 3
- Ubuntu 22.04 (テンプレートVM)
- open-vm-tools 11.3.5
- cloud-init 22.2
ストレージポリシーについて
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より小さい値になったと考えられます。