首页/AI/大模型部署与运维速查/服务挂起:抓栈找卡点
运维监控与排障50 条

服务挂起:抓栈找卡点

服务进程还在但请求不再返回,多是死锁、通信挂起或 CUDA 上下文损坏;用 py-spy 抓进程栈判断卡点,再结合 dmesg 与引擎日志定位。

挂起与变慢不是一回事

进程还在、端口还在监听,但请求不再返回,这种状态叫挂起。常见成因是死锁、多机通信卡死、显存被占满后无法推进,或者上下文损坏。先用一分钟的吞吐与队列曲线判断是完全不动还是缓慢推进,两种情况处置路径完全不同。诊断入口是不重启进程直接抓取调用栈。

基本信息

适用平台Linux 服务器,抓栈依赖内核的调试接口
常用工具py-spy、dmesg、nvidia-smi
权限要求抓栈与读内核日志需要 root 或等效权限
判定顺序先看曲线确认挂起,再抓栈,最后才动重启

典型使用场景

  • 请求超时集中爆发:先确认真挂还是慢,避免误重启丢掉现场
  • 卡在多机通信:核对网络与通信超时配置,这类卡死通常不会自愈
  • 卡在显存分配:结合显存水位判断是否被并发挤爆
  • 内核日志出现 GPU 错误:上下文可能已损坏,按维护流程重启进程
  • 完全抓不到栈:先保全日志与设备状态,再升级处置

抓 Python 栈(不重启进程)

抓 Python 栈(不重启进程)
pip install py-spy                 # 建议装在独立环境,避免污染服务依赖
py-spy dump --pid <引擎PID>        # 查看各线程当前调用栈
py-spy top  --pid <引擎PID>        # 观察热点线程
nvidia-smi -q > /tmp/gpu-state.txt # 同时留一份设备状态
dmesg -T | tail -50                # 查内核层是否有报错

卡点对照

卡在哪观察点处置方向
多机通信栈停在通信原语,各进程进度不一致核对网络与超时配置,必要时按预案整体重启
显存分配栈停在分配调用,显存水位已满降低并发或缩短窗口,再评估扩容
GPU 调用内核日志里有设备错误记录保全证据后按维护流程重启进程
抓不到栈进程状态特殊或工具被拦截先留日志与设备状态再做决定
先分清慢与挂:观察一分钟的水位与吞吐曲线,缓慢推进和完全不动,处置方式差得很远。
挂起类故障复现成本高,抓栈前不要急着重启:调用栈与内核日志往往是仅有的线索。

易错点

  • 直接重启丢弃现场:挂起类故障复现成本高,栈和日志是唯一线索
  • 把抓栈工具装进服务所在的虚拟环境:依赖变动可能影响服务本体,建议独立环境
  • 只抓一次栈就下结论:连续抓两三次比对,才能区分稳定卡点与正常的线程切换
  • 没有通信超时机制:挂起会长期占住显卡,等价于持续停机

数据来源与参考

  • py-spy 官方仓库文档(github.com/benfred/py-spy)
  • NVIDIA 官方文档:Xid Errors(docs.nvidia.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌