oculink显卡直通的kvm计算链路和显示链路分析

链路一:计算链路(算力从哪来)

【计算链路】
┌─ 虚拟机内部(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 控制器」这一常见形态描述。
  • 外置显卡通路对带电插拔有硬性禁忌(属另一主题),本文不涉及。
  • 本次为只读梳理:未改动任何配置,未启停任何虚拟机。