NVIDIA vGPU官方文档又臭又长,挑点有用的知识点来讲。这期内容来讲讲NVIDIA vGPU性能调度策略这块,如果你看不懂以下内容,可以回看官方的文档:vGPU19的调度行为说明和使用为啥是vGPU19版本呢?因为这个版本是最后一个支持老架构的显卡了,穷鬼买不起万元卡。
三种调度策略
NVIDIA给出了3种 vGPU 调度策略,用于控制 GPU 处理周期的分配:
| 调度器 | 人话 | 默认 | 帧速率限制器 |
|---|---|---|---|
Best Effort(尽力而为) | 动态抢占,谁忙谁就用的多 | 默认策略 | A\Q系列限制60帧 B系列限制45帧 |
Equal Share(均等份额) | 以当前开机的VM数量平均分 | 手动切换 | 该策略下,帧率限制器失效,不限制帧率 |
Fixed Share(固定份额) | 按Profile预设值固定比例 | 手动切换 | 该策略下,帧率限制器失效,不限制帧率 |
一、【尽力而为】策略
这是vGPU的默认策略,适用于所有架构的显卡。
行为:允许 vGPU 使用其他 vGPU 未使用的 GPU 周期。典型的多劳多得,摆烂炒鱿鱼。
效果:如果一台虚拟机需要大量处理图形(比如3D渲染、导视频、打游戏),它会抢走那些空闲的又分配了vGPU资源的虚拟机。从而导致那些本来很闲的虚拟机变卡顿。
二、【均等份额】策略
这个是我个人比较推荐使用的策略,需要手动切换。这个策略下帧率限制器将会失效,不限制帧率。
行为:物理 GPU 由其上所有运行的 vGPU 平均共享。当 vGPU 数量变化时,每个 vGPU 获得的份额会动态调整。如开1个VM则有100%性能,开2个VM则有50%性能,开3个VM则有33%性能,3个VM关掉一个又会变回50%性能。
效果:其他 vGPU 启动或者停止会影响当前 vGPU 的性能。
二、【固定份额】策略
这个策略不支持混合大小模式下使用,只能使用相等大小模式。这个策略下帧率限制器也会失效,不限制帧率。
行为:每个 vGPU 获得物理 GPU 处理周期的固定份额,该份额由其类型(决定了每 GPU 最大 vGPU 数量)决定。例如,若某 GPU 最多支持 4 个 T4-4Q vGPU,则每个获得 25% 的固定份额。
效果:其他 vGPU 的启动或者停止都不会影响当前 vGPU 的性能。
严格轮询 (ARR) 执行
NVIDIA为了确保调度公平性,【均等份额】 和 【固定份额】调度器默认启用 严格轮询 (Adaptive Round Robin, ARR) 的执行行为。不要问我为啥没有【尽力而为】调度器,vGPU就是这样设置的。
ARR 开启时:
默认就是开启状态,调度器会根据调度频率 和平均因子 动态调整时间片,主动补偿超时,保证公平性。
ARR 关闭时:
关闭后,需要手动设置固定的时间片长度 (1-30 毫秒)。注意:NVIDIA vGPU 19 是最后一个支持关闭 ARR 的版本,未来版本将移除此功能。
如何改变调度行为
方法一:立即生效,不持久
使用 nvidia-smi vgpu set-scheduler-state 命令来改变调度行为。使用前必须关闭所有在运行的vGPU资源的虚拟机。此方法重启后需要重新设置,要永久生效请使用方法2。
关键参数:
-p {1,2,3}: 1=尽力而为,2=均等份额,3=固定份额。-a {0,1}: 0=关闭 ARR,1=启用 ARR(默认)。
-ts <纳秒数>: 仅在 ARR 关闭时设置时间片 (1,000,000 ~ 30,000,000 ns)。
-asf <频率>: 仅在 ARR 启用时设置调度频率 (63-960 Hz)。
-aavg <因子>: 仅在 ARR 启用时设置平均因子 (1-60)。
示例:
# 为指定的显卡设置固定份额调度器,关闭ARR,设置24ms时间片
nvidia-smi vgpu set-scheduler-state -i 0000:86:00.0 -p 3 -a 0 -ts 24000000
# 为所有GPU设置均等份额调度器,启用ARR,使用默认参数
nvidia-smi vgpu set-scheduler-state -p 2 -a 1
# 恢复所有GPU到默认的尽力而为调度器
nvidia-smi vgpu set-scheduler-state -p 1方法二:持久生效,需重启
通过设置注册表项 RmPVMRL 来持久化配置,修改后需要重启宿主机。
| 值 | 调度策略 | ARR模式 | 说明 |
|---|---|---|---|
| 0x00 | 尽力而为 | 无 | 默认值 |
| 0x01 | 均等份额 | 启用 | 使用默认参数 |
| 0x00030003 | 均等份额 | 禁用 | 时间片=3ms |
| 0x11 | 固定份额 | 启用 | 使用默认参数 |
| 0x00180011 | 固定份额 | 禁用 | 时间片=24(0x18) ms |
| 0x3c3c0001 | 均等份额 | 启用 | 平均因子=60,频率=960Hz |
示例:
如果你宿主机是PVE:
# 将 所有 vGPU 调度策略设置为均等份额调度器,并采用默认时间片长度
echo "options nvidia NVreg_RegistryDwords="RmPVMRL=0x01"" > /etc/modprobe.d/nvidia.conf
# 更新initramfs
update-initramfs -u -k all
# 重启
reboot如果你宿主机是ESXI:
# 将 所有 vGPU 调度策略设置为均等份额调度器,并采用默认时间片长度
esxcli system module parameters set -m nvidia -p "NVreg_RegistryDwords=RmPVMRL=0x01"
# 重启Esxi,即可生效
reboot如何查看调度状态
# 查看调度器策略和状态(需要 VM 运行才能看到完整信息)
nvidia-smi vgpu -ss
# 查看硬件支持的调度器能力(如最大/最小时间片等)
nvidia-smi vgpu -sc
# 每隔1秒刷新 vGPU 资源占用情况
nvidia-smi vgpu -l 1所以用哪个策略好
这里拿游戏多开挂机的场景,我的建议:放弃NVIDIA默认的【尽力而为】调度器,果断切换到【均等份额】调度器。之所以这么建议,是因为默认的【尽力而为】调度器很像一个“抢跑”机制——哪个虚拟机任务重、抢得凶,GPU就把资源多分给它。这在你多开挂机时,会导致明显的“一个号吃肉,其他号喝汤”的不公平现象,甚至可能让后台的号卡顿、掉线。而【均等份额】调度器就像“平分大锅饭”:当前有多少个窗口在跑,GPU算力就平均分给它们。关掉一个窗口,剩下的窗口会自动平分释放出的算力,整体利用率更高。
特别提醒:【均等份额】调度器会禁用帧率限制器 (FRL)。这意味着游戏帧数不会再被人为限制在60、45帧,可以跑满,如果你想限制帧率可以给虚拟机安装个微星小飞机RTSS显卡锁帧工具,就可以自定义锁定帧率了。比如30帧,100帧等等。
操作指南:(PVE为例)
立即生效
# 为所有GPU设置均等份额调度器,启用严格轮询(默认就是开启的,推荐保持)
nvidia-smi vgpu set-scheduler-state -p 2 -a 1永久生效
# 为所有GPU设置均等份额调度器,启用严格轮询(默认就是开启的,推荐保持
echo "options nvidia NVreg_RegistryDwords="RmPVMRL=0x01"" > /etc/modprobe.d/nvidia.conf
# 更新initramfs
update-initramfs -u -k all
# 重启
reboot高级调优:调整时间片(可选)
时间片可以看作是GPU给每个窗口的“连续工作时间”。
短时间片 (~1-5ms):切换更频繁,交互响应快,适合需要即时操作的游戏窗口。
长时间片 (10-30ms):减少切换开销,适合纯挂机的后台窗口,理论上能略微提升整体帧数。
默认值通常就足够了。如果你挂机的窗口完全不操作,想榨干最后一点性能,可以尝试调长时间片。
示例:
# 关闭严格轮询策略-a 0,并设置30ms时间片-ts
nvidia-smi vgpu set-scheduler-state -p 2 -a 0 -ts 30000000注意:关闭严格轮询(-a 0)19版本后会被移除,后续版本只支持开启状态下的参数调整。