|
一、问题描述: 使用dellR760xa 服务器搭载4张nvidia-L20显卡安装超融合系统,运行windows2022server虚拟机,显卡直通异常 问题现象: 1、显卡驱动安装后,nvidia-smi命令报错 2、重启虚拟机后设备管理器中显卡设备异常报错43 3、事件查看器提示显卡被意外删除 4、无法打开显卡驱动控制面板
二、定位问题: 1、排查虚拟机环境配置问题,将启动模式修改为uefi,主板设置为q35,更换显卡驱动,但Q35不支持L20的显卡,改为uefi和驱动后依然没有效果。 2、将服务器重新安装为物理windows2022server,同时安装驱动,能够安装驱动以及识别显卡,证明硬件无异常 3、重新装回深信服超融合,进入asv后台,查看显卡pci信息(由于是直通场景,超融合没有安装显卡驱动,直接用lspci命令查看显卡)发现显卡的bar内存只申请到了8G,找到关键原因。 问题解析 1、什么是 PCIe BAR(Base Address Register)? CPU 想要读写显卡上的显存,并不能直接伸手去摸,必须通过 PCIe 总线在内存地址空间里开一个“窗口”。CPU 看着这个窗口,就能映射到显卡内部的显存。这个窗口的大小,就是你在 lspci 里看到的 size。 2、L20 的特殊性 NVIDIA L20 拥有约 48GB 的物理显存。 当识别为 8G 时:CPU 每次只能透过这个 8GB 的窗口看到一小部分显存。如果程序需要访问整块显存,CPU 就得频繁地“翻页”或切换映射地址,效率极低,且会导致驱动程序架构逻辑冲突。 3、现代驱动的要求:对于 L20 这种 Ampere/Lovelace 架构的卡,NVIDIA 驱动默认要求开启 Resizable BAR (Re-Size BAR) 或者直接分配一个大于物理显存的静态窗口(如 64GB)。如果窗口只有 8G,驱动自检时会认为硬件资源不足或分配异常,从而触发 “设备管理器代码 43”。 因此在虚拟化直通环境中asv加载的是 vfio-pci这种占位用的存根驱动,只能识别到8G的资源映射表直通给虚拟机,因此在虚拟机主板中,会认为这张显卡就是只有8G,安装驱动时,驱动自检就会报异常43 而直接物理安装windows驱动正常是因为nvidia驱动会主动向主板发起动态寻址,向主板申请更大的内存,因此直接安装物理机一切正常。
三、排障思路 1、在同型号的ubuntu系统中lspci查看,发现显卡显示的是64G,说明linux内核驱动是支持这个显卡的,怀疑主板配置问题,咨询了dell厂家,该型号默mmiou的bar大小为1024T,完全满足该显卡运行。 2、为了验证是否asv兼容性问题,使用ubuntu桌面体验版进入系统,使用lspci依然是8G,确认是硬件问题导致的。 使用nvidia工具查看显卡状态,发现L20显卡提示可视化功能已打开 L20 在这种模式下,会强行开启一种叫“可扩展可视化”的特性。在 NVIDIA 的底层逻辑里,这个特性会要求主板 BIOS 分配一组非常特殊的、非连续的或者受限的物理内存地址。而戴尔 R760xa 的 BIOS 在处理这种请求时,如果不经过特殊配置,就会因为分配不下而退化成最保守的 8G。 /displaymodeselector --gpumode physical_display_disable 通过这个命令从物理硬件层面,彻底禁用所有显卡的显示输出功能。 使用该命令后可看到3个选项,显卡现在的状态就是2导致的。我们选择1将显卡的显示功能关闭。 询问是否全部切换工作模式,选择y 确认后开始执行,所有显卡提示转换成功即可。完成后手动重启物理主机生效 重启后使用lspci -vvv -s 查看显卡状态,看到显卡的bar内存大小已变为64G 重新为虚拟机直通显卡 安装驱动后,虚拟机内输入nvidia-smi可正常看到显卡,问题解决 问题根因: L20 虽然是计算卡,但它底层可能带了一部分虚拟显示控制逻辑(刚才看到的 Scalable visualization 就是证据)。 之前的状态:显卡觉得自己要负责“显示输出”,所以它会向主板请求一组特殊的、复杂的 PCIe 资源池。戴尔主板 BIOS 比较死板,一看是显示设备,就只按照老规矩给它分配最保守的 8G。 这条命令的作用:它直接改写显卡固件,告诉显卡:“你从今往后就是个纯纯的算力干活机器,把所有显示相关的物理开关全都关掉。 结果就是:一旦禁用了物理显示,显卡对 PCIe 资源的诉求会变得极度简单粗暴。主板 BIOS 再次自检时,会发现这只是个纯计算设备,就会毫无压力地吐出那 64G 的完整空间
PS:这个问题真的非常隐蔽,整整排查了3天,觉得很有分享意义 |