链路一:计算链路(算力从哪来) 【计算链路】 ┌─ 虚拟机内部(Windows)────────────────────────────────────────┐ │ │ │ 游戏 / 应用 │ │ │ DirectX / Vulkan 调用 │ │ ▼ │ │ ┌────────────────┐ ┌──────────────────────────┐ │ │ │ 直通显卡 │ │ QXL 虚拟显示控制器 │ │ │ │ (物理显卡) │ │ (半虚拟化,无 3D,仅 2D) │ │ │ └───────┬────────┘ └───────────┬──────────────┘ │ │ │ 显存 / 命令队列 / 中断 │ 帧缓冲 │ └───────────┼─────────────────────────────┼──────────────────────┘ │ PCIe 直通(OCuLink 4.0 x4) │ 纯软件路径 ▼ ▼ ┌─ 宿主(Linux)────────────────────────────────────────────────┐ │ │ │ KVM / QEMU 进程 │ │ · vCPU 线程 ← 宿主 CPU 调度(时间片分发) │ │ · VM 内存 ← 宿主 DRAM(可用大页后端) │ │ · 系统盘 ← 宿主 NVMe 上的镜像文件 │ │ · 直通设备 ← VFIO 把直通显卡的 BAR/中断交给 VM │ │ ※ 一旦直通,宿主不再驱动它 ⇒ 宿主侧看不到这张卡 │ └────────────────────────────────────────────────────────────────┘ 要点:算力与访存由直通显卡承担,宿主只负责调度与提供内存/磁盘。 QXL 不参与计算,它只是一块「显示输出用的虚拟控制器」。链路二:显示链路(画面到哪去) 【显示链路】 虚拟机内有两套互相独立的「显示器」概念,因而有两条互不相干的输出路径: 应用渲染完成的画面 │ ┌──────────────┴───────────────┐ ▼ ▼ ┌─ 路 A:虚拟显示(远程访问)─┐ ┌─ 路 B:直通显示(游戏直出)──┐ │ │ │ │ │ QXL 控制器 │ │ 直通显卡渲染 │ │ │ │ │ │ │ │ ▼ │ │ ▼ │ │ SPICE 编码 │ │ 显卡物理输出口 (DP/HDMI) │ │ │ │ │ │ │ │ ▼ │ │ ▼ │ │ 宿主上的查看窗口 │ │ 真显示器 │ │ (窗口里只有这一路) │ │ (画面不经宿主、零拷贝) │ └─────────────────────────────┘ └──────────────────────────────┘ 两条路的判断与边界: · 路 A 的画面与宿主接了什么显示器无关 —— 它由软件产生并经网络式通道送出。 · 路 B 的画面只出现在「直通显卡那个输出口实际连着的显示器」上。 · 查看窗口里【看不到】路 B 的内容;路 B 的内容也不会出现在窗口里。 · 若直通显卡的输出口没接显示器 ⇒ 路 B 无出口,见下面第 5 节。结论与要点 虚拟机内看到 2 张显卡 :一张半虚拟化显示控制器(QXL,无 3D,供远程查看)+ 一张直通的物理显卡(承担全部 3D 算力)。画面走哪条路是可以判断的 :查看窗口里出现的就是虚拟显示那一路;直通显卡那一路上不去那里。在客机「显示设置」里能分别看到两套显示器,哪套被设为主显示,桌面与游戏窗口就落在哪套上。直通显卡没接显示器时 :画面只能靠跨显卡回传 (渲染卡把成品帧经 PCIe 交给有显示的适配器)才能被看到 —— 这条路上有 可观的额外开销 ,是三种形态里最差的一种。最省损耗的是给直通显卡接一个真实输出口 (真显示器,或用「假负载 + 采集」变通);本机的外置显卡拓扑里恰好有一根 DP 线挂在它上面 ,这是天然就绪的直出通路。虚拟机内为什么是 2 张显卡 显卡 类型 作用 是否参与 3D QXL(或其它半虚拟化型号) 软件/半虚拟化显示控制器 给远程查看窗口提供画面、支持动态分辨率与连接 否 (无硬件 3D 管线)直通的物理显卡 PCI 直通(VFIO) 承载全部图形算力、显存与驱动栈 是
注意两者是并列 关系,不是主备:客机里同时存在两个显示适配器,Windows 会各给它们分配显示器编号。若方案里改用别的半虚拟化型号(如 virtio-gpu),数量仍是「1 个虚拟 + 1 个直通」,只是虚拟那块的实现不同。
画面走哪个显示器:判断依据 观察位置 判据 说明 客机「显示设置」 能看到两个显示适配器 / 多台显示器 一套挂在虚拟控制器上,一套挂在直通卡上;被设为主显示的接收桌面与窗口 宿主查看窗口 窗口内只有虚拟那一路的画面 直通那一路永远不会 出现在窗口里(它走的是物理输出口) 宿主侧显卡与输出口 直通后宿主看不到 这张卡的输出口 设备已被交给 VM;若宿主仍能看到它的输出口与状态,说明并没有直通 物理显示器 接在直通卡输出口上的那块才会亮 与查看窗口互不影响,可同时显示
直通显卡没接显示器时,画面如何输出、损耗在哪 先明确一个前提:显卡没有活动显示器 != 不能渲染 。现代显示驱动允许把某张卡当作纯渲染设备,成品帧由系统合成器跨适配器搬运到「有显示的那张卡」再输出。于是这条路是:
【回传路径】 直通卡渲染 ──▶ 成品帧 ──▶ 经 PCIe 回传到虚拟适配器 ──▶ 合成 ──▶ 编码 ──▶ 通道送出 ──▶ 查看窗口 (渲染快) (往返搬运:主要开销) (软件合成) (CPU 编码) (网络/USB 通道)环节 损耗来源 量级/表现 跨适配器搬运 成品帧要在两张卡之间来回走系统内存/PCIe,不是零拷贝 主要瓶颈 ;分辨率与刷新率越高越明显虚拟控制器合成 半虚拟化控制器只做 2D 呈现,无 3D 加速 高帧率下成为上限 编码与通道 画面需编码后经远程显示通道送出 带来额外 CPU 占用与端到端延迟 总体表现 帧率明显下降、延迟升高、画面可能撕裂/跳帧 能玩但不适合竞技类;只作为「没有别的出口时」的兜底
三种形态的优劣(按损耗从低到高) :
形态 直通卡是否有真实输出 画面如何被看到 损耗 物理直出(最优) 接真显示器 直接看那块显示器 零回传损耗 (渲染即输出)假负载 + 采集 接「假负载」让系统认为有显示器(或在客机内装间接显示驱动造虚拟显示器) 用采集/串流把该输出抓走再送到别处看 渲染无损耗;采集与编码带来约数十毫秒延迟 跨卡回传(兜底) 什么都不接 只能从查看窗口看 渲染 + PCIe 往返 + 合成 + 编码 ⇒ 三者中最差
本机实测现状(判据) 判据 实测 含义 外置显卡(OCuLink)当前归谁 归宿主显卡驱动,未 交给虚拟机 当前是「宿主在用」形态,不是直通形态 直通设备占用情况 无任何设备处于直通绑定状态 印证上一条:这台机器还没有 直通给虚拟机的显卡 宿主可见的输出口 外置卡两个输出口「已连接」;核显侧内屏与另一个外接口「已连接」 外置卡的输出口是活的 ⇒ 天然具备「物理直出」通路 宿主现有虚拟机方案的显卡形态 全部方案都是「虚拟控制器 + 远程显示通道」,无一含直通设备 所以本文的直通链路是方案推演 ,本机尚未实测 显示拓扑既有结论 外接显示器一台屏用两根线 分别接核显与外置卡;另有一台屏走该屏的菊花链下游 说明外置卡的输出口确实接着真实显示器,直出通路可直接复用
若要落地,需要动的三处 把显卡交给虚拟机 :纳入直通绑定后宿主即失去它 —— 宿主侧的显示布局会随之变化,需提前规划哪块屏留给宿主。虚拟机的显示配置 :保留一个半虚拟化显示控制器(供日常远程访问),再加直通设备(供游戏)—— 即本文的「2 张卡」形态。输出通路二选一 :给直通卡接真显示器(最优),或在客机内造虚拟显示器 + 采集(次优);两者都不做就只能吃跨卡回传的损耗。边界 本文是链路推演 :本机现有虚拟机方案无一含直通显卡 ,所以第 1–5 节的直通形态尚未在本机实测 ;第 6 节列出的实测判据只覆盖「当前未直通」这一事实。 「跨适配器回传的具体帧率损失」未量化 —— 需要在直通形态下实测才有数字,文中只给损耗构成与定性排序。 半虚拟化显示控制器的型号与能力随方案可选,本文按「无 3D 的 2D 控制器」这一常见形态描述。 外置显卡通路对带电插拔有硬性禁忌(属另一主题),本文不涉及。 本次为只读梳理 :未改动任何配置,未启停任何虚拟机。