云游戏技术专题全层级9 / 30 已发布

GPU 虚拟化技术架构:从 SR-IOV 到 MIG

· 0 分钟阅读
GPU 虚拟化技术架构:从 SR-IOV 到 MIG(GPU Virtualization Architecture: From SR-IOV to MIG) — 云游戏技术专题

GPU 虚拟化技术架构:从 SR-IOV 到 MIG(GPU Virtualization Architecture: From SR-IOV to MIG)

为什么 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 至 121.0(基准)
标准档MIG 中块或 SR-IOV 虚拟功能,1/4 至 1/2 卡33 毫秒以内大部分 RPG、策略、独立游戏2 至 42.5 至 3.5
性能档近整卡独占,SR-IOV 独占虚拟功能16 至 20 毫秒动作、射击、开放世界1 至 25 至 7
旗舰档整卡独占或整机直通与本地无感差异竞速、格斗、光追大作18 至 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 虚拟化这件事,会不会从一个「必须解决的技术难题」变成一个「根本不需要解决的问题」?我倾向于后者,但这话现在说还太早。

文章标签
云游戏Cloud Gaming视频编码H.264H.265AV1WebRTC低延迟传输ABR 自适应码率GPU 虚拟化DLSS 云游戏FSR 云游戏
更多专题全部专题
觉得有价值?点赞或收藏支持内容持续产出。
← 返回专题:云游戏技术专题