# CPU 基準

本頁說明 go-pve-qemu 如何決定新 VM 的 `--cpu` 類型，讓 VM 可以在叢集任何節點之間遷移。

## 為何需要基準

Proxmox 預設的 `host` CPU 類型會把當前節點的指令集完整暴露給 VM；遷移到指令集較舊的節點後 VM 會無法開機。取全叢集共同支援的最低等級，可犧牲少量效能換取任意遷移。

## 偵測流程

1. 讀取快取檔 `.go_qemu_cpu_type`，存在即直接使用
2. `pvesh get /nodes --output-format json` 取得所有節點
3. 對每個節點執行 `pvesh get /nodes/<node>/status`，解析 `cpuinfo.flags`
4. 依下表判定等級，取全叢集最低者
5. 寫入 `.go_qemu_cpu_type`

任一節點查詢失敗時整個偵測失敗，`qm create` 改用 `kvm64`。

## 等級判定

| 等級 | 必須具備的 flags |
|---|---|
| `x86-64-v1` | 未滿足 v2 時的預設 |
| `x86-64-v2` | `cx16` `lahf_lm` `popcnt` `sse4_1` `sse4_2` `ssse3` |
| `x86-64-v2-AES` | v2 + `aes` `pclmulqdq`（且未滿足 v3） |
| `x86-64-v3` | v2 + `avx` `avx2` `bmi1` `bmi2` `f16c` `fma` `movbe` `lzcnt` `xsaveopt` |
| `x86-64-v4` | v3 + `avx512f` `avx512bw` `avx512cd` `avx512dq` `avx512vl` |

## 已知行為

- 比較全叢集最低等級時只認得 `x86-64-v1`～`v4` 四種值；判定為 `x86-64-v2-AES` 的節點會被當成 v1，使整個叢集基準降為 `x86-64-v1`
- 快取不會自動失效；新增或更換節點後需手動刪除 `.go_qemu_cpu_type`
- 已建立的 VM 不受影響，只有之後建立的 VM 會使用新基準
