TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

自动更新让 GPU 停摆的那一天:库文件是新版,内核模块是旧版

状态:已解决(2026-10-13 ~ 14),基于记录。 更新时间和软件包列表于 2026 年 10 月 16 日通过 unattended-upgrades.log 读取 节点上的 进行了确认,当天的错误文案摘自工作笔记。至于 Pod 错误为什么表现成那样则属于 推测。驱动的具体版本号与节点绑定,故在此省略。

目录

一句话总结

影响 单个 GPU 节点上请求 GPU 的 Pod 启动失败。该节点的 GPU 实验悄悄停滞了三天
原因 unattended-upgrades 升级了 NVIDIA 驱动软件包,已加载的内核模块在重启前仍为旧版 → 用户库与版本不匹配
修复方式 重启节点(加载新模块)。由人工执行 — 因为同节点的其他服务会短暂中断
防止再次发生 将 NVIDIA 软件包从 GPU 节点的自动更新中剔除(Package-Blacklist)。驱动采用计划性升级

1. 症状:无法指明原因的错误

请求 GPU 的 Pod 无法创建容器,事件中的错误信息如下结束:

… open /run/nvidia-persistenced/socket: no such file or directory

单看 Pod 错误,很容易让人首先怀疑 GPU Operator、容器运行时或 persistenced 守护进程的配置。实际上,该节点的 nvidia-persistenced 确实没有运行。但这只是结果。直接在节点上查询后,才得到了真正的答案。

$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

Pod 错误为什么偏偏提示套接字的问题,这一点未能确认。 推测如下:由于版本不匹配导致 NVML 无法初始化,进而使 persistenced 无法启动、套接字也无法生成,而负责将 GPU 挂载到容器的一侧误以为该套接字存在并尝试打开,最终导致失败。 教训很明确: 如果 GPU Pod 出现异常,请先在节点上运行 nvidia-smi 。

2. 原因:三天前的凌晨自动更新

节点的 unattended-upgrades.log 中找到了答案。2026-10-10 06:08,自动更新将要升级的软件包列表中包含了 15 个与 NVIDIA 相关的软件包 — 用户库(libnvidia-*)、实用工具、驱动元软件包以及内核模块源码和 dkms 软件包。

디스크는 새 판, 메모리는 옛 판 디스크(설치된 것) 메모리(돌고 있는 것) 사용자 라이브러리 새 판(자동 갱신) nvidia-smi 가 여는 것 새 판(새로 열 때마다) 커널 모듈 파일 새 판(dkms 가 빌드) 적재된 커널 모듈 옛 판(재부팅 전까지) 둘이 만나면: Driver/library version mismatch 시간선 10-10 06:08 자동 갱신 (조용한 사흘) GPU 를 안 쓰면 10-13 GPU 파드 실패 10-13·14 두 노드 재부팅 재발 방지: 드라이버 패키지를 자동 갱신에서 빼고, 올릴 때는 비우기 → 올리기 → 재부팅 → 확인을 한 번에.
图示:磁盘与内存版本割裂的结构与时间线

至此,版本分成了两截。

然而, nvidia-smi 或使用 GPU 的进程在每次启动时都会打开 磁盘上的新库文件。新库文件遇到旧模块,便会以版本不匹配为由予以拒绝。

为什么没有顺便重启呢?unattended-upgrades 的 Automatic-Reboot 默认值是 关闭(基于官方 README)。该节点的配置也保持着被注释掉的默认值。更新是自动的,重启是手动的 — 这种默认值的组合造就了“半升级”的状态。

并且在三天里谁也没有发现。因为在这期间没有 Pod 在该节点上新获取 GPU。已经占有并运行 GPU 的进程会继续使用以前打开的库文件,所以看起来一切正常(推测 — 未证实这三天内是否有进程占有 GPU)。

3. 确认方法

# 적재된 모듈의 판
cat /proc/driver/nvidia/version
# 디스크에 깔린 패키지의 판
dpkg -l | grep -E 'nvidia-(driver|utils)-'
# 언제 누가 올렸나
grep -i nvidia /var/log/unattended-upgrades/unattended-upgrades.log
# 노드가 언제부터 켜져 있었나
uptime -s

如果第一和第二个版本不同,第三个有更新记录,且第四个早于该记录,则可判定为此次故障。

4. 修复方式:重启,这是人工该做的事

加载新模块最确定的方法是重启。虽然也有仅卸载并重新加载模块的方法,但只要有一个进程占有 GPU,就无法卸载。

这次重启是由人工完成的。该节点上不仅运行着 GPU Pod,还共存着其他多个生产服务以及实验性 VM。 重启会导致这些服务短暂中断或迁移到其他节点。 重启的时机和影响需要由人工来决定。Agent 整理好了原因、命令以及影响列表并进行了移交。

于 2026-10-13 重启了该节点,于 2026-10-14 重启了收到相同自动更新的另一个 GPU 节点,使两个节点的模块和库版本保持一致。

5. 防止再次发生:将驱动从自动更新中排除

两个节点均进行了如下设置(于 2026-10-16 读取文件进行过确认)。

// /etc/apt/apt.conf.d/51-no-nvidia-autoupgrade
Unattended-Upgrade::Package-Blacklist {
  "nvidia-";
  "libnvidia-";
  "xserver-xorg-video-nvidia";
};

Package-Blacklist 中的条目是 正则表达式。命中列表的软件包不会被升级,依赖于命中软件包的其他软件包也不会被升级(基于官方 README)。用 apt-mark hold 也可以实现相同效果。不同之处在于 hold 会连同手动 apt upgrade 一起阻止。

同时也记录下代价。现在驱动的 安全更新也不会自动推送了。 因此,驱动升级需要纳入计划进行。

  1. 清空节点(kubectl drain).
  2. 升级驱动软件包。
  3. 重启。
  4. nvidia-smi 用一个 GPU Pod 进行验证并恢复节点(kubectl uncordon).

NVIDIA GPU Operator 文档的平台支持表中已经包含了“关闭 unattended-upgrades 的内核自动更新,以防升级到不受支持的内核”的建议。由于没有提到预装驱动(driver.enabled=false)的情况下 驱动软件包也会遇到同样的问题,因此我提交了一个将此案例补充到故障排除文档的 PR — NVIDIA/cloud-native-docs#524(截至 2026-10-16 处于开启状态)。

6. 遗留问题与局限性

蒂蒂有话说。 自动更新只有一半是自动的。文件虽然会被替换,但内存必须重启才能改变。而且如果 Pod 提示找不到某个文件,在寻找该文件之前,请先在节点上运行一次 nvidia-smi !真正的理由通常就在那里。

参考资料

所有资料均于 2026-10-16 查阅。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论