✦ 成功捕获了 core dump 文件,现在需要用 gdb 来分析崩溃原因。
✦ 成功捕获到 core dump 了!有两个文件:
- /core.resmon_service.1527995.1777558693 — 400MB(第一次崩溃)
- /core.resmon_service.1548054.1777558813 — 398MB(第二次崩溃)
现在开始分析。先检查有没有 gdb,然后用 gdb 加载二进制和 core dump:
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
** ✓ Shell which gdb 2>/dev/null && gdb --version | head -1 (检查 gdb 是否已安装) **
** **
** Command exited with code: 1 **
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ gdb 未安装,需要先安装它才能分析 core dump。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
** ✓ Shell apt-get update -qq && apt-get install -y -qq gdb 2>&1 | tail -3 [timeout: 120000ms] (安装 gdb 用于 core dump 分析) **
** **
** Processing triggers for libc-bin (2.36-9+deb12u13) ... **
** ldconfig: /usr/local/lib/libzmq.so.5 is not a symbolic link **
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ gdb 安装成功,现在用它加载二进制文件和 core dump 来分析崩溃原因。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
** ✓ Shell gdb -batch -ex "bt" -ex "info registers" -ex "list" /usr/trim/bin/resmon_service /core.resmon_service.1527995.1777558693 2>&1 | head -80 [time… **
** **
** ... first 75 lines hidden ... **
** rip 0x7f09eaead099 0x7f09eaead099 <___pthread_rwlock_unlock+9> **
** eflags 0x10206 [ PF IF RF ] **
** cs 0x33 51 **
** ss 0x2b 43 **
** ds 0x0 0 **
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ core dump 分析结果出来了,调用栈清楚地显示了崩溃链路,需要整理结论给用户并提出后续建议。
✦ 找到崩溃根因了!
崩溃分析结果
调用栈:
1 #0 ___pthread_rwlock_unlock (rwlock=0x0) ← 对空指针解锁
2 #1 ?? () from /usr/lib/x86_64-linux-gnu/libnvidia-ml.so
3 #2 nvmlDeviceGetMemoryInfo () from libnvidia-ml.so
4 #3 NvidiaGpuInfo::UpdateRamInfo() ← resmon_service 中的函数
5 #4 GpuReporter::RunSlaveThreadInternal() ← GPU 监控线程
根因:resmon_service 的 GPU 监控线程(GpuReporter::RunSlaveThreadInternal)调用 NVIDIA ML 库(libnvidia-ml.so)获取显存信息(nvmlDeviceGetMemoryInfo),而
NVIDIA ML 库内部对一个空 rwlock 执行 pthread_rwlock_unlock,导致段错误。
这是一个 NVIDIA 驱动/ML 库的 bug,或者 resmon_service 在使用 NVIDIA ML 之前没有正确初始化(例如 GPU 设备不可用、驱动未加载等)。日志中 "can not probe trim
dev" 可能与此相关。
修复方向:
1. 检查 NVIDIA 驱动是否正常加载(nvidia-smi)
2. 联系 Trim 厂商修复 resmon_service 中对 NVIDIA ML 的调用(需处理初始化失败的情况)
3. 临时方案:如果没有 NVIDIA GPU 需求,可以禁用 GPU 监控相关代码或配置
需要我进一步检查 NVIDIA 驱动状态吗?
检查一下英伟达驱动状态
✦ 用户让我检查 NVIDIA 驱动状态,我来运行 nvidia-smi 和相关命令查看驱动状态。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
** ✓ Shell nvidia-smi 2>&1 (查看 NVIDIA GPU 和驱动状态) **
** **
** ... first 17 lines hidden ... **
** |=========================================================================================| **
** | 0 N/A N/A 1856 C ...irui/comfyui/.venv/bin/python 86MiB | **
** | 0 N/A N/A 6619 C /app/llama-server 15096MiB | **
** | 0 N/A N/A 1552620 C trim.face_det 514MiB | **
** +-----------------------------------------------------------------------------------------+ **
** **
** ✓ Shell lsmod | grep nvidia (查看已加载的 NVIDIA 内核模块) **
** **
** nvidia_uvm 2760704 8 **
** nvidia_drm 122880 0 **
** nvidia_modeset 1875968 1 nvidia_drm **
** nvidia 110915584 121 nvidia_uvm,nvidia_drm,nvidia_modeset **
** drm_ttm_helper 16384 1 nvidia_drm **
** video 81920 1 nvidia_modeset **
** **
** ✓ Shell dpkg -l | grep nvidia 2>/dev/null | head -20 (查看已安装的 NVIDIA 相关包) **
** **
** ii libnvidia-container-tools 1.18.2-1 amd64 NVIDIA container runtime library (command-line **
** tools) **
** ii libnvidia-container1:amd64 1.18.2-1 amd64 NVIDIA container runtime library **
** ii nvidia-container-toolkit 1.18.2-1 amd64 NVIDIA Container toolkit **
** ii nvidia-container-toolkit-base 1.18.2-1 amd64 NVIDIA Container Toolkit Base **
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ NVIDIA 驱动和 GPU 状态都正常,那崩溃原因应该是 libnvidia-ml.so 内部的竞争条件或资源访问问题。让我检查 nvml 初始化相关的情况。
✦ NVIDIA 驱动和 GPU 状态都正常。让我进一步检查 NVML 初始化情况:
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
** ✓ Shell nvidia-smi nvml --help 2>&1 | head -5; echo "---"; ls -la /usr/lib/x86_64-linux-gnu/libnvidia-ml.so* 2>/dev/null (查看 NVML 库版本信息) **
** **
** ERROR: Option nvml is not valid for this command. Please run 'nvidia-smi -h' for help. **
** **
** --- **
** lrwxrwxrwx 1 root root 17 Apr 25 21:49 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so -> libnvidia-ml.so.1 **
** lrwxrwxrwx 1 root root 23 Apr 25 21:49 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 -> libnvidia-ml.so.580.142 **
** -rwxr-xr-x 1 root root 2283608 Apr 25 21:49 /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.580.142 **
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ NVIDIA驱动和GPU都正常,让我再看看core dump中更多细节,特别是nvmlDeviceGetMemoryInfo调用时的参数和NvidiaGpuInfo对象状态。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
** ✓ Shell gdb -batch -ex "thread apply all bt 1" /usr/trim/bin/resmon_service /core.resmon_service.1527995.1777558693 2>&1 | tail -80 [timeout: 60000ms]… **
** **
** ... first 76 lines hidden ... **
** #0 0x00007f09eaeed545 in __GI___clock_nanosleep (clock_id=clock_id@entry=0, flags=flags@entry=0, req=0x7f09e93d17e0, rem=0x7f09e93d17e0) at ../sysde **
** ps/unix/sysv/linux/clock_nanosleep.c:48 **
** **
** Thread 1 (Thread 0x7f09de32f6c0 (LWP 1547723)): **
** #0 0x00007f09eaead099 in ___pthread_rwlock_unlock (rwlock=0x0) at ./nptl/pthread_rwlock_unlock.c:38 **
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ NVIDIA 驱动和 GPU 状态都正常,让我进一步分析 core dump 中 GPU 相关线程的详细调用栈来确认问题根源。
✦ 总结分析
NVIDIA 驱动和 GPU 状态完全正常:
- 驱动版本:580.142,CUDA 13.0
- GPU:NVIDIA RTX 2000 Ada,显存 16GB(已用 ~15GB)
- 内核模块全部加载:nvidia, nvidia_uvm, nvidia_modeset, nvidia_drm
- 有多个进程正在使用 GPU(llama-server、python、trim.face_det)
崩溃根因确认:
崩溃线程(Thread 1)是 GpuReporter::RunSlaveThreadInternal 派生的 GPU 监控线程,在调用 nvmlDeviceGetMemoryInfo() 时,NVIDIA ML 库内部对一个 空指针
`rwlock=0x0` 执行解锁操作,导致 segfault。
这很可能是 NVIDIA 驱动 580.142 中 `libnvidia-ml.so` 的一个 bug,在特定竞争条件下(可能与 GPU 高负载、MIG 模式、或进程切换有关)触发了内部的空指针解引用。
建议方案:
1. 升级/降级 NVIDIA 驱动 到更稳定的版本
2. 联系 Trim 厂商,让他们在 NvidiaGpuInfo::UpdateRamInfo() 中增加 NVML 调用失败处理
3. 临时方案:如果不需要 GPU 监控功能,可以尝试禁用 resmon_service 的 GPU 相关配置