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が起動できます
CentOS7の場合は通常のインストール手順にてインストール作業は完了します
インストール作業後にISOをアンマウントする場合はVMのハードウェアメニューへ移動し
CD/DVDドライブ部分の右側をダブルクリックするか行ごと選択して「編集」ボタンを選択
ベンチマーク用の設定
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へ増やしました
メモリーは8GB設定へ変更
Balooningに既定値ではチェックが付いてますが
ゲストOSがWindowsの場合は低速になるケースがあるのでオーバーコミットしない場合は
Balooningのチェックを外すのが推奨になります
ネットワークタブでもWindows用の設定だと
モデルの既定値がIntel E1000になっています
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の計測を実施していきたいと思います
コメント