Proxmox VE 6.1でCephベンチマーク用VMを作成する

Proxmox VE 6.1でCephベンチマーク用VMを作成する記録

最初に

前記事までの作業でProxmox VE 6.1でCephが利用できるようになったので
ベンチマーク作業を進めていこうと思いますが
そのベンチマーク用のVMを作成しないといけないので
ついでにProxmoxにVMを作成する流れを紹介します

Cephベンチマーク用に特殊な設定を紹介しているわけではないので
誤解のないようお願いします

今回はCeph/RBDのプールにVMを作成してますので
所々でCephに関係する記述もあるものの
ほとんどCephに限定されるような内容ではないので
どのストレージタイプを使っていても
Proxmox VE 6.1であればほぼ同じだと思います

ベンチマーク用のVMはCentOS7とWindows10の2VMで
3ノードあるうちのpve01にCentOS7をpve02にWindows10のVMを作成することにしました

CentOS7のVM作成

pve01ノードにCentOS7のVMを作成していきます

ISOをアップロード

VMを作成する為には当然ISOイメージが必要になるのでまずアップロードしていきます
今回使用したISOはCentOS7はCentOS-7-x86_64-Minimal-1908.iso

前記事でも記載した通りCeph/RBDはISOイメージをアップロードできませんので
今回はProxmoxインストール先のSSDにアップロードすることにしました

テスト環境なのでとりあえずローカルストレージで対応しましたが
運用を始める場合はISO対応ファイルベースの共有ストレージを用意した方が便利です

WEBGUIのpve01にあるlocalを選択し内容画面へ移動します
まだ何もアップロードされていないので何も表示されてなくてOKです
上部にある「アップロード」ボタンからファイルをアップロードできます

アップロード画面はシンプルでファイルタイプとファイルを参照選択するのみ
ファイルタイプは今回のストレージではISOイメージかコンテナテンプレートが選択可能
どのファイルに対応できるかはストレージタイプや許可設定で変化します
今回はISOイメージを選択してクライアントPCからCentOS7のISOを選択しました

アップロードボタンを選択するとすぐにアップロードが開始されます

アップロード完了すると先ほどのストレージ内容画面に反映されます
普通のファイルリストではなくファイルタイプでまとめられているのがわかります

VMを作成

WEBGUIの左上にある「VMを作成」ボタンを選択します
ちなみにCTはコンテナです

仮想マシン作成画面が出てくるので設定していきます
全般タブでは主にVMを動かすノードとVM名の設定です
VM IDは自動で割り当てられるので問題なければ触らなくてもいいです
今回はとりあえずVM名をCentOS7に設定して「次へ」ボタンを選択

OSタブではゲストOSの種類とISOを選択します
CentOS7の場合はKernelバージョンが「5.x-2.6 Kernel」に該当するのでこれでOK
ISOはプルダウンで先ほどアップロードしたファイルを選択します

システムタブはGPUとBIOSの設定ですが今回は変更なし
QemuエージェントはESXiでいうVMware Toolsに該当する機能で
Qemuエージェントをインストールする予定であればチェック入れます
(今回は後で説明する為にあえてチェックなしで作成しました)

ハードディスクタブでは重要なストレージの保存先や容量を設定します
ストレージで指定した部分にVMデータが保管されます(今回はCeph/RBDのPool01)
ディスクサイズがVM内のストレージ容量になります
コントローラはKVMなのでVirtIO SCSIが推奨

キャッシュのプルダウンはこんな感じです

今回はベンチマーク用なので既定値のままにしてますが
これらはProxmoxだけでなくKVM全般の話になるので
もしキャッシュを使いたい場合はメリットデメリットを検索で確認ください
「キャッシュがありません」はKVM的にはnoneという表記になります

CPUタブは普通はコア設定ぐらいでしょうか
目的のアプリ等でCPUが制限されている場合は種別でCPUをIntel製やAMD製にできます

メモリーに関しては容量に関する設定のみ
最小メモリ量がESXiでいうメモリ予約のような役割
Ballooningはメモリをオーバーコミットで使いたい人向けの自動割り当て機能で
ゲストOSがLinuxでは問題ないがWindowsの場合はパフォーマンスに影響が出やすいので
あまり使わない方がいいみたいなので使う場合は注意が必要

ネットワークもこのままで作成しました
モデルはVirtIOが推奨

最後に確認画面が表示されますので
「完了」ボタンを選択すればVMが作成されます

VMが作成された様子がこちら
上部にある「開始」ボタンでVMが起動できます

WEBGUI上のコンソール画面でちゃんと表示されました

CentOS7の場合は通常のインストール手順にてインストール作業は完了します

インストール作業後にISOをアンマウントする場合はVMのハードウェアメニューへ移動し
CD/DVDドライブ部分の右側をダブルクリックするか行ごと選択して「編集」ボタンを選択

「メディアを使用しない」を選択してOK

none表示になればOK

ベンチマーク用の設定

CentOS7をインストール後にyum updateを実行
ベンチマークソフトはfioを使用するのでyum install fioでインストール
インストールされたfioバージョンは3.7

使用したfio-cdmはこちらのスクリプト

Reproducing CrystalDiskMark tests with fio – further fixes for CentOS7 · GitHub
https://gist.github.com/BAGELreflex/c04e7a25d64e989cbd9376a9134b8f6d

現時点のソースも残しておきます

#!/bin/bash

# This script is based on https://unix.stackexchange.com/revisions/480191/9 .
# The following changes proved to be necessary to make it work on CentOS 7:
#  * removed disk info (model, size) - not very useful, might not work in many cases.
#  * using "bw" instead of "bw_bytes" to support fio version 3.1 (those availible through yum @base)
#  * escaping exclamation mark in sed command
#  * the ".fiomark.txt" is not auto-removed
#  * remove bw_bytes result for READ so that only 1 value in MB is returned
#  * split fio operation based on --size to prevent error with "fio: size too small, must not be less than minimum block size: 1024 < 524288"

LOOPS=5 #How many times to run each test
SIZE=1024 #Size of each test, multiples of 32 recommended for Q32 tests to give the most accurate results.
WRITEZERO=0 #Set whether to write zeroes or randoms to testfile (random is the default for both fio and crystaldiskmark); dd benchmarks typically only write zeroes which is why there can be a speed difference.

QSIZE=$(($SIZE / 32)) #Size of Q32Seq tests
SIZE+=m
QSIZE+=m

if [ -z $1 ]; then
    TARGET=$HOME
    echo "Defaulting to $TARGET for testing"
else
    TARGET="$1"
    echo "Testing in $TARGET"
fi



echo "Configuration: Size:$SIZE Loops:$LOOPS Write Only Zeroes:$WRITEZERO
Running Benchmark,  please wait...
"

fio --loops=$LOOPS --size=$SIZE --filename="$TARGET/.fiomark.tmp" --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
  --name=Bufread --loops=1 --bs=$SIZE --iodepth=1 --numjobs=1 --rw=readwrite \
  --name=Seqread --bs=$SIZE --iodepth=1 --numjobs=1 --rw=read \
  --name=Seqwrite --bs=$SIZE --iodepth=1 --numjobs=1 --rw=write \
  --name=SeqQ32T1read --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=read \
  --name=SeqQ32T1write --bs=$QSIZE --iodepth=32 --numjobs=1 --rw=write \
  > "$TARGET/.fiomark.txt"

fio --loops=$LOOPS --size=512k --filename="$TARGET/.fiomark-512k.tmp" --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
  --name=512kread --bs=512k --iodepth=1 --numjobs=1 --rw=read \
  --name=512kwrite --bs=512k --iodepth=1 --numjobs=1 --rw=write \
  > "$TARGET/.fiomark-512k.txt"

fio --loops=$LOOPS --size=4k --filename="$TARGET/.fiomark-4k.tmp" --stonewall --ioengine=libaio --direct=1 --zero_buffers=$WRITEZERO --output-format=json \
  --name=4kread --bs=4k --iodepth=1 --numjobs=1 --rw=randread \
  --name=4kwrite --bs=4k --iodepth=1 --numjobs=1 --rw=randwrite \
  --name=4kQ32T1read --bs=4k --iodepth=32 --numjobs=1 --rw=randread \
  --name=4kQ32T1write --bs=4k --iodepth=32 --numjobs=1 --rw=randwrite \
  --name=4kQ8T8read --bs=4k --iodepth=8 --numjobs=8 --rw=randread \
  --name=4kQ8T8write --bs=4k --iodepth=8 --numjobs=8 --rw=randwrite \
  > "$TARGET/.fiomark-4k.txt"

SEQR="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "Seqread"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "Seqread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQW="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "Seqwrite"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "Seqwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KR="$(($(cat "$TARGET/.fiomark-512k.txt" | grep -A15 '"name" : "512kread"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-512k.txt" | grep -A15 '"name" : "512kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
F12KW="$(($(cat "$TARGET/.fiomark-512k.txt" | grep -A80 '"name" : "512kwrite"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-512k.txt" | grep -A80 '"name" : "512kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32R="$(($(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A15 '"name" : "SeqQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
SEQ32W="$(($(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark.txt" | grep -A80 '"name" : "SeqQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKR="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kread"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kread"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FKW="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kwrite"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kwrite"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32R="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ32T1read"' | grep bw | grep -v '_' | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ32T1read"' | grep -m1 iops | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK32W="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ32T1write"' | grep bw | grep -v '_' | sed 2\!d | cut -d: -f2 | sed s:,::g)/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ32T1write"' | grep iops | sed '7!d' | cut -d: -f2 | cut -d. -f1 | sed 's: ::g')"
FK8R="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ8T8read"' | grep bw | grep -v '_' | sed 's/        "bw" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-4k.txt" | grep -A15 '"name" : "4kQ8T8read"' | grep iops | sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"
FK8W="$(($(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ8T8write"' | grep bw | sed 's/        "bw" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }')/1024))MB/s IOPS=$(cat "$TARGET/.fiomark-4k.txt" | grep -A80 '"name" : "4kQ8T8write"' | grep '"iops" '| sed 's/        "iops" : //g' | sed 's:,::g' | awk '{ SUM += $1} END { print SUM }' | cut -d. -f1)"


echo -e "
Results:
3[0;33m
Sequential Read: $SEQR
Sequential Write: $SEQW
3[0;32m
512KB Read: $F12KR
512KB Write: $F12KW
3[1;36m
Sequential Q32T1 Read: $SEQ32R
Sequential Q32T1 Write: $SEQ32W
3[0;36m
4KB Read: $FKR
4KB Write: $FKW
3[1;33m
4KB Q32T1 Read: $FK32R
4KB Q32T1 Write: $FK32W
3[1;35m
4KB Q8T8 Read: $FK8R
4KB Q8T8 Write: $FK8W
3[0m
"

# rm "$TARGET/.fiomark.txt" "$TARGET/.fiomark-512k.txt" "$TARGET/.fiomark-4k.txt"
rm "$TARGET/.fiomark.tmp" "$TARGET/.fiomark-512k.tmp" "$TARGET/.fiomark-4k.tmp"

このスクリプトをfio-cdm.shのファイル名で保存しchmodで実行権限を付与
./fio-cdm.sh /rootで実行するだけです
引数は作業フォルダなのでどこでもOK

Windows10のVM作成

pve02ノードにWindows10のVMを作成していきます

ISOをアップロード

今回使用したISOはMediaCreationToolで作成したWindows10 64bit バージョン1909のISO
更にVirtIOのドライバディスクであるvirtio-win-0.1.171.iso(安定版を使用)

WindowsにはCentOSと違ってVirtIOドライバが標準ではインストールされていない為
ドライバディスクが必要になります

VirtIOドライバディスクの入手元はFedoraプロジェクト内にあるこちら
(あえてリンクタグはつけてません)

安定版
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/
最新版
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/

バージョン表記のあるisoと表記なしのisoがありますが中身は一緒なのでどちらでもOK
(ISOへの直リンクに対応する為です)

WEBGUIのpve02にあるlocalを選択し内容画面へ移動
先ほどと同じくアップロードします

今回はProxmoxクラスタを組んでいるのでpve01のWEBGUIからでも操作は可能ですが
何回かエラーが出たり途中でアップロード処理が止まったりするケースがあったので
該当ノードのWEBGUIから直接アップロードした方が無難かもしれません

VMを作成

OSタブのISO指定とゲストOS種別はこちら
ゲストOSのバージョンは10/2016/2019を選択

システムタブは既定値のまま
Qemuエージェントはこちらもインストール予定だが説明の為にわざと外してます

ハードディスクタブです
既定ではゲストOSをWindowsにすると「バス/デバイス」がIDEに設定されます

「バス/デバイス」がIDEのままだと遅いのでSCSIに変更し
SCSIコントローラがVirtIO SCSIになるのを確認します
ディスクサイズも100GBへ増やしました

CPUタブでは既定値はコアも1でしたが2へ変更

メモリーは8GB設定へ変更
Balooningに既定値ではチェックが付いてますが
ゲストOSがWindowsの場合は低速になるケースがあるのでオーバーコミットしない場合は
Balooningのチェックを外すのが推奨になります

ネットワークタブでもWindows用の設定だと
モデルの既定値がIntel E1000になっています

モデルもVirtIO(準仮想化)に変更しました

確認画面で「完了」ボタンを選択するとVM作成されます

VM作成された様子がこちら

Windows10でも無事にコンソール画面にて起動・表示しました

Windowsインストール手順

ここからインストール作業を進めていくわけですが
CentOS7の時と違ってWindowsではVirtIOドライバを適用する手順が必要になります

Windowsのインストール場所を選択する画面でディスクがリストに出ない状態になります
この画面になればマウントしているISOをWindowsのISOからVirtIOのISOに変更します

変更方法はCentOS7項のISOアンマウントで説明した内容と似た手順で
VMのハードウェアメニューへ移動してCD/DVDドライブを編集
virtio-win-0.1.171.isoを選択して「OK」を選択

Windows10のコンソールに戻って「ドライバーの読み込み」を選択すると
ISOからドライバリストが表示されますので
Windows10用を選択して「次へ」を選択
Windows10用はドライバのパスがD:\amd64\w10になってます

ドライバに問題なければインストール場所にディスクが表示されますが
WindowsのISOを挿入しないと「次へ」が選択できないので
VirtIOのISOからWindows10のISOに変更して「最新の情報に更新」を選択します

ディスクが表示されて「次へ」ボタンも選択できるようになればOKです

これでディスクコントローラのドライバはインストール完了なので
このままWindows10のデスクトップ表示までインストール作業を進めます
(LANドライバが入っていないのでインストール時はオフライン状態になります)

Windows10のデスクトップ表示まで進んだらデバイスマネージャーを開きます
今回はPCIデバイスとイーサネットコントローラーが認識できていないので対処します
(PCIデバイスはBalooning関係なのでBalooningが無効だと表示されない場合があります)

CD/DVDドライブにVirtIOドライバのISOをマウントしてから
PCIデバイスを右クリックして「ドライバーの更新」を選択
ドライバーの検索方法は「コンピューターを参照してドライバーソフトウェアを検索」を選択

コンピューター上のドライバーを参照する先をCD/DVDドライブに設定(今回はDドライブ)

デバイス ソフトウェアのインストール確認画面が出るので「インストール」を選択

PCIデバイスがVirtIO Balloon Driverなのが確認できます

同様にイーサネット コントローラーも「ドライバーを更新」から対処します
イーサネット コントローラーはRed Hat VirtIO Ethernet Adapterで認識されました

これでデバイスマネージャーは全て正常になります

インターネットも利用可能になっているはずなので
Edgeなどでネット疎通確認ができればCD/DVDドライブからISOをアンマウントして下さい

ベンチマーク用の設定

WindowsUpdateを実行後にCrystalDiskMarkのバージョン7.0.0gをダウンロード
CrystalDiskMarkのプロファイルはデフォルト [+Mix]を選択

Guestエージェントのインストール

VMの管理画面を見るとIPsの部分は本来割り当てられたIPが表示されるのですが
「Guestエージェントが設定されていません」と表示されています

これに対応する場合はVMにQemu-guest-agentをインストールする必要がありますので
手順をご紹介します

VM設定

VM作成時に「Qemuエージェント」のチェックをしている場合はこの項は飛ばしてください

VM作成時に「Qemuエージェント」のチェックを外していた場合は
まずVMの設定を変更する必要があります

VMのオプションメニューにある「QEMU GuestAgent」が該当します

「QEMU GuestAgent」を選択して編集ボタンか項目をダブルクリックをすると
編集画面が表示されるので「Use QEMU Guest Agent」をチェックして「OK」

「QEMU GuestAgent」が有効になっていればVM設定は完了

CentOS7

CentOS7へログインしてyumを使ってqemu-guest-agentをインストールします

[root@centos7-bench ~]# yum install qemu-guest-agent
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
base                                                                                                                  | 3.6 kB  00:00:00     
extras                                                                                                                | 2.9 kB  00:00:00     
updates                                                                                                               | 2.9 kB  00:00:00     
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ qemu-guest-agent.x86_64 10:2.12.0-3.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

=============================================================================================================================================
 Package                                アーキテクチャー             バージョン                             リポジトリー                容量
=============================================================================================================================================
インストール中:
 qemu-guest-agent                       x86_64                       10:2.12.0-3.el7                        base                       116 k

トランザクションの要約
=============================================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 116 k
インストール容量: 297 k
Is this ok [y/d/N]: y
Downloading packages:
qemu-guest-agent-2.12.0-3.el7.x86_64.rpm                                                                              | 116 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : 10:qemu-guest-agent-2.12.0-3.el7.x86_64                                                                      1/1 
  検証中                  : 10:qemu-guest-agent-2.12.0-3.el7.x86_64                                                                      1/1 

インストール:
  qemu-guest-agent.x86_64 10:2.12.0-3.el7                                                                                                    

完了しました!
[root@centos7-bench ~]#

VMを再起動するとIPsにVMのIPが表示されるようになります
ここが表示されていればインストールは完了です

「More」ボタンを選択するとゲストエージェントネットワーク情報画面が表示されます

Windows10

「QEMU GuestAgent」が有効になった状態で起動すると
デバイスマネージャーに「PCIシンプル通信コントローラー」と
「Intel 82371SB PCI to USB Universal Host Controller」が表示されます

CD/DVDドライブにVirtIOドライバのISO(virtio-win-0.1.171.iso)をマウントしてから
「PCIシンプル通信コントローラー」を右クリックして「ドライバーの更新」を実行
今回も「コンピューターを参照してドライバー ソフトウェアを検索」を選択

ドライバーの参照先をCD/DVDドライブに設定して「次へ」を選択

VirtIO Serial Driverがインストールされました

次にQemu-guest-agentのインストーラーがvirtio-win-0.1.171.isoに入っているので
エクスプローラーで光学ドライブを開きます
場所はD:\guest-agent

今回は64bit版のWin10なのでqemu-ga-x86_64.msiを実行

インストールが終わればデバイスマネージャーは正常になります

Windows10の場合はNICが「イーサネット」という日本語名で認識されてしまう影響からか
ゲストエージェントネットワーク情報画面では文字化けしてました

最後に

今回設定したVM2台を使って次はCephの計測を実施していきたいと思います