服务:kvm性能优化玩都市天际线2

结论

旧 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
CPU16 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,604826,092390,317193,853297,342
4060 直通 · virtio + 16 vCPU(当前)1,399,225718,298335,088188,611157,228
4060 直通 · 模拟 NVMe + 8 vCPU(上一轮)1,195,676575,126333,854199,99186,705
QXL 性能形态(topology + 大页)836,546561,32715,251186,57373,395
QXL 零掩盖684,989448,4021,524161,05074,013
QXL 全设备面掩盖678,989459,0582,196165,95951,776
QXL 半掩盖641,625430,0221,926158,48051,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 已注册
4QXL 形态加 <hugepages/> 起不来本机 libvirt/QEMU 不会按域需求自动扩 nr_hugepages,池为 0 时报 unable to map backing store for guest RAM
5SPICE 鼠标进不了直通显卡那块屏usb-tablet 是绝对坐标、只映射它显示的那块屏;键盘则按焦点路由(所以「键盘双通、鼠标进不去」)。处置:直通一只物理 USB 鼠标
6Paradox 启动器装了不写 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鲁大师测试/。