Bumblebee
来自 Bumblebee 的 FAQ
- Bumblebee 旨在让配备 NVIDIA Optimus 技术的笔记本电脑在 GNU/Linux 系统上正常工作。此功能涉及两块具有不同功耗配置的显卡,它们以分层方式插入并共享同一个帧缓冲区。
- Bumblebee 存在显著的性能问题[1][2]。参见 NVIDIA Optimus 获取替代方案。
- NVIDIA 已经在其 Linux 驱动中实现了 PRIME,这使得 Bumblebee 和其他替代方案变得过时。
Bumblebee:Linux 的 Optimus 方案
Optimus 技术是一种没有硬件多路复用器的混合图形实现。集成 GPU 管理显示,而独立 GPU 管理大部分繁重的渲染工作,并将工作结果发送到集成 GPU 进行显示。当笔记本电脑使用电池供电时,独立 GPU 会关闭以节省电量并延长电池寿命。它也已成功在具有 Intel 集成显卡和 NVIDIA 独立显卡的台式机上进行了测试。
Bumblebee 是一个包含两个部分的软件实现
- 在独立显卡上进行离屏渲染,并使用集成显卡将其显示在屏幕上。此桥接由 VirtualGL 或 primus(见下文)提供,并连接到为独立显卡启动的 X 服务器。
- 在不使用时禁用独立显卡(请参阅 #电源管理 章节)
它试图模拟 Optimus 技术的行为;在需要时使用独立 GPU 进行渲染,并在不使用时关闭它。目前的版本仅支持按需渲染,尚未实现基于工作负载自动启动独立显卡程序的机制。
安装
在安装 Bumblebee 之前,请检查您的 BIOS 并激活 Optimus(旧笔记本电脑称为“可切换显卡”),如果可能的话(BIOS 不一定有此选项)。如果 BIOS 中既没有“Optimus”也没有“switchable”,请确保两个 GPU 都已启用,并且集成显卡 (igfx) 是初始显示(主显示)。显示器应连接到板载集成显卡,而不是独立显卡。如果之前已禁用集成显卡并安装了独立显卡驱动程序,请务必删除 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d 中与独立显卡相关的配置文件。
安装:
- bumblebee - 提供守护进程和客户端程序的主软件包。
- mesa - OpenGL 规范的开源实现。
- 适当版本的 NVIDIA 驱动程序,参见 NVIDIA#安装。
- 可选安装 xf86-video-intel - Intel Xorg 驱动程序。
如需 32 位应用程序支持,请启用 multilib 仓库并安装
- lib32-virtualgl - 适用于 32 位应用程序的渲染/显示桥接。
- lib32-nvidia-utils 或 lib32-nvidia-340xx-utilsAUR (需匹配常规 NVIDIA 驱动程序的版本)。
为了使用 Bumblebee,必须将您的常规用户添加到 bumblebee 组中
# gpasswd -a user bumblebee
同时 启用 bumblebeed.service。重启您的系统并按照 #用法 操作。
用法
测试
安装 mesa-utils 并使用 glxgears 来测试 Bumblebee 是否在您的 Optimus 系统上工作
$ optirun glxgears -info
如果失败,请尝试以下命令 (来自 virtualgl)
$ optirun glxspheres64
如果出现了带有动画的窗口,说明 Bumblebee 的 Optimus 方案正在工作。
glxgears 失败,但 glxspheres64 成功,请在所有情况下将 glxgears 替换为 glxspheres64。常规用法
$ optirun [options] application [application-parameters]
例如,使用 Optimus 启动 Windows 应用程序
$ optirun wine application.exe
另一个例子,使用 Optimus 打开 NVIDIA 设置面板
$ optirun -b none nvidia-settings -c :8
有关所有可用选项的列表,请参见 optirun(1)。
配置
您可以配置 Bumblebee 的行为以满足您的需求。速度优化、电源管理等微调可以在 /etc/bumblebee/bumblebee.conf 中进行配置。
速度优化
离屏渲染方法的一个缺点是性能。下表概要介绍了在配备 NVIDIA GTX 1060 6GB 和 unigine-heavenAUR 基准测试 (1920x1080, 最高设置, 8x AA) 的 eGPU 设置中 Lenovo ThinkPad T480 的概况
| 命令 | 显示 | FPS | 得分 | 最小 FPS | 最大 FPS |
|---|---|---|---|---|---|
| optirun unigine-heaven | 内置 | 20.7 | 521 | 6.9 | 26.6 |
| primusrun unigine-heaven | 内置 | 36.9 | 930 | 15.3 | 44.1 |
| unigine-heaven | 内部运行于 Nvidia-xrun | 51.3 | 1293 | 8.4 | 95.6 |
| unigine-heaven | 外部运行于 Nvidia-xrun | 56.1 | 1414 | 8.4 | 111.9 |
使用 VirtualGL 作为桥接
Bumblebee 使用 VirtualGL 在一个不可见的 X 服务器上为您的 Optimus NVIDIA 卡渲染帧,并将它们传回您可见的 X 服务器。帧在传输前会被压缩——这节省了带宽并可用于 Bumblebee 的速度优化。
要为单个应用程序使用另一种压缩方法
$ optirun -c compress-method application
压缩方法会影响 GPU/CPU 的使用性能。压缩方法主要会负载 CPU。然而,未压缩的方法主要会负载 GPU。
压缩方法
jpegrgbyuv
未压缩方法
proxyxv
这是一个使用 ASUS N550JV 笔记本电脑和基准测试应用 unigine-heavenAUR 测试的性能表
| 命令 | FPS | 得分 | 最小 FPS | 最大 FPS |
|---|---|---|---|---|
| optirun unigine-heaven | 25.0 | 630 | 16.4 | 36.1 |
| optirun -c jpeg unigine-heaven | 24.2 | 610 | 9.5 | 36.8 |
| optirun -c rgb unigine-heaven | 25.1 | 632 | 16.6 | 35.5 |
| optirun -c yuv unigine-heaven | 24.9 | 626 | 16.5 | 35.8 |
| optirun -c proxy unigine-heaven | 25.0 | 629 | 16.0 | 36.1 |
| optirun -c xv unigine-heaven | 22.9 | 577 | 15.4 | 32.2 |
jpeg 压缩方法时会出现卡顿峰值。要为所有应用程序使用标准压缩,请在 /etc/bumblebee/bumblebee.conf 中将 VGLTransport 设置为 压缩方法
/etc/bumblebee/bumblebee.conf
[...] [optirun] VGLTransport=proxy [...]
您还可以尝试 VirtualGL 从您的显卡读取像素的方式。将 VGL_READBACK 环境变量 设置为 pbo 应该可以提高性能。比较以下
PBO 应该更快
VGL_READBACK=pbo optirun glxgears
默认值是 sync
VGL_READBACK=sync optirun glxgears
Primusrun
primusrun (来自 primus) 正成为默认选择,因为它消耗的电量更少,并且有时比 optirun/virtualgl 提供更好的性能。它可以单独运行,但它不像 optirun 那样接受选项。将 primus 设置为 optirun 的桥接提供了更多的灵活性。
对于 64 位机器上的 32 位应用程序支持,请安装 lib32-primus (必须启用 multilib)。
您可以单独运行它
$ primusrun glxgears
或者作为 optirun 的桥接。默认配置将 virtualgl 设置为桥接。在命令行上覆盖它
$ optirun -b primus glxgears
或者,在 /etc/bumblebee/bumblebee.conf 中设置 Bridge=primus,这样您就不必在命令行上指定它。
VSYNC,请参考 #Primusrun 鼠标延迟 (禁用 VSYNC)。它还可以消除鼠标输入延迟,并略微提高性能。Pvkrun
来自 primus_vk 软件包的 pvkrun 是 primusrun 的直接替代品,它允许运行 Vulkan 应用程序。可以使用来自 vulkan-tools 的 vulkaninfo 进行快速检查。
$ pvkrun vulkaninfo
电源 management
电源管理功能的目标是在 Bumblebee 不再使用 NVIDIA 卡时将其关闭。如果安装了 bbswitch (针对 linux) 或 bbswitch-dkms (针对 linux-lts 或自定义内核),它会在 Bumblebee 守护进程启动时自动检测到。无需额外的配置。但是,bbswitch 仅适用于 Optimus 笔记本电脑,在台式机上无法工作。因此,Bumblebee 电源管理在台式机上不可用,也没有理由在台式机上安装 bbswitch。(尽管如此,Bumblebee 的其他功能确实可以在某些台式机上工作。)
要使用 bbswitch 手动开启或关闭显卡,请写入 /proc/acpi/bbswitch
# echo OFF > /proc/acpi/bbswitch # echo ON > /proc/acpi/bbswitch
使用 bbswitch 设置 NVIDIA 卡的默认电源状态
bbswitch 的默认行为是保持显卡电源状态不变。bumblebeed 在启动时会禁用该显卡,因此仅当您在没有 bumblebeed 的情况下使用 bbswitch 时,才需要执行以下操作。
根据需要设置 load_state 和 unload_state 内核模块参数 (参见 bbswitch 文档)。
/etc/modprobe.d/bbswitch.conf
options bbswitch load_state=0 unload_state=1
要在系统启动时在没有 bumblebeed 的情况下运行 bbswitch,请不要忘记将 bbswitch 添加到 /etc/modules-load.d,如 Kernel module#systemd 中所述。
关机时启用 NVIDIA 卡
在某些笔记本电脑上,如果上次关机时显卡已关闭,则 NVIDIA 卡在启动期间可能无法正确初始化。因此,由于 /etc/bumblebee/bumblebee.conf 中的(默认)设置 TurnCardOffAtExit=false,Bumblebee 守护进程会在停止守护进程(例如关机时)时为 GPU 加电。请注意,此设置不会影响守护进程运行时的电源状态,因此,如果所有 optirun 或 primusrun 程序已退出,GPU 仍将处于断电状态。
当您手动停止守护进程时,您可能希望在关机时为显卡加电,同时保持显卡断电。要实现后者,请添加以下 systemd 服务 (如果使用 bbswitch)
/etc/systemd/system/nvidia-enable.service
[Unit] Description=Enable NVIDIA card DefaultDependencies=no [Service] Type=oneshot ExecStart=/bin/sh -c 'echo ON > /proc/acpi/bbswitch' [Install] WantedBy=shutdown.target
然后 启用 nvidia-enable.service 单元。
从挂起状态唤醒后启用 NVIDIA 卡
Bumblebee 守护进程可能在挂起后无法激活显卡。一个可能的修复方法是将 bbswitch 设置为电源管理的默认方法
/etc/bumblebee/bumblebee.conf
[driver-nvidia] PMMethod=bbswitch [driver-nouveau] PMMethod=bbswitch
如果上述修复失败,请尝试以下命令
# echo 1 > /sys/bus/pci/rescan
要在挂起后自动重新扫描 PCI 总线,请按照 Power management/Suspend and hibernate#Hooks in /usr/lib/systemd/system-sleep 中的说明创建脚本。
多显示器
连接至 Intel 芯片的输出端口
如果端口(DisplayPort/HDMI/VGA)连接至 Intel 芯片,您可以使用 xorg.conf 设置多台显示器。将它们设置为使用 Intel 显卡,但 Bumblebee 仍然可以使用 NVIDIA 显卡。下面的配置示例适用于两个 1080p 分辨率且使用 HDMI 输出的相同屏幕。
/etc/X11/xorg.conf
Section "Screen"
Identifier "Screen0"
Device "intelgpu0"
Monitor "Monitor0"
DefaultDepth 24
Option "TwinView" "0"
SubSection "Display"
Depth 24
Modes "1920x1080_60.00"
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "intelgpu1"
Monitor "Monitor1"
DefaultDepth 24
Option "TwinView" "0"
SubSection "Display"
Depth 24
Modes "1920x1080_60.00"
EndSubSection
EndSection
Section "Monitor"
Identifier "Monitor0"
Option "Enable" "true"
EndSection
Section "Monitor"
Identifier "Monitor1"
Option "Enable" "true"
EndSection
Section "Device"
Identifier "intelgpu0"
Driver "intel"
Option "UseEvents" "true"
Option "AccelMethod" "UXA"
BusID "PCI:0:2:0"
EndSection
Section "Device"
Identifier "intelgpu1"
Driver "intel"
Option "UseEvents" "true"
Option "AccelMethod" "UXA"
BusID "PCI:0:2:0"
EndSection
Section "Device"
Identifier "nvidiagpu1"
Driver "nvidia"
BusID "PCI:0:1:0"
EndSection
您可能需要更改 Intel 卡和 NVIDIA 卡的 BusID。
$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller [8086:0126] (rev 09)
BusID 是 0:2:0。请注意,lspci 输出的是十六进制值,但 Xorg 需要十进制值。
连接至 NVIDIA 芯片的输出端口
在某些笔记本上,数字视频输出(HDMI 或 DisplayPort)硬连接到 NVIDIA 芯片。如果您想在这样的系统上同时使用所有显示器,最简单的解决方案是使用 intel-virtual-output,这是 xf86-video-intel 驱动程序集(v2.99 起)中提供的工具。它允许您将现有的 X 会话扩展到其他屏幕上,利用虚拟输出与独立显卡一起工作。用法如下
$ intel-virtual-output [OPTION]... [TARGET_DISPLAY]...
-d <source display> source display -f keep in foreground (do not detach from console and daemonize) -b start bumblebee -a connect to all local displays (e.g. :1, :2, etc) -S disable use of a singleton and launch a fresh intel-virtual-output process -v all verbose output, implies -f -V <category> specific verbose output, implies -f -h this help
如果单独使用此命令无效,您可以尝试使用 optirun 运行它以启用独立显卡并允许其相应地检测输出。已知这对于 Lenovo Legion Y720 是必要的。
$ optirun intel-virtual-output
如果命令行中没有解析到目标显示器,intel-virtual-output 将尝试连接到任何本地显示器。检测到的显示器可以通过任何桌面显示管理器(如 xrandr 或 KDE Display)进行管理。该工具还将启动 bumblebee(可以使用默认安装)。有关更多信息,请参阅 Bumblebee 维基页面。
当在终端中运行时,除非使用 -f 开关,否则 intel-virtual-output 将自动成为守护进程。游戏可以通过先导出显示 export DISPLAY=:8,然后运行 optirun game_bin 在外部屏幕上运行,但是,光标和键盘不会被完全捕获。使用 export DISPLAY=:0 恢复标准操作。
如果 intel-virtual-output 没有检测到显示器,或者收到 no VIRTUAL outputs on ":0" 消息,则 创建
/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
Identifier "intelgpu0"
Driver "intel"
EndSection
它默认确实存在,并且
/etc/bumblebee/xorg.conf.nvidia
Section "ServerLayout"
Identifier "Layout0"
Option "AutoAddDevices" "true"
Option "AutoAddGPU" "false"
EndSection
Section "Device"
Identifier "DiscreteNvidia"
Driver "nvidia"
VendorName "NVIDIA Corporation"
Option "ProbeAllGpus" "false"
Option "NoLogo" "true"
Option "UseEDID" "true"
Option "AllowEmptyInitialConfiguration"
# Option "UseDisplayDevice" "none"
EndSection
Section "Screen"
Identifier "Screen0"
Device "DiscreteNvidia"
EndSection
有关尝试进一步配置的信息,请参阅 [3]。如果笔记本电脑屏幕被拉伸且光标位置错误,而外部显示器仅显示光标,请尝试关闭所有正在运行的组合管理器。
如果您不想使用 intel-virtual-output,另一个选择是配置 Bumblebee 以保持独立 GPU 开启,并直接配置 X 以同时使用两个屏幕,因为它将能够检测到它们。
作为最后的手段,您可以运行 2 个 X 服务器。第一个将使用 Intel 驱动程序用于笔记本电脑屏幕。第二个将通过 optirun 在 NVIDIA 卡上启动,以在外部显示器上显示。在手动使用 optirun 启动桌面环境之前,请确保禁用任何显示/会话管理器。然后,您可以登录到由集成显卡驱动的那个。
禁用屏幕熄灭
您可以使用 xset 并适当地设置 DISPLAY 环境变量,在使用 intel-virtual-output 时禁用屏幕熄灭(有关更多信息,请参见 DPMS)
$ DISPLAY=:8 xset -dpms s off
多块 NVIDIA 显卡或 NVIDIA Optimus
如果您有多块 NVIDIA 显卡(例如,当将 eGPU 与另一块内置 NVIDIA 显卡的笔记本电脑一起使用时)或 NVIDIA Optimus,您需要对 /etc/bumblebee/xorg.conf.nvidia 进行微小编辑。如果不进行此更改,守护进程可能会默认使用内部 NVIDIA 卡。
首先,确定外部显卡的 BusID
$ lspci -ndd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation HD Graphics 530 [8086:191b] (rev 06) (prog-if 00 [VGA controller]) 01:00.0 3D controller [0302]: NVIDIA Corporation GM107M [GeForce GTX 960M] [10de:139b] (rev ff) (prog-if ff) 0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070] [10de:1b81] (rev a1)
在这种情况下,BusID 是 0b:00.0。
现在编辑 /etc/bumblebee/xorg.conf.nvidia 并将以下行添加到 Section "Device"
/etc/bumblebee/xorg.conf.nvidia
Section "Device"
...
BusID "PCI:11:00:0"
Option "AllowExternalGpus" "true" # If the GPU is external
...
EndSection
0b 变成了十进制的 11。故障排除
[VGL] ERROR: Could not open display :8
一些 wine 应用程序存在已知问题,它们在没有跟踪的情况下 fork 并杀死了父进程(例如免费在线游戏 "Runes of Magic")。
这是 VirtualGL 的一个已知问题。从 bumblebee 3.1 开始,只要您安装了它,您就可以使用 Primus 作为您的渲染桥接。
$ optirun -b primus wine windows program.exe
如果这不起作用,解决此问题的替代方法是
$ optirun bash $ optirun wine windows program.exe
如果使用 NVIDIA 驱动程序,此问题的修复方法是编辑 /etc/bumblebee/xorg.conf.nvidia 并将 Option ConnectedMonitor 更改为 CRT-0。
Xlib: extension "GLX" missing on display ":0.0"
如果您试图从 NVIDIA 网站安装 NVIDIA 驱动程序,这是行不通的。
- 以类似的方式卸载该驱动程序
# ./NVIDIA-Linux-*.run --uninstall
- 删除 NVIDIA 生成的 Xorg 配置文件
# rm /etc/X11/xorg.conf
- (重新)安装正确的 NVIDIA 驱动程序:参见 #安装。
[ERROR]Cannot access secondary GPU: No devices detected
在某些情况下,运行 optirun 将返回
[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected. [ERROR]Aborting because fallback start is disabled.
在这种情况下,您需要将 /etc/X11/xorg.conf.d/20-intel.conf 文件移动到其他位置,重启 bumblebeed 守护进程,它应该可以工作。如果您确实需要更改 Intel 模块的一些功能,解决方法是将 /etc/X11/xorg.conf.d/20-intel.conf 合并到 /etc/X11/xorg.conf 中。
可能还需要注释掉 /etc/X11/xorg.conf.d/10-monitor.conf 中的 driver 行。
如果您正在使用 nouveau 驱动程序,您可以尝试切换到 NVIDIA 驱动程序。
您可能需要在某个地方(例如 /etc/bumblebee/xorg.conf.nvidia 文件)定义 NVIDIA 卡,并根据 lspci 输出使用正确的 BusID
Section "Device"
Identifier "nvidiagpu1"
Driver "nvidia"
BusID "PCI:0:1:0"
EndSection
请注意,lspci 输出的格式是十六进制,而 xorg 中是十进制。因此,如果 lspci 的输出是 0a:00.0,则 BusID 应该是 PCI:10:0:0。
NVIDIA(0): Failed to assign any connected display devices to X screen 0
如果控制台输出是
[ERROR]Cannot access secondary GPU - error: [XORG] (EE) NVIDIA(0): Failed to assign any connected display devices to X screen 0 [ERROR]Aborting because fallback start is disabled.
如果 /etc/bumblebee/xorg.conf.nvidia 中不存在以下行,您可以将其添加到 "Device" 部分
Option "ConnectedMonitor" "DFP"
如果它已经存在,您可以尝试将其更改为
Option "ConnectedMonitor" "CRT"
之后,重启 Bumblebee 服务以应用这些更改。
初始化PCI上的NVIDIA GPU失败:1:0:0 (GPU已从总线移除 / RmInitAdapter 失败!)
将 rcutree.rcu_idle_gp_delay=1 添加到 引导加载程序 配置的 内核参数 中(另请参阅原始 BBS 帖子 获取配置示例)。
Failed to initialize the NVIDIA GPU at PCI:1:0:0 (Bumblebee daemon reported: error: [XORG] (EE) NVIDIA(GPU-0))
您可能会遇到在从睡眠状态恢复后,primusrun 或 optirun 命令不再工作的问题。有两种方法可以修复此问题——重启系统或执行以下命令
# echo 1 > /sys/bus/pci/rescan
并尝试测试 primusrun 或 optirun 是否有效。
如果上述命令没有帮助,请尝试查找 NVIDIA 卡的总线 ID
$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation Core Processor Integrated Graphics Controller [8086:0042] (rev 18) 01:00.0 VGA compatible controller [0300]: nVidia Corporation Device 0df4 [10de:0df4] (rev a1)
例如,上面的命令显示了 01:00.0,因此我们使用带此总线 ID 的以下命令
# echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove # echo 1 > /sys/bus/pci/rescan
Could not load GPU driver
如果控制台输出是
[ERROR]Cannot access secondary GPU - error: Could not load GPU driver
如果您尝试加载 nvidia 模块
# modprobe nvidia
modprobe: ERROR: could not insert 'nvidia': Exec format error
这可能是因为 nvidia 驱动程序与 Linux 内核不同步,例如,如果您安装了最新的 NVIDIA 驱动程序,但已经有一段时间没有更新内核了。进行完整的系统更新,然后重启进入更新后的内核。
NOUVEAU(0): [drm] failed to set drm interface version
考虑切换到官方 NVIDIA 驱动程序。正如上游所评论的那样,nouveau 驱动程序在某些显卡和 Bumblebee 上存在一些问题。
[ERROR]Cannot access secondary GPU - error: X did not start properly
在 /etc/bumblebee/xorg.conf.nvidia 中将 "AutoAddDevices" 选项设置为 "true" (参见 此处)
Section "ServerLayout"
Identifier "Layout0"
Option "AutoAddDevices" "true"
Option "AutoAddGPU" "false"
EndSection
/dev/dri/card0: failed to set DRM interface version 1.4: Permission denied
这可以通过在 /etc/bumblebee/xorg.conf.nvidia 中附加以下行来解决 (参见 此处)
Section "Screen"
Identifier "Default Screen"
Device "DiscreteNvidia"
EndSection
ERROR: ld.so: object 'libdlfaker.so' from LD_PRELOAD cannot be preloaded: ignored
您可能想在 64 位系统上使用 Bumblebee 启动 32 位应用程序。请参见 #安装 中的“对于 32 位...”部分。如果问题仍然存在或者它是 64 位应用程序,请尝试使用 primus 桥接。
Fatal IO error 11 (Resource temporarily unavailable) on X server
将 /etc/bumblebee/bumblebee.conf 中的 KeepUnusedXServer 从 false 更改为 true。您的程序 fork 到后台,而 bumblebee 对此一无所知。
视频撕裂
视频撕裂是 Bumblebee 上的一个常见问题。要修复它,您需要启用 vsync。它应该在 Intel 卡上默认启用,但请从 Xorg 日志中验证这一点。要检查它是否为 NVIDIA 启用,请确保安装了 nvidia-settings 并运行
$ optirun nvidia-settings -c :8
X Server XVideo Settings -> Sync to VBlank 和 OpenGL Settings -> Sync to VBlank 都应该启用。Intel 卡的撕裂现象通常较少,因此将其用于视频播放。特别是使用 VA-API 进行视频解码(例如 mplayer-vaapi 并带 -vsync 参数)。
有关如何修复 Intel 卡上的撕裂,请参考 Intel graphics#Tearing。
如果仍未解决,请尝试从桌面环境中禁用组合效果。还要尝试禁用三重缓冲。
Bumblebee cannot connect to socket
您可能会得到类似
$ optirun glxspheres64
或 (对于 32 位)
$ optirun glxspheres32
[ 1648.179533] [ERROR]You have no permission to communicate with the Bumblebee daemon. Try adding yourself to the 'bumblebee' group [ 1648.179628] [ERROR]Could not connect to bumblebee daemon - is it running?
如果您已经在 bumblebee 组中 (groups | grep bumblebee),您可以尝试 移除 socket /var/run/bumblebeed.socket。
此错误的另一个原因可能是您实际上没有在 BIOS 中打开两个 GPU,因此,Bumblebee 守护进程实际上没有在运行。请仔细检查 BIOS 设置,确保已启用集成显卡(Intel graphics - 在 BIOS 中可能缩写为 igfx 之类)或设置为自动,并且它是主 GPU。显示器应连接到板载集成显卡,而不是独立显卡。
如果您错误地将显示器连接到独立显卡且 Intel 显卡被禁用,您可能是在第一次尝试单独运行 NVIDIA 后安装了 Bumblebee。在这种情况下,请务必删除 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/20-nvidia.conf 配置文件。如果配置文件指示 Xorg 使用 NVIDIA,则 X 将无法运行。
登录后从控制台运行 X.org (无根 X.org)
请参阅 Xorg#Rootless Xorg。
使用 Primus 导致段错误
在某些情况下,使用 primusrun 而不是 optirun 会导致段错误。这是由代码自动检测更快的上传方法的问题引起的,请参见 FS#58933。
解决方法是通过手动将 PRIMUS_UPLOAD 环境变量 设置为 1 或 2(取决于您的设置中哪一个更快)来跳过自动检测。
$ PRIMUS_UPLOAD=1 primusrun ...
Primusrun 鼠标延迟 (禁用 VSYNC)
对于 primusrun,VSYNC 默认启用,因此它可能会导致鼠标输入延迟,甚至略微降低性能。测试禁用 VSYNC 的 primusrun
$ vblank_mode=0 primusrun glxgears
如果您对上述设置满意,请创建一个 别名 (例如 alias primusrun="vblank_mode=0 primusrun")。
性能比较
| VSYNC 已启用 | FPS | 得分 | 最小 FPS | 最大 FPS |
|---|---|---|---|---|
| FALSE | 31.5 | 793 | 22.3 | 54.8 |
| TRUE | 31.4 | 792 | 18.7 | 54.2 |
使用 ASUS N550JV 笔记本电脑和基准测试应用 unigine-heavenAUR 测试。
组合窗口管理器下的 Primus 问题
由于组合会损害性能,因此不建议在激活组合窗口管理器时调用 primus。[4] 如果您需要在组合时使用 primus 并看到闪烁或性能不佳,同步 primus 的显示线程与应用程序的渲染线程可能会有所帮助
$ PRIMUS_SYNC=1 primusrun ...
这使得 primus 显示之前渲染的帧。
从待机恢复后 Bumblebee 出现问题
在某些系统中,可能会发生从待机状态恢复后加载 nvidia 模块的情况。解决此问题的一个可能方法是安装 acpi_call 和 acpi 软件包。
Optirun does not work, no debug output
用户报告说在某些情况下,即使 Bumblebee 安装正确,运行
$ optirun glxgears -info
没有任何输出,并且 glxgears 窗口没有出现。任何需要 3d 加速的程序都会崩溃
$ optirun bash $ glxgears Segmentation fault (core dumped)
显然这是某些版本的 virtualgl 的 bug。所以一个解决方法是改用 #Primusrun。有关更多信息,请参见 此论坛帖子。
内核 4.8 损坏的电源管理
如果您有更新的笔记本电脑(BIOS 日期为 2015 年或更新),那么 Linux 4.8 可能会损坏 bbswitch (bbswitch issue 140),因为 bbswitch 不支持较新的、推荐的电源管理方法。结果,GPU 可能无法加电、无法断电,或者更糟。
作为解决方法,将 pcie_port_pm=off 添加到您的 内核参数 中。
或者,如果您只对节能(也许是外接显示器的使用)感兴趣,请卸载 bbswitch 并依赖 Nouveau 运行时电源管理(支持新方法)。
powertop --auto-tune 会自动在 PCI 设备上启用电源管理,这会导致同样的问题 [5]。使用相同的解决方法或不要使用一体化电源管理工具。死锁问题(lspci 挂起)
参见 NVIDIA Optimus#Lockup issue (lspci hangs) 了解影响带有 GTX 965M(或类似显卡)的新笔记本电脑的问题。
独立显卡常开和 ACPI 警告
将 acpi_osi=Linux 添加到您的 内核参数 中。有关更多信息,请参见 [6] 和 [7]。
Screen 0 已删除,因为没有匹配的配置部分
修改配置如下
/etc/bumblebee/xorg.conf.nvidia
...
Section "ServerLayout"
...
Screen 0 "nvidia"
...
EndSection
...
Section "Screen"
Identifier "nvidia"
Device "DiscreteNvidia"
EndSection
...
不稳定的、不可预测的行为
如果 Bumblebee 以随机方式启动/工作,请检查您是否已设置 Network configuration#Local network hostname resolution (详情在 这里)。
独立显卡常开且 NVIDIA 驱动程序无法卸载
确保 nvidia-persistenced.service 已禁用且当前未激活。它旨在让 NVIDIA 驱动程序始终运行 [8],这会阻止显卡被关闭。
当某些应用程序请求 EGL 时,独立显卡被静默激活
如果独立显卡被某些程序激活(例如带有 GPU 后端的 mpv),它可能会一直保持开启状态。问题可能是 libglvnd,它正在加载 NVIDIA 驱动程序并激活显卡。
要禁用此功能,请设置环境变量 __EGL_VENDOR_LIBRARY_FILENAMES (参见 文档) 仅加载 mesa 配置文件
__EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/50_mesa.json"
nvidia-utils (及其分支) 会在 /usr/share/glvnd/egl_vendor.d/10_nvidia.json 安装配置文件,该文件具有优先级并导致 libglvnd 加载 NVIDIA 驱动程序并启用显卡。
另一种解决方案是 避免安装 由 nvidia-utils 提供的配置文件。
帧率在固定时间后下降至 1 FPS
使用 NVIDIA 440.36 驱动程序,DPMS 设置默认启用,导致在固定时间(例如 10 分钟)后超时,从而导致帧率降至 1 FPS。为了解决这个问题,将以下行添加到 /etc/bumblebee/xorg.conf.nvidia 中的 "Device" 部分
Option "HardDPMS" "false"
应用程序无法录制屏幕
使用 Bumblebee 时,应用程序无法访问屏幕来识别和录制它。例如,使用开启 NVENC 的 obs-studio 时会发生这种情况。要解决此问题,请使用 optirun -b none command 禁用桥接模式。