结论
旧 Win10 以 KVM 客机形式跑《都市天际线2》这条链路已经跑通并验收:OCuLink RTX 4060 整组直通、16 vCPU 吃满 8 个物理核、系统盘走 virtio-blk + io_uring,鲁大师总分达到同一台机器物理裸机的 81.9%(显卡 85.9%、处理器 87.0%),游戏实测流畅;eGPU 链路在负载下稳定训练到 16.0 GT/s ×4(Gen4),不是带宽瓶颈。
磁盘一项只有物理机的 52.9%,用户判定这是 KVM 软栈的固有上限、不再做宿主侵入式优化(不预分配、不常驻大页)。
拓扑与配置
| 层 | 做法 | 落点 |
|---|---|---|
| 直通开关 | 不写内核参数;每卡一个状态文件,启动期 oneshot 按状态写 driver_override 并绑定 vfio-pci。切换零世代、重启生效 | gpu-mode.nix / gpu-mode.sh / /var/lib/gpu-mode/<BDF>.mode |
| 域方案 | 4060 整组 hostdev(显示 01:00.0 + 音频 01:00.1,IOMMU 组 15);QXL 保留作带外控制台;Hyper-V 五件套;QXL heads=1 | /s500data/kvm/win10-old/win10-old-4060.xml |
| CPU | 16 vCPU,拓扑 1×8×2,SMT 成对亲和:vCPU(2N)→核N、vCPU(2N+1)→核N+8;不限定 emulatorpin | 同上 <cputune> |
| 磁盘 | 系统盘 virtio-blk(vda)+ cache=none io=io_uring discard=unmap | 同上 <disk> |
| 键鼠 | SPICE 键盘(按焦点路由)+ 直通一只物理 USB 鼠标(绝对定位的 usb-tablet 只能覆盖它显示的那块屏) | kvm usb 子命令 |
两轮调优与实测数据(鲁大师 6.1023.3745.803)
| 形态 | 总分 | 处理器 | 显卡 | 内存 | 硬盘 |
|---|---|---|---|---|---|
| 物理旧 Win10(裸机基线) | 1,707,604 | 826,092 | 390,317 | 193,853 | 297,342 |
| 4060 直通 · virtio + 16 vCPU(当前) | 1,399,225 | 718,298 | 335,088 | 188,611 | 157,228 |
| 4060 直通 · 模拟 NVMe + 8 vCPU(上一轮) | 1,195,676 | 575,126 | 333,854 | 199,991 | 86,705 |
| QXL 性能形态(topology + 大页) | 836,546 | 561,327 | 15,251 | 186,573 | 73,395 |
| QXL 零掩盖 | 684,989 | 448,402 | 1,524 | 161,050 | 74,013 |
| QXL 全设备面掩盖 | 678,989 | 459,058 | 2,196 | 165,959 | 51,776 |
| QXL 半掩盖 | 641,625 | 430,022 | 1,926 | 158,480 | 51,197 |
相对物理裸机:总分 81.9%、显卡 85.9%、处理器 87.0%、内存 97.3%、硬盘 52.9%。
两轮增量的归因很干净:磁盘 86,705 → 157,228(+81.3%)来自「模拟 NVMe + io=native → virtio-blk + io_uring」;处理器 575,126 → 718,298(+24.9%)来自「8 vCPU/4 物理核 → 16 vCPU/8 物理核」;显卡 333,854 → 335,088(+0.4%)属噪声,恰好证明换磁盘控制器没有干扰直通链路。
游戏实测:4060 直通跑天际线2
旁路观测(不碰客机):每 10 秒采样一次宿主侧 PCIe 链路速率,共 279 个样本。
| 链路速率 | 样本数 | 含义 |
|---|---|---|
| 16.0 GT/s ×4(Gen4) | 203 | 游戏负载下正常训练到 OCuLink 上限 |
| 2.5 GT/s ×4(Gen1) | 69 | 空闲省电降速(NVIDIA 常规行为) |
| 5.0 GT/s ×4(Gen2) | 7 | 升速过程中的中间态 |
⇒ 之前「idle 只读到 2.5 GT/s,怀疑带宽被压制」的担心可以撤销:负载下链路是满速的,显卡那 14% 的差距不是带宽造成的。用户验收口径:游戏正常、挺流畅。
踩坑清单(都踩过、都有判据)
| # | 坑 | 判据 / 处置 |
|---|---|---|
| 1 | 域 XML 里写 <driver aio='io_uring'/> 被本机 libvirt 的 RNG 直接拒(Extra element devices in interleave) | 改用 io='io_uring' 这个属性位 |
| 2 | 系统盘直接由 NVMe 换 virtio 会开机 0x7B | 客机 DriverStore 里有 viostor.inf_amd64*,但 Services\viostor 不存在(只是暂存、没注册)⇒ 先挂 1 GiB 探针 virtio 盘让 Windows 自动装驱动,再切系统盘 |
| 3 | 担心换控制器破坏 EFI 引导 | 五条判据:BCD 指 partition=\Device\HarddiskVolume3 而非控制器路径;ESP 里有 \EFI\BOOT\BOOTX64.EFI 回退项;同一块盘一个 GPT;boot order=1 每次现算设备路径;viostor Start=0 已注册 |
| 4 | QXL 形态加 <hugepages/> 起不来 | 本机 libvirt/QEMU 不会按域需求自动扩 nr_hugepages,池为 0 时报 unable to map backing store for guest RAM |
| 5 | SPICE 鼠标进不了直通显卡那块屏 | usb-tablet 是绝对坐标、只映射它显示的那块屏;键盘则按焦点路由(所以「键盘双通、鼠标进不去」)。处置:直通一只物理 USB 鼠标 |
| 6 | Paradox 启动器装了不写 launcherpath,每次启动重装再报 CRITICAL | %LOCALAPPDATA%\Paradox Interactive\launcher-v2 只剩 logs、真正的 launcher 目录不存在 ⇒ 卸载重装 Paradox 启动器后正常;应急可直启 Cities2.exe 绕过启动器 |
| 7 | 「关闭 VM 后 4060 自动回宿主」这个老口径与本机机制不符 | 本机是「状态 + 重启生效」,关 VM 后卡仍在 vfio-pci;回宿主需 sudo gpu host 0 + 重启 |
不做的事(用户裁定,2026-10-18)
- qcow2 预分配:不做。KVM 磁盘上限就在这里,再重写镜像没有意义。
- 常驻 16 GiB 大页:不做,属于对宿主系统的侵入。
- 为跑分停宿主服务:不做,会打断正常使用。
- 可保留但只在有需要时做:eGPU 链路速率采样(纯观测)、客机内把直通卡那块屏设为「主显示器」(改善呈现路径)。
可复用命令
gpu list # 显卡列表:序号/类型/设备/PCI 位置/IOMMU 组/当前驱动/期望/一致
sudo gpu pass 0 # 标记该卡整组为直通(重启生效)
sudo gpu host 0 # 标记回宿主(重启生效)
kvm usb # 宿主 USB 列表 + 是否已挂给客机
kvm usb 5 # 切换:已挂→拔回、未挂→挂上(运行时直通,客机重启后失效)
kvm switch win10-old 4060 # 切到 4060 直通方案并启动
kvm cp *.png # 取客机桌面文件到 xml 同级 desktop/边界
- 每组性能数据只有 1 次跑分,未做重复采样;±6% 量级的差异不作为结论。
- 物理基线截图日期为 2024-04-12,系统补丁与显卡驱动版本与今天不同;硬件是同一台(7840U / 64 GB / 同一块 2T NVMe / RTX 4060 8 GB)。
- 物理基线内存为 64 GB,客机为 16 GB,内存分不可严格横比。
- 详细数据与 7 张原始截图在
/s500data/kvm/win10-old/performance/20261017鲁大师测试/。