终于不用跑去拔电源了:Ubuntu + NVIDIA 重启卡死排查

目录

终于不用跑去拔电源了:Ubuntu + NVIDIA 重启卡死排查

记录一次搭建本地 GPU 开发机时遇到的问题:Ubuntu 每次重启都会卡死,只能强制断电。

背景

最近在家里搭建了一台本地 AI 开发机,配置如下:

  • GPU: NVIDIA GeForce RTX 3090
  • 系统: Ubuntu 24.04
  • 用途: 本地跑 VLLM 推理、模型训练等 AI 开发任务

平时通过 SSH 远程连接使用,偶尔需要接显示器排查问题。机器没有放在身边,而是和路由器一起放在角落,所以无头(headless)远程管理是主要使用方式。

问题现象

一切配置好后,发现一个很烦人的问题:每次执行 sudo reboot 后系统都会卡住:

  • 网络能 ping 通(说明系统部分启动了)
  • SSH 连接被拒绝(22 端口 Connection refused)
  • 只能强制断电才能恢复

因为机器没接显示器,每次卡住都要跑过去拔电源,非常麻烦。

问题排查

通过查看上次启动的错误日志来定位问题:

# 查看上次启动的错误日志
journalctl -b -1 -p err --no-pager

# 查看启动时哪些服务耗时最长
systemd-analyze blame

日志中发现大量错误:

nvidia-modeset: ERROR: GPU:0: Error while waiting for GPU progress
watchdog: BUG: soft lockup - CPU#6 stuck for 25s! [gnome-shell:2799]
INFO: task gnome-shell:3514 blocked for more than 122 seconds.

根本原因:NVIDIA 显卡驱动在关机/重启时没有正确释放 GPU 资源,导致 gnome-shell 和其他进程卡死,进而引发 CPU 软锁死。

解决方案

1. 启用 NVIDIA Persistence Mode

Persistence Mode 可以让 GPU 驱动保持加载状态,避免频繁初始化/卸载导致的问题。

# 启用 nvidia-persistenced 服务
sudo systemctl enable --now nvidia-persistenced

# 手动开启 Persistence Mode
sudo nvidia-smi -pm 1

# 验证
nvidia-smi -q | grep "Persistence Mode"

2. 创建开机自启服务

由于 nvidia-persistenced 服务不会自动设置 Persistence Mode,需要创建一个额外的 systemd 服务:

sudo tee /etc/systemd/system/nvidia-persistence-mode.service << 'EOF'
[Unit]
Description=Enable NVIDIA Persistence Mode
After=nvidia-persistenced.service

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -pm 1
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nvidia-persistence-mode.service

3. 可选:禁用 GDM(适用于纯服务器场景)

如果你的机器主要用于 AI 推理/训练,不需要本地图形界面,可以禁用 GDM 来进一步避免 GPU 资源冲突:

# 切换到无头模式
sudo systemctl set-default multi-user.target
sudo systemctl disable gdm

# 需要 GUI 时通过 VNC 或临时启动
sudo systemctl start gdm

我的开发机保留了 GDM,因为偶尔需要接显示器排查问题。

验证

重启后检查配置是否生效:

# 检查 Persistence Mode
nvidia-smi -q | grep "Persistence Mode"
# 输出: Persistence Mode : Enabled

# 检查服务状态
systemctl is-active nvidia-persistence-mode nvidia-persistenced
# 输出: active active

总结

这个问题的核心是 NVIDIA 驱动在关机时无法正确释放资源,导致 gnome-shell 等进程卡死。解决方案是:

  1. 启用 nvidia-persistenced 服务
  2. 开启 GPU 的 Persistence Mode
  3. 创建开机自启服务确保 Persistence Mode 每次启动都生效

配置完成后,sudo reboot 终于不再卡死了 🎉

相关环境

  • Ubuntu 24.04
  • Kernel: 6.8.0-100-generic
  • GPU: NVIDIA GeForce RTX 3090
  • Driver: 580.126.09
  • CUDA: 13.0