- ゲストOSのCPU modelをクラスタ内のホストCPUのラインナップに応じて適切に選定してやることよって特定のホストCPUにしかない命令セットをゲストVMから隠蔽すれば安全にマイグレーションできる説
- なおデフォルトのkvm64でもある程度大丈夫っぽい記載があるが、ぼくの経験上うまくいった試しがあまりない
- でもドキュメント上は
Compatible with Intel CPU >= Pentium 4, AMD CPU >= Phenom
とあるので、一番安全そうに見えるが。別原因でこけてただけなのかなあ。
- でもドキュメント上は
- だいたいダメな時はマイグレーション後数十分後にフリーズしてることがよくあるように思う。マイグレーション後のホストCPUにない命令セット触った時にオワるんだろうか
The x86_64 architecture has a number of ABI compatibility levels defined. Traditionally most operating systems and toolchains would only target the original baseline ABI. It is expected that in future OS and toolchains are likely to target newer ABIs. The table that follows illustrates which ABI compatibility levels can be satisfied by the QEMU CPU models. Note that the table only lists the long term stable CPU model versions (eg Haswell-v4). In addition to what is listed, there are also many CPU model aliases which resolve to a different CPU model version, depending on the machine type is in use.
x86_64アーキテクチャには、いくつかのABI(アプリケーションバイナリインターフェース)互換性レベルが定義されています。従来、多くのオペレーティングシステムやツールチェインは、元々のベースラインABIのみをターゲットとしていましたが、将来的には新しいABIをターゲットとするオペレーティングシステムやツールチェインが増えると予想されています。以下の表は、QEMUのCPUモデルがどのABI互換性レベルに対応しているかを示しています。この表では、長期的に安定したCPUモデルバージョン(例:Haswell-v4)のみがリストされています。なお、記載されているものに加え、マシンタイプに応じて異なるCPUモデルバージョンに解決されるCPUモデルエイリアスも多数存在します。
https://www.qemu.org/docs/master/system/i386/cpu.html
ABIはオブジェクトコードレベルのインタフェースであり、互換ABIをサポートするシステム間では同じ実行ファイルを変更無しで動作させることができる。
Historically, Proxmox VE had the kvm64 CPU model, with CPU flags at the level of Pentium 4 enabled, so performance was not great for certain workloads.
In the summer of 2020, AMD, Intel, Red Hat, and SUSE collaborated to define three x86-64 microarchitecture levels on top of the x86-64 baseline, with modern flags enabled. For details, see the x86-64-ABI specification.
kvm64 (x86-64-v1): Compatible with Intel CPU >= Pentium 4, AMD CPU >= Phenom.
x86-64-v2: Compatible with Intel CPU >= Nehalem, AMD CPU >= Opteron_G3. Added CPU flags compared to x86-64-v1: +cx16, +lahf-lm, +popcnt, +pni, +sse4.1, +sse4.2, +ssse3.
x86-64-v2-AES: Compatible with Intel CPU >= Westmere, AMD CPU >= Opteron_G4. Added CPU flags compared to x86-64-v2: +aes.
x86-64-v3: Compatible with Intel CPU >= Broadwell, AMD CPU >= EPYC. Added CPU flags compared to x86-64-v2-AES: +avx, +avx2, +bmi1, +bmi2, +f16c, +fma, +movbe, +xsave.
x86-64-v4: Compatible with Intel CPU >= Skylake, AMD CPU >= EPYC v4 Genoa. Added CPU flags compared to x86-64-v3: +avx512f, +avx512bw, +avx512cd, +avx512dq, +avx512vl.
https://pve.proxmox.com/pve-docs/chapter-qm.html#_qemu_cpu_types
- 基本戦略は「ホストCPUに無い命令セットをあたかもゲストVMにあるように見せてしまい、ゲストVMがそれを触った瞬間に死ぬ」みたいなノリな気がするので、クラスタ内で一番低いABI Levelを推測したCPUにゲストOSのCPU Modelを合わせて、特定のCPUにしか存在しない命令セットをゲストOSから隠蔽する。
- CPUモデルからABI Levelを雑に推測。
- リンク先のリストはほとんどサーバに寄ったモデルラインナップであった。なのでクライアントCPUは同アーキテクチャのサーバCPUとして雑に推測。
- とはいえサーバ向けCPUにしか搭載されていない命令セットがあったはず(AVX512とか)。IntelCPUはClient向けのモデルが表にあったので一律それと推定してみた。
- よってもって今回の場合に最適なCPU Modelは
x86-64-v3
説。
ホスト名 | 搭載CPU | 世代 | 推測適合Model | ABI Level |
---|---|---|---|---|
unchama-sv-prox01 | 20 x 13th Gen Intel(R) Core(TM) i5-13500 (1 Socket)(*1) | Raptor Lake | Skylake-Client-v{1..4} | v3 |
unchama-sv-prox03 | 16 x AMD Ryzen 7 5700X 8-Core Processor (1 Socket)(*2) | Zen3 | EPYC-Milan-v{1..2} | v3 |
unchama-sv-prox04 | 16 x AMD Ryzen 7 8700G w/ Radeon 780M Graphics (1 Socket)(*3) | Zen4 | EPYC-Genoa-v1 | v4 |
unchama-sv-prox05 | 20 x 13th Gen Intel(R) Core(TM) i5-13500 (1 Socket)(*1) | Raptor Lake | Skylake-Client-v{1..4} | v3 |
unchama-sv-prox06 | 20 x 13th Gen Intel(R) Core(TM) i9-13900H (1 Socket)(*4) | Raptor Lake | Skylake-Client-v{1..4} | v3 |
unchama-sv-prox07 | 20 x 13th Gen Intel(R) Core(TM) i9-13900H (1 Socket)(*4) | Raptor Lake | Skylake-Client-v{1..4} | v3 |
unchama-sv-prox08 | 20 x 12th Gen Intel(R) Core(TM) i9-12900H (1 Socket)(*5) | Alder Lake | Skylake-Client-v{1..4} | v3 |
(*3)https://www.amd.com/en/products/processors/desktops/ryzen/8000-series/amd-ryzen-7-8700g.html
- 2つのVMを作成(2vCPU,4GB)
- CPU Modelを検証したいモデルに設定
- 起動
- stress-ngを仕掛けて負荷をかける ここらへんを参照
- ホストOSのcronとかで定期的にライブマイグレーションをする
qm migrate
は移行元VMが存在するホストでしか打てないので注意
- 死活はzabbix-agentで監視