Bumblebee

来自 ArchWiki

来自 Bumblebee 的 FAQ

Bumblebee 旨在使配备 NVIDIA Optimus 技术的笔记本电脑在 GNU/Linux 系统中正常工作。此功能涉及以分层方式插入的两张具有不同功耗配置文件的显卡,它们共享一个帧缓冲区。
注意: Bumblebee 存在明显的性能问题[1][2]。请参阅 NVIDIA Optimus 了解替代解决方案。

Bumblebee:Linux 的 Optimus

Optimus 技术 是一种没有硬件多路复用器的混合图形实现。集成 GPU 管理显示,而独立 GPU 管理最苛刻的渲染并将工作发送到集成 GPU 进行显示。当笔记本电脑使用电池供电时,专用 GPU 将关闭以节省电量并延长电池续航时间。它也已在具有 Intel 集成显卡和 nVidia 独立显卡的台式机上成功测试。

Bumblebee 是一个包含两个部分的软件实现

  • 在独立显卡上离屏渲染程序,并使用集成显卡在屏幕上显示。此桥接由 VirtualGL 或 primus 提供(请继续阅读),并连接到为独立显卡启动的 X 服务器。
  • 在专用显卡不使用时禁用它(请参阅#电源管理部分)

它试图模仿 Optimus 技术的行为;在需要时使用独立 GPU 进行渲染,并在不使用时关闭电源。目前的版本仅支持按需渲染,自动启动具有离散显卡的程序(基于工作负载)尚未实现。

安装

在安装 Bumblebee 之前,请检查您的 BIOS 并激活 Optimus(较旧的笔记本电脑称之为“可切换显卡”),如果可能(BIOS 不必提供此选项)。如果在 BIOS 中既没有“Optimus”也没有“可切换”,仍然要确保两个 GPU 都将被启用,并且集成显卡 (igfx) 是初始显示(主显示)。显示器应连接到板载集成显卡,而不是独立显卡。如果之前已禁用集成显卡并安装了独立显卡驱动程序,请务必删除 /etc/X11/xorg.conf/etc/X11/xorg.conf.d 中与独立显卡相关的文件。

安装:

为了支持 32 位应用程序,请启用 multilib 仓库并安装

为了使用 Bumblebee,有必要将您的常规用户添加到 bumblebee

# gpasswd -a user bumblebee

还要启用 bumblebeed.service。重启您的系统并按照 #用法 进行操作。

注意
  • bumblebee 软件包将安装一个内核模块黑名单文件,以防止 nvidia-drm 模块在启动时加载。如果您以后切换到其他解决方案,请记住卸载它。
  • 该软件包不会将 nvidiafb 模块列入黑名单。您可能没有安装它,因为默认内核不附带它。但是,对于其他内核,您也必须显式地将其列入黑名单,否则 optirunprimusrun 将无法运行。请参阅 FS#69018

用法

测试

安装 mesa-utils 并使用 glxgears 测试 Bumblebee 是否在您的 Optimus 系统上工作

$ optirun glxgears -info

如果失败,请尝试以下命令(来自 virtualgl

$ optirun glxspheres64

如果动画窗口出现,则 Optimus 与 Bumblebee 正在工作。

注意: 如果 glxgears 失败,但 glxspheres64 工作,请始终在所有情况下将 glxgears 替换为 glxspheres64

一般用法

$ optirun [options] application [application-parameters]

例如,使用 Optimus 启动 Windows 应用程序

$ optirun wine application.exe

再例如,使用 Optimus 打开 NVIDIA 设置面板

$ optirun -b none nvidia-settings -c :8
注意: nvdockAUR 的修补版本在软件包 nvdock-bumblebeeAUR 中可用。

有关所有可用选项的列表,请参阅 optirun(1)

配置

您可以配置 Bumblebee 的行为以满足您的需求。速度优化、电源管理和其他设置等微调可以在 /etc/bumblebee/bumblebee.conf 中配置

优化速度

离屏渲染方法的一个缺点是性能。下表给出了 Lenovo ThinkPad T480 在 eGPU 设置中使用 NVIDIA GTX 1060 6GB 和 unigine-heavenAUR 基准测试(1920x1080,最大设置,8x AA)的原始概述

命令 显示 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 内部 in Nvidia-xrun 51.3 1293 8.4 95.6
unigine-heaven 外部 in 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。

压缩方法

  • jpeg
  • rgb
  • yuv

未压缩方法

  • proxy
  • xv

这是使用 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
注意: CPU 频率缩放将直接影响渲染性能。

Primusrun

注意: 由于合成会降低性能,因此不建议在合成窗口管理器处于活动状态时调用 primus。请参阅#合成窗口管理器下的 Primus 问题

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_vkpvkrunprimusrun 的直接替代品,它允许运行基于 Vulkan 的应用程序。可以使用来自 vulkan-toolsvulkaninfo 进行快速检查。

$ pvkrun vulkaninfo

电源管理

本文或章节是与混合图形#使用 bbswitch 合并的候选对象。

注意: 本节仅讨论 bbswitch,它不是 Bumblebee 特有的。(在 Talk:Bumblebee 中讨论)

电源管理功能的目的是在 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_stateunload_state 内核模块参数(请参阅 bbswitch 文档)。

/etc/modprobe.d/bbswitch.conf
options bbswitch load_state=0 unload_state=1

要在系统启动时在没有 bumblebeed 的情况下运行 bbswitch,请不要忘记将 bbswitch 添加到 /etc/modules-load.d,如 内核模块#systemd 中所述。

在关机期间启用 NVIDIA 显卡

在某些笔记本电脑上,如果在上次关机时显卡已断电,则 NVIDIA 显卡可能无法在启动期间正确初始化。因此,由于 /etc/bumblebee/bumblebee.conf 中的(默认)设置 TurnCardOffAtExit=false,Bumblebee 守护程序将在停止守护程序时(例如,在关机时)打开 GPU 电源。请注意,此设置不影响守护程序运行时电源状态,因此如果所有 optirunprimusrun 程序都已退出,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
注意: 此修复程序似乎仅在重启系统后才有效。重启 bumblebee 服务是不够的。

如果上述修复失败,请尝试以下命令

# echo 1 > /sys/bus/pci/rescan

要在挂起后自动重新扫描 PCI 总线,请按照 电源管理/挂起和休眠#在 /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 | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (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 运行它以启用独立显卡并允许其相应地检测输出。已知这在联想 Legion Y720 上是必要的。

$ optirun intel-virtual-output

如果命令行上没有解析目标显示器,intel-virtual-output 将尝试连接到任何本地显示器。检测到的显示器将可以通过任何桌面显示管理器(如 xrandr 或 KDE Display)进行管理。该工具还将启动 bumblebee(可以保留为默认安装)。有关更多信息,请参阅 Bumblebee wiki 页面

在终端中运行时,除非使用 -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 禁用在使用 intel-virtual-output 时的屏幕消隐,方法是适当地设置 DISPLAY 环境变量(有关更多信息,请参阅 DPMS

$ DISPLAY=:8 xset -dpms s off

多块 NVIDIA 显卡或 NVIDIA Optimus

如果您有多块 NVIDIA 显卡(例如,将 eGPU 与具有另一个内置 NVIDIA 显卡的笔记本电脑一起使用)或 NVIDIA Optimus,则需要对 /etc/bumblebee/xorg.conf.nvidia 进行少量编辑。如果未进行此更改,守护程序可能会默认使用内部 NVIDIA 显卡。

首先,确定外部显卡的 BusID

$ lspci | grep -E "VGA|3D"
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 530 (rev 06)
01:00.0 3D controller: NVIDIA Corporation GM107M [GeForce GTX 960M] (rev a2)
0b:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070] (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

故障排除

注意: 请在 Bumblebee-Project 的 GitHub 跟踪器上报告错误,如其 wiki 中所述。

[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 驱动程序,这将不起作用。

  1. 以类似的方式卸载该驱动程序
    # ./NVIDIA-Linux-*.run --uninstall
  2. 删除 NVIDIA 生成的 Xorg 配置文件
    # rm /etc/X11/xorg.conf
  3. (重新)安装正确的 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 输出的格式为 HEX,而 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 服务以应用这些更改。

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

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))

您可能会遇到一个问题,即从睡眠状态恢复后,primusrunoptirun 命令不再工作。有两种方法可以解决此问题 - 重启系统或执行以下命令

# echo 1 > /sys/bus/pci/rescan

并尝试测试 primusrunoptirun 是否工作。

如果上述命令没有帮助,请尝试查找 NVIDIA 显卡的 bus ID

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)

例如,上面的命令显示 01:00.0,因此我们对这个 bus 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 驱动程序并且有一段时间没有更新内核。完整系统更新,然后重启到更新的内核,可能会解决此问题。如果问题仍然存在,您应该尝试针对当前内核手动编译 nvidia 软件包,例如使用 nvidia-dkms 或通过从 ABS 编译 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 中的 KeepUnusedXServerfalse 更改为 true。您的程序 fork 到后台,而 bumblebee 对此一无所知。

视频撕裂

视频撕裂是 Bumblebee 上一个相当常见的问题。要修复它,你需要启用垂直同步 (vsync)。它应该默认在 Intel 显卡上启用,但请从 Xorg 日志中验证。要检查 NVIDIA 是否启用,请确保安装了 nvidia-settings 并运行。

$ optirun nvidia-settings -c :8

X Server XVideo Settings -> Sync to VBlankOpenGL Settings -> Sync to VBlank 都应该启用。Intel 显卡通常撕裂较少,因此请使用它进行视频播放。特别是使用 VA-API 进行视频解码(例如 mplayer-vaapi 并使用 -vsync 参数)。

请参考 Intel graphics#Tearing 了解如何在 Intel 显卡上修复撕裂问题。

如果问题仍然没有解决,请尝试禁用桌面环境的合成。 也可以尝试禁用三重缓冲。

Bumblebee 无法连接到套接字

你可能会看到类似这样的信息

$ 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),你可以尝试 删除套接字 /var/run/bumblebeed.socket

此错误的另一个原因可能是你实际上没有在 BIOS 中同时开启两个 GPU,因此 Bumblebee 守护进程实际上没有运行。仔细检查 BIOS 设置,确保 Intel 显卡(集成显卡 - 在 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)

对于 primusrunVSYNC 默认启用,因此可能会导致鼠标输入延迟或甚至略微降低性能。尝试禁用 VSYNCprimusrun

$ 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 测试。

注意: 要系统范围内禁用垂直同步,请参阅 Intel graphics#Disable Vertical Synchronization (VSYNC)

合成窗口管理器下 Primus 的问题

由于合成会降低性能,因此不建议在合成窗口管理器处于活动状态时调用 primus。[4] 如果你需要在合成的情况下使用 primus 并且看到闪烁或性能不佳,将 primus 的显示线程与应用程序的渲染线程同步可能会有所帮助

$ PRIMUS_SYNC=1 primusrun ...

这会使 primus 显示先前渲染的帧。

从待机恢复后 Bumblebee 的问题

在某些系统中,可能会在从待机恢复后加载 nvidia 模块。一个可能的解决方案是安装 acpi_callacpi 软件包。

Optirun 不工作,没有调试输出

用户报告称,在某些情况下,即使 Bumblebee 已正确安装,运行

$ optirun glxgears -info

也不会产生任何输出,并且 glxgears 窗口不会出现。任何需要 3D 加速的程序都会崩溃

$ optirun bash
$ glxgears
Segmentation fault (core dumped)

显然这是 virtualgl 某些版本的错误。因此,一个解决方法是使用 #Primusrun 代替。有关更多信息,请参阅 此论坛帖子

内核 4.8 导致的电源管理问题

本文或章节是与混合图形#使用 bbswitch 合并的候选对象。

注意: 将所有关于 bbswitch 的信息放在一个地方。(在 Talk:Bumblebee 中讨论)

如果你有较新的笔记本电脑(BIOS 日期为 2015 年或更新),那么 Linux 4.8 可能会破坏 bbswitch (bbswitch issue 140),因为 bbswitch 不支持较新的、推荐的电源管理方法。因此,GPU 可能无法开机、无法关机或更糟。

作为一种解决方法,将 pcie_port_pm=off 添加到你的 内核参数 中。

或者,如果你只对省电(以及可能使用外接显示器)感兴趣,请删除 bbswitch 并依赖 Nouveau 运行时电源管理(它支持新的方法)。

注意: 某些工具(如 powertop --auto-tune)会自动在 PCI 设备上启用电源管理,这会导致相同的问题 [5]。使用相同的解决方法或不要使用一体化电源管理工具。

锁死问题 (lspci 挂起)

有关影响配备 GTX 965M(或类似产品)的新笔记本电脑的问题,请参阅 NVIDIA Optimus#Lockup issue (lspci hangs)

独立显卡始终开启和 acpi 警告

acpi_osi=Linux 添加到你的 内核参数 中。有关更多信息,请参阅 [6][7]

屏幕 0 因没有匹配的配置节而删除

按如下方式修改配置

/etc/bumblebee/xorg.conf.nvidia
...
Section "ServerLayout"
...
    Screen 0       "nvidia"
...
EndSection
...
Section "Screen"
    Identifier     "nvidia"
    Device         "DiscreteNvidia"
EndSection
...

不稳定、不可预测的行为

如果 Bumblebee 以随机方式启动/工作,请检查你是否已设置 网络配置#本地网络主机名解析(详情 此处)。

独立显卡始终开启且 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 禁用桥接模式。

另请参阅