终于不用跑去拔电源了: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 等进程卡死。解决方案是:
- 启用
nvidia-persistenced服务 - 开启 GPU 的 Persistence Mode
- 创建开机自启服务确保 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