GPU 虚拟化技术架构:从 SR-IOV 到 MIG(GPU Virtualization Architecture: From SR-IOV to MIG)
显卡不是 CPU,切豆腐和切时间是两回事——一卡多用为什么在游戏面前总是翻车
为什么 GPU 虚拟化是云游戏成本账本上的第一块基石
聊云游戏,绕不开一句话:这生意本质上是在出租显卡。
你打开云游戏平台,付 30 块钱一个月,背后有一张几千上万块的卡在替你跑《赛博朋克 2077》。平台能不能活,取决于这张卡一天被你用几个小时、又同时被几个人分。
所以 GPU 虚拟化这件事,不是架构师的自嗨。它直接决定三件玩家肉眼可见的事:你能开到什么画质、你的手感稳不稳、以及这门生意能不能撑过三年。
上一期《云游戏延迟的完整技术图谱与测量体系》里,我们把一次操作的延迟拆成七段,其中两段——「渲染」和「排队」——完全攥在 GPU 手里,而且是最难压缩的两段。你换更好的编码器、铺更近的节点、上 QUIC,能把网络那几段削到 10 毫秒以内;但只要 GPU 那边被别的租户抢了一下,一帧多花 40 毫秒,前面省的全白省。
这一期我们就钻进机箱里,把「一张显卡怎么分给好几个人用」这件事从头拆开:时间片怎么切、MIG 怎么分区、SR-IOV 怎么把队列拆到硬件层、裸金属为什么至今仍是 AAA 游戏的唯一解。
我先抛个结论,你可以带着它往下读:CPU 虚拟化是软件问题,GPU 虚拟化是物理问题。理解这句话,你就理解了为什么这个行业折腾了十五年,云游戏的单价还是降不下来。
第一层:GPU 是个有状态、还讨厌排队的怪物
先说说为什么大家一开始会觉得「虚拟化很简单」。因为 CPU 那边已经趟过路了。你电脑上同时开浏览器、微信、游戏,三个进程轮着用 CPU,你完全感觉不到。操作系统给每个进程保存一份寄存器快照,切出去的时候存,切回来的时候读,一次切换是微秒级的开销,快到人类根本察觉不了。
虚拟化为啥能把 CPU 切得这么细?因为 CPU 的活儿是无状态的一问一答:算一个加法,算完这个过程就彻底结束了。系统可以随时打断它、冻结它、把结果搬到硬盘上,之后再接着算,结果一模一样。
GPU 完全不是这样。GPU 的活儿是一条不能断的流水线:顶点数据进去,光栅化,着色,后处理,最后吐出一帧画面。这条管线上任何一段被抽走两毫秒,吐出来的就不是「慢一点的画面」,而是没有画面——或者画面撕裂、或者这一帧作废。
更要命的是,GPU 有三样东西是「物理上不可拆」的:
| 资源 | 为什么难拆 | 玩家能感觉到什么 |
|---|---|---|
| 显存 | 不是硬盘,不能换页。一份贴图必须实实在在躺在显存里才能被采样。一个租户的素材全驻留着,别的租户就用不了 | 贴着贴着突然糊了,或者长距离奔跑时场景加载变慢 |
| 显存带宽 | 显存颗粒共享,带宽像一条总水管,几个租户一起开龙头,压力全在一起 | 越是那种满屏粒子、大场景的游戏,越容易掉 |
| 硬件编码器 | 编码单元数量由显卡型号决定,一台卡可能只有一两个。每路游戏串流至少要占用一路编码 | 编码器不够时,平台只能少开实例——这是密度上限最容易被忽略的瓶颈 |
这里我要特别提编码器,因为外行往往只盯着「算力够不够」,内行才知道真正的天花板在哪儿。数据中心里的计算卡(比如 A100 那类训练卡)出厂时根本就没给你配编码器——它压根不是为出画面设计的。能拿来跑游戏串流的,是 L4、L40S 那种带媒体引擎的卡。你买错了卡,算力再猛也串不出流。
所以这一层的小结是:GPU 虚拟化的目标不是「提高利用率」,而是「在提高利用率的同时,不让任何一个玩家的帧时间出现长尾」。这两个目标天然打架。下面三层,本质上就是三次不同的妥协。
第二层:时间片虚拟化——把显卡切成时间,玩家会被切成幻觉
最直观的思路是:既然 CPU 能轮转,GPU 凭什么不能?
这条路线的实现叫虚拟 GPU(vGPU)。宿主侧装一层驱动,接管虚拟机的图形请求,把好几台虚拟机的渲染任务排成队列,轮流往物理 GPU 上丢。切分粒度可以很灵活,理论上能切到十六分之一张卡,一张卡喂十几个用户,账面成本好看得不得了。
听起来很美好,问题出在「轮流」这两个字上。
每当 GPU 要从租户甲切到租户乙,它得把甲那边的状态清干净——管线排空、缓存刷新、上下文搬走。这一趟下来是毫秒级的开销,而且是不确定的:甲正在跑一个特别重的着色器,它不肯痛快放手,乙就得等。于是乙的体验变成了这样:平均帧率 60 帧,看着挺好,但每过三五秒,突然有一次帧时间飙到 50 毫秒。
这就是「抽帧」。你以为云游戏卡是老生常谈的「网络不行」,其实很多人在家里千兆宽带、3 毫秒 ping,照样觉得手感发飘——问题在服务端,是别人在跟你抢同一块卡。
为什么这个毛病在别的业务上不明显、在游戏上致命?因为不同业务对抖动的容忍度差着数量级:
| 场景 | 平均延迟要求 | 抖动容忍度 | 时间片虚拟化能不能用 |
|---|---|---|---|
| 云办公 / 虚拟桌面 | 100 毫秒以内都能忍 | 偶尔卡 200 毫秒,人只会觉得「网慢了一下」 | 能,而且这是 vGPU 授权卖得最好的市场 |
| 云工作站(建模、渲染、仿真) | 鼠标跟手就行 | 卡一下,等待操作补回来即可 | 能,主流方案 |
| 回合制 / 挂机类游戏 | 宽松 | 几秒钟卡一次也能忍 | 勉强能用,但单用户收益太低 |
| 动作 / 射击 / 竞速游戏 | 端到端 100 毫秒内 | P99 帧时间超过 33 毫秒就崩 | 不行,基本判死刑 |
你看,同一套技术,在两个业务里的评价完全相反。这也解释了行业里一个有点反直觉的现象:商用 vGPU 授权在云工作站市场活得很好,在云游戏平台几乎绝迹。不是技术不行,是业务逼你做选择。
说句实话,我自己早年也翻过车。有次做内部 demo,为了省钱拿时间片方案搭了个测试环境,跑 3D 演示动画丝般顺滑,组里还庆祝了一下。结果拉来一个打格斗的同事试玩,人家两分钟就抬头发问:「你们这个是不是有点飘?」我们回去一查数据,平均帧率 58,P99 帧时间 62 毫秒。数据面板上那个平均值骗了我们一整个下午。
从那之后我就落下个毛病:看云游戏性能,先看 P99,再看平均数。平均值是给老板看的,P99 是给玩家受的。
第三层:MIG 空间分区——把显卡当蛋糕切,切得干净但切得粗
时间片解决不了,那就换思路:别轮转了,直接把卡物理劈开。
NVIDIA 从 A100 那一代开始正式商用的多实例 GPU(MIG),干的就是这事。它不是在软件层假装切分,而是在硬件层把显卡的图形处理集群、显存控制器、二级缓存切成互相独立的小块,每一块对上层来说就是一张「小显卡」,有自己的显存地址空间,有自己的计算单元。
这个方案好在哪?隔离质量接近物理隔离。你那边跑什么重活,都影响不到我这块。没有上下文来回搬,没有排队等待,帧时间曲线平得像尺子画的。
代价也很实在,三条:
第一,切得粗。A100 那代最多切成 7 份,不是 16 份、32 份。为啥是 7 不是 8?因为硬件上本来就留了一块备用。你想更细?没门。这就意味着单卡密度上不去,成本摊薄的力度有限。
第二,切完就固定了。一个实例分到多少算力、多少显存,是建立实例那一刻就写死的,运行中不能动态加减。你今天上午给《星露谷物语》的用户分一份,下午他下班了换人,你还得重建实例。对云游戏这种用户来去如流水的场景,运维负担不小。
第三,也是最要命的:游戏负载天生不对称。
MIG 的设计初衷是伺候 AI 推理——一堆小模型并排跑,每个模型吃的算力差不多,切得均匀,皆大欢喜。但游戏不是这样。同一个平台上的两个用户,一个在玩《星露谷物语》像素种田,一个开着全景光追在夜之城飚车,两者的 GPU 需求能差十倍以上。你按平均切七份,玩种田的那位觉得浪费,玩光追的那位觉得不够用,而切片是死的,它不会看人下菜碟。
所以 MIG 在云游戏的实际用法,通常是「切成大块、一个实例一个人」,而不是「切成小块、拼密度」。换句话说,MIG 在云游戏里的价值是「让多张卡共处一台机器且互不干扰」,不是「让一张卡伺候很多人」。这个定位差一个字的偏差,会让整个成本模型跑偏。
顺带一提,MIG 也不是所有卡都有。它是一部分数据中心卡的特性,消费卡、部分中端专业卡是不给的。你在淘宝上买张便宜卡想自己搭,先确认这个型号认不认 MIG,不然白搭。
第四层:SR-IOV 与直通——为什么 AAA 游戏至今只能整卡独占
剩下的两条路,方向一致:把整块卡(或接近整卡)给一个用户,别让他跟人分。
一条叫 PCIe 直通:虚拟机直接接管整张物理显卡,中间几乎没有虚拟化层。这是最「笨」也最有效的方案,帧时间表现和你在本地插张卡几乎没差别。缺点是明摆着的——一张卡一个人,成本拉满。
另一条叫 SR-IOV(单根 I/O 虚拟化)。这条容易被误解,得说清楚:它不是软件时间片,而是硬件层面的队列分区。显卡在物理上支持把自己拆成若干个「虚拟功能」,每个虚拟功能有自己的命令队列和中断,虚拟机直接跟硬件对话,绕过了宿主那层转发的开销。AMD 的 Radeon Pro V 系列就是这条路的代表,一张卡能切给几个用户,切换开销比软件时间片小得多。
听起来像是完美解?实操里有坑。SR-IOV 的虚拟功能在早期产品上兼容性参差,不同虚拟化平台的支持度不一样,驱动适配是个体力活。而且硬件能切的份数是由显卡出厂设计定的,你没法像软件那样自由拉伸。所以它更适合「一张卡分给 2 到 4 个高价值用户」,不适合拿来拼极限密度。
现在把四个真实案例摆上来,你会看到行业用脚投票的结果。
案例一:微软 xCloud 的「定制刀片」路线。微软走的路最暴力——直接用 Xbox Series X 的定制芯片做服务器刀片,一块主板对应一个 SoC,一个 SoC 服务一个玩家会话。这等于把「整机直通」做到了极致:你需要的是一个 Xbox,微软就真给你一台 Xbox,只不过它在几百公里外的机房里。代价是业界公认的贵——这本质上是把主机成本原封不动搬进了数据中心,密度拉不上去。但收益也直接:玩家在 xCloud 上玩《极限竞速》,手柄手感和客厅里那台机器几乎没差。微软敢在订阅里塞几百款游戏,底气就在这——它的成本模型不是「怎么把卡切碎」,而是「怎么把主机塞进机架」。
案例二:Google Stadia 的反面教材。Stadia 的技术选择其实很讲究,用的是 AMD 定制 GPU,单实例算力在当时相当能打,画质口碑在技术圈一直不错。问题恰恰出在成本结构:为了保住那个口碑,它走的是「每个会话独占硬件资源」的路线,等于把最贵的方案做成了标配。用户体验好,账面亏得快。2022 年关停的时候,社区里有一种很典型的声音——「它其实挺流畅的,就是不知道为什么我用不上」。这句话背后是硬件成本、内容库和用户规模三件事的死循环,技术只是其中一环。这里多嘴一句:做云游戏,最贵的不是把画面串出去,是把「稳定的画面」串出去。前者是工程问题,后者是财务问题。
案例三:GeForce NOW 的档位分级。这套设计的聪明之处在于,它把「你能分到多少物理显卡」直接明码标价做成了商品。免费档排队、优先档插队、顶级档给你一张接近顶级消费卡的分区。用户感知到的不是「虚拟化」,而是「我买的是哪一档的机器」。这是把技术限制翻译成商业语言的标准示范——既然不能让人人独占,就让人人为独占的等级付费。至于档位背后的具体分区方式,官方说法一直很含糊,但从体验差异看,档位之间的差距是实打实的物理资源差距,不是简单的限速。
跨类对照:云工作站。同样是卖 GPU 时长,AWS、阿里云那类云桌面产品就敢大方地用时间片和虚拟化把密度拉满。原因前面说过——建模师多点一下鼠标,晚 200 毫秒出结果,他只会觉得网卡了,不会觉得产品烂。这个对照特别值得云游戏从业者反复看:同一个技术,换个业务场景,评价就天翻地覆。别拿别人的成功案例直接套。
所以回答命题里那个问题——裸金属是不是当前 AAA 游戏的唯一可行方案?我的判断是:在动作、射击、竞速这些对手感敏感的类型上,接近整卡独占是底线,没得商量。但这不是说非要买裸金属服务器,SR-IOV 切 2 到 4 份、MIG 切成大块,只要保证帧时间的 P99 不塌,都能算「事实上的整卡体验」。区别只在于你愿意为那点抖动多付多少钱。
配置表:把「切多细」变成一个可以调的旋钮
讲完机制,给点能直接抄进方案文档的东西。下面两张表是我自己会拿来过评审的框架,数字是示意量级,别当报价单看,重点是字段结构。
表一:实例规格档位设计表
| 档位 | 资源形态 | 目标帧时间 P99 | 适合游戏类型 | 单卡可承载 | 建议定价系数 |
|---|---|---|---|---|---|
| 入门档 | 时间片或小切片,1/8 卡级 | 不承诺,允许 50 毫秒级抖动 | 回合制、卡牌、模拟经营、挂机 | 8 至 12 | 1.0(基准) |
| 标准档 | MIG 中块或 SR-IOV 虚拟功能,1/4 至 1/2 卡 | 33 毫秒以内 | 大部分 RPG、策略、独立游戏 | 2 至 4 | 2.5 至 3.5 |
| 性能档 | 近整卡独占,SR-IOV 独占虚拟功能 | 16 至 20 毫秒 | 动作、射击、开放世界 | 1 至 2 | 5 至 7 |
| 旗舰档 | 整卡独占或整机直通 | 与本地无感差异 | 竞速、格斗、光追大作 | 1 | 8 至 12 |
这张表的意义不在于数字精确,而在于把「画质承诺」换成了「帧时间承诺」。跟用户讲「我们有 RTX」,他听不懂;讲「这一档保证 P99 不超过 20 毫秒」,这才是能写进 SLA 的东西。
表二:密度与质量的调节旋钮
| 旋钮 | 往左拧(保质量) | 往右拧(保密度) | 建议区间 |
|---|---|---|---|
| 每卡实例数 | 1(整卡独占) | 8 以上(时间片) | 游戏业务别超过 4 |
| 上下文切换预算 | 0 | 每帧允许 2 毫秒 | 动作类游戏必须逼近 0 |
| 显存超分比例 | 1.0(各占各的) | 1.5(允许超额分配) | 1.0 至 1.2,超过就等着糊 |
| 编码器预留 | 每实例独占 1 路 | 多实例共享 | 必须独占,这是硬约束 |
| 波峰预留率 | 50%(大量闲置) | 5%(满载运转) | 15% 至 25% 之间找平衡 |
顺带把成本模型也捋一下,因为很多方案争论到最后都是算账。假设一张带媒体引擎的数据中心卡两万块,按三年折旧,就算你把它榨到 60% 的时间都在干活,光显卡这一项,每小时成本就是一块多。而整机还有 CPU、内存、电源、机架、带宽、运维——行业里通常得乘个两到三倍。于是一卡一人的方案,每用户每小时成本三块多;一卡四人,摊到一块钱以下。
这个差价的诱惑有多大?你想想订阅制一个月收三十块,用户但凡多玩几个小时,一卡一人的方案就得倒贴。这就是为什么所有平台都在偷偷往右拧旋钮,也是为什么免费档总是排大队——那不是技术限制,那是钱包限制。
两套读法:你从哪一头进这篇文章
初级用户速览:怎么一眼看出一个平台的技术底子
你不需要关心它是 MIG 还是 SR-IOV,你只需要做三个小测试。
第一个,打开一款动作游戏,做那种需要精确时机的操作(比如连续弹反)。如果平均感觉没问题,但偶尔「按了没反应」,多半是服务端在跟人抢卡。第二个,让画面里塞满粒子特效,同时快速转动视角,看画面会不会在某几个角度突然糊一下——那是显存压力或者分区不够。第三个,挑晚上八点到十点这个黄金时段再测一遍,跟凌晨的体验对比。如果白天丝滑、晚上抽风,说明平台在超卖,密度拧得太狠了。
这三个测试不用任何专业工具,比你翻十篇评测都准。
进阶深入:如果你要设计这套架构,几个反直觉的判断
第一,先定帧时间预算,再选虚拟化方案,别反过来。很多团队是先买卡、再看能切几份,结果切完发现 P99 塌了,回头改架构的成本高得离谱。
第二,把编码器数量当成硬约束写进容量规划的第一行。我见过方案因为忽略这一条,算完算力觉得能塞 8 个实例,实际只能塞 2 个——差的那 6 个不是算力问题,是没有编码单元。
第三,别指望虚拟化能抹平波峰波谷。云游戏的使用曲线极其陡峭,晚上八点跟凌晨三点能差十倍。虚拟化能提高平均利用率,但峰值时刻你该备的机器一台都不能少。想靠超卖解决峰值的,最后都会在最不该出问题的时段崩给用户看。
几个我见过太多次的翻车现场
坑一:拿 AI 推理的 MIG 经验直接搬过来。AI 那边切七份跑得欢,因为每个小模型吃的资源差不多;游戏负载是尖的,一刀切下去必然有人饿有人撑。照搬配置表,八成要返工。
坑二:只看平均帧率。这条我在正文里吐槽过了,但还是要再说一遍。平均值 58 帧、P99 62 毫秒的配置,拿来跑种田游戏是浪费,拿来跑射击游戏是灾难。你的性能看板第一行应该是 P99,不是平均。
坑三:以为虚拟化能救成本。虚拟化提高的是「平均利用率」,不是「峰值容量」。真正吃钱的是峰值那几小时,那部分省不掉。指望靠切分把单价打到地板价,最后会在体验上还债。
坑四:把「独占」和「裸金属」画等号。很多方案其实用 SR-IOV 切出虚拟功能就能达到接近独占的帧时间表现,成本还低一截。直接上裸金属,属于花钱买安心,不是必须。
还有一个我个人的争议观点,可能有人不爱听:我觉得现在行业对「一卡多用」的执念,有一部分是自我欺骗。大家都在算「理论密度」,但真正跑起来,为了保住口碑,实际密度都会往回收。与其在方案里吹一个 8 人/卡的漂亮数字,不如老老实实按 2 至 3 人来规划,把省下来的精力放在调度和容灾上——那才是真正影响留存的东西。
FAQ
Q1:MIG 和 SR-IOV 到底啥区别?一句话。
MIG 是把显卡的「身体」劈开,各块有自己的显存和计算单元,互不相干;SR-IOV 是把显卡的「通信通道」劈开,多个虚拟功能共享同一套物理资源,但各自的队列直通硬件。前者隔离更彻底但切得粗,后者更灵活但共享带宽。游戏场景里,MIG 适合「一张卡给两三个人且要稳」,SR-IOV 适合「一张卡给两三个人且要省」。
Q2:那我自建云游戏,是不是非得买带 MIG 的卡?
看你做多少用户。个人或小团队自建(比如 Sunshine 那套方案),一张消费卡一个人用,压根不需要虚拟化,帧时间反而最好——这也是开源方案延迟能吊打商业平台的原因之一,它没有多租户这层包袱。真到要服务几十上百人,再认真考虑 MIG 或者干脆多买几张卡直通。
Q3:为什么云游戏平台不干脆全用时间片,便宜点让用户忍忍?
因为「忍忍」这件事在游戏里不成立。你让用户忍一次加载慢,他能忍;让他忍手柄输入偶尔失灵,他会直接退款。而且这种抖动是随机分布的,用户没法预判,挫败感会被放大好几倍。宁可少开两个实例,也别在关键体验上打折。
Q4:显存超分是不是绝对不能碰?
不是绝对不能,是要分游戏。轻量游戏显存占用小,适度超额分配能提密度;但开放世界类游戏显存吃紧,超分之后就是贴图糊、加载卡、掉帧三连。我的建议是按游戏类型做分级策略,别全局一刀切。
Q5:下一代 GPU 架构在这方面会有大变化吗?
方向是清楚的:硬件层面的分区能力会越来越细、越来越动态,虚拟化的开销会继续往下降。但别指望出现「一张卡无缝喂二十个人打 3A」的魔法——物理规律还在那儿,显存和带宽是硬的。真正的变量可能在别处,比如渲染本身变得更快(这就要看 AI 超分和神经渲染那两篇了),那才是从根上改变成本结构的东西。
最后留个开放问题给你琢磨:如果未来的渲染技术让单帧成本降到今天的十分之一,GPU 虚拟化这件事,会不会从一个「必须解决的技术难题」变成一个「根本不需要解决的问题」?我倾向于后者,但这话现在说还太早。