HOOOS

Linux 6.8 内核下 i915 驱动 GPU HANG 导致 Plex 容器死锁的排查与修复指南

0 12 极客运维 Linux内核PlexGPU HANG
Apple

在将宿主机系统(如 Debian 12、Ubuntu 24.04 或 Unraid 7.0 早期测试版)升级到 Linux 6.8 内核后,不少使用 Intel 核显(特别是 11 代至 14 代 CPU)进行 Plex 硬件加速(QSV)的用户遇到了严重的系统级故障:Plex 在播放或转码过程中突然卡死,容器无法停止、无法删除(处于 D 状态/不可中断睡眠状态),且系统日志中充斥着 i915 ... GPU HANG 报错。

这种死锁通常由于 Linux 6.8 对 i915 驱动的电源管理(RC6)、内存分配(TTM)以及 GuC/HuC 微码调度机制的调整引入了不稳定性。本文将提供从诊断到彻底修复的系统化方案。


一、 故障表现与定位

1. 典型日志特征

在宿主机终端运行以下命令查看内核日志:

sudo dmesg -T | grep -iE "i915|gpu hang|reset"

如果你看到类似下方的输出,即可确认该问题:

[i915] *ERROR* GPU HANG: ecode 12:1:85df7eff, in plex_transcoder [23415]
[i915] *ERROR* Resetting chip for stopped heartbeat on rcs0
i915 0000:00:02.0: [drm] Resetting rcs0 for stopped heartbeat on rcs0
i915 0000:00:02.0: [drm] plex_transcoder[23415] context reset due to GPU hang

2. 为什么 Plex 容器会死锁(无法 kill)?

i915 驱动发生 GPU HANG 且内核尝试重置 GPU 失败时,正在调用 /dev/dri/renderD128 的 Plex 转码器进程会陷入内核态的死锁锁(Mutex Lock)。此时:

  • 进程进入 D 状态(Uninterruptible Sleep)。
  • 任何 docker stopdocker killkill -9 命令均宣告无效。
  • 只有重启宿主机才能释放该进程,但在重启时系统往往会卡在 Unmounting sync... 阶段,最终不得不强制按电源键冷启动。

二、 深度修复方案

解决该问题的核心在于调整 i915 驱动的内核参数,限制不稳定的 GuC 调度或电源省电状态。请根据你的硬件和系统,依次尝试以下方案。

方案一:调整 i915 内核参数(推荐,成功率最高)

在 Linux 6.8 内核中,Intel 默认启用了 GuC(Graphics Microcontroller)提交和调度。对于部分核显,这会导致硬件编解码时队列堵塞。我们可以通过限制 GuC 功能或关闭部分节能特性来解决。

1. 修改 Grub 配置文件(适用于 Ubuntu/Debian/Proxmox VE)

打开 Grub 配置文件:

sudo nano /etc/default/grub

找到 GRUB_CMDLINE_LINUX_DEFAULT 行,在其末尾添加以下参数(选择最适合你的一组):

  • 选项 A:限制 GuC 仅用于加载,禁用 GuC 提交调度(最推荐)
    这保留了 QSV 硬件加速和 HDR Tone Mapping(色调映射)所需的 HuC,但解决了大部分死锁。
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.enable_guc=2"
    
  • 选项 B:彻底禁用 GuC/HuC(若选项 A 仍崩溃时使用)
    注意:禁用 GuC 可能会导致 11 代及以后 CPU 的部分低功耗转码功能(Low-Power Encoding)失效,但稳定性极高。
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.enable_guc=0"
    
  • 选项 C:配合禁用 RC6 节能(针对 12/13/14 代部分主板供电不稳导致的挂起)
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.enable_guc=2 i915.enable_rc6=0"
    

2. 更新 Grub 并重启

保存文件(Ctrl+O,Enter,Ctrl+X)后,更新配置并重启:

sudo update-grub
sudo reboot

3. 验证参数是否生效

重启后,验证参数是否正确传递给驱动:

cat /sys/module/i915/parameters/enable_guc

若返回 2(或你设置的值),说明配置已生效。


方案二:更新 Intel 固件(Firmware)

Linux 6.8 内核对固件版本有较高要求。如果系统中缺少最新的 GuC/HuC 固件,驱动会回退到不稳定状态。

1. 检查缺失的固件

运行以下命令查看是否有固件加载失败的提示:

sudo dmesg | grep -i "firmware"

如果提示 Failed to load dm_guc_...Missing firmware,需要更新 linux-firmware 包。

2. 手动更新(以 Debian/Ubuntu 为例)

sudo apt update
sudo apt install --only-upgrade linux-firmware

或者手动从 Linux Kernel 官方固件库下载对应的 .bin 文件放至 /lib/firmware/i915/ 目录下。


方案三:限制 Plex 容器内的低功耗编码(Low-Power Encoding)

部分 Intel 核显(如 Jasper Lake / Alder Lake-N 系列,如 N100)在 Linux 6.8 下使用 Low-Power H.264/HEVC hardware encoding 时极易触发 GPU 挂起。

1. 临时规避方案

  1. 登录 Plex Web 客户端。
  2. 前往 设置 -> 转码器 (Transcoder)。
  3. 显示高级设置,找到 Enable low-power hardware encoding (experimental)(启用低功耗硬件编码)。
  4. 取消勾选此项,保存设置。

注:关闭此选项会略微增加转码时的 GPU 功耗,但能有效避免触发 i915 驱动的特定 TTM 内存段管理 Bug。


方案四:在 Unraid 系统下的特殊处理

如果你的宿主机是 Unraid 且升级到了使用 6.8 内核的版本,修改引导参数的方法如下:

  1. 闪存设备 (Flash) -> Syslinux Configuration
  2. label Unraid OS 下的 append 行末尾添加:
    i915.enable_guc=2
    
  3. 点击 Apply 并重启 Unraid。

三、 总结与排查优先级

遭遇此问题时,建议按照以下优先级进行处理,以保证转码性能损失最小:

  1. 第一步:保持 Plex 容器设置不变,设置内核参数 i915.enable_guc=2。这能保留绝大部分 QSV 特性并解决 90% 的死锁。
  2. 第二步:若依然死锁,在 Plex 设置中关闭 Low-Power hardware encoding
  3. 第三步:如果前两步无效,使用 i915.enable_guc=0 并彻底禁用 RC6(i915.enable_rc6=0)。虽然功耗会有所上升,但能完全绕过 6.8 内核的电源调度 Bug。

点评评价

captcha
健康