这是偶然发现的问题,来自于使用gazebo进行训练时,查看nvidia-smi发现并没有使用gpu资源,虽然使用的非常少但是如果不使用的话fps还是会非常小的,所以才发现了xorg没有使用gpu的问题,这个其实也算是驱动安装的问题,如果正常安装好的话应该是不会有这个问题才对(此时可以自由调节分辨率)
为什么我的 Gazebo / OpenGL 一直是 llvmpipe?
直接查询通过glxinfo | grep "OpenGL vendor",只要不是nvidia的就应该是有问题的。
------一次服务器图形栈「显卡存在但不被使用」的完整剖析
1. 问题现象回顾
环境在修复前是:
DISPLAY = :1
OpenGL vendor = Mesa/X.org
OpenGL renderer = llvmpipe
bash
xrandr --listproviders
Provider 0: modesetting
Provider 1: NVIDIA-G0
关键现象总结:
NVIDIA GPU 被内核识别(NVIDIA-G0 存在)
但 Xorg 的 OpenGL 实际使用的是 Mesa
Gazebo / glxinfo 全部走 CPU software renderer
服务器 + NVIDIA 显卡 + 默认图形配置下最典型的一种"半可用状态"。
2. 根本原因:GPU 存在 ≠ OpenGL 使用 GPU
2.1 Linux 图形栈的三层结构(关键背景)
很多人误以为:
装了 NVIDIA 驱动 → OpenGL 就会用 GPU
这是 不成立的。
Linux 图形栈是 三层解耦的:
sh
┌──────────────┐
│ Application │ ← gazebo / glxinfo
└──────────────┘
↓ OpenGL
┌──────────────┐
│ libGL.so │ ← Mesa or NVIDIA
└──────────────┘
↓
┌──────────────┐
│ Xorg │ ← 选择哪个 GPU provider
└──────────────┘
↓
┌──────────────┐
│ Kernel DRM │ ← nvidia / modesetting
└──────────────┘
只要其中任何一层没选 NVIDIA,最终就会 fallback 到 llvmpipe
3. 这台服务器「具体卡在哪里」
3.1 DISPLAY=:1 ------ 你不是主显示会话
在服务器上:
:0 → 通常是 物理主显示
:1 → 往往是:
GDM / LightDM 创建的 次级会话
或远程 / 登录管理器生成的 X session
很多发行版默认让 :1 走 modesetting
3.2 xrandr --listproviders
Provider 0: modesetting ← 被 Xorg 选中
Provider 1: NVIDIA-G0 ← 只是"存在",没被用
这说明:
NVIDIA GPU 已经注册为 Render Provider
但 没有被 Xorg 绑定为主 provider
所以 OpenGL 默认走:
modesetting → Mesa → llvmpipe
3.3 OpenGL vendor string: Mesa/X.org
这是决定性证据:
OpenGL 的 libGL.so 来自 Mesa,而不是 NVIDIA
即使:
nvidia-smi 正常
CUDA 可用
👉 OpenGL 仍然是 CPU
4. nvidia-xconfig 重新配置
执行了:
bash
sudo nvidia-xconfig
sudo systemctl restart display-manager
这一步的本质是:
4.1 生成 /etc/X11/xorg.conf
nvidia-xconfig 自动生成了类似这样的配置:
Section "Device"
Identifier "NVIDIA Device"
Driver "nvidia"
BusID "PCI:xx:yy:z"
EndSection
并强制:
Xorg 使用 nvidia 驱动
而不是 modesetting
4.2 结果:Xorg 主 provider 切换
修复后会看到:
xrandr --listproviders
变成类似:
Provider 0: NVIDIA-0
这意味着:
Xorg → NVIDIA DRM → NVIDIA libGL → GPU
于是:
glxinfo | grep "OpenGL vendor"
变成:
OpenGL vendor string: NVIDIA Corporation
Gazebo、OGRE、OpenGL 才真正上了 GPU。
5. 为什么服务器默认"不用 NVIDIA"
这是设计选择,不是 bug。
服务器发行版(Ubuntu Server / CentOS)默认策略:
优先稳定、兼容
不假设一定有显示器
不假设一定需要 OpenGL
因此:
组件 默认
Xorg driver modesetting
OpenGL Mesa
GPU 仅 CUDA
👉 这对 深度学习服务器 是合理的
👉 对 Gazebo / 仿真 则是灾难
- 如果我想「还回去」,该怎么做?
你这个问题问得非常专业 👍
下面给你 三种安全回退方式。
✅ 方式:删除 xorg.conf(最干净)
sudo rm /etc/X11/xorg.conf
sudo systemctl restart display-manager
系统会回到:
bash
modesetting
Mesa
llvmpipe
bash
注意,服务器上是用不了的。所以不能用于gazebo训练~
经过配置之后,gazebo的fps会有所提高。