CANN进程卡住与进程中断问题定位:2大专题的实战排查方法
【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs
在 CANN(华为昇腾 AI 计算架构)应用开发中,进程卡住(任务长时间无响应、伴随超时报错)和进程中断(应用进程异常退出)是最常见的两类疑难故障。本文基于 CANN 官方文档仓库(cann/docs)维护的《进程卡住》《进程中断》两大问题定位专题,手把手带你掌握「收集日志 → 分析日志 → 定位根因」的完整实战排查方法,新手也能快速上手。🔍
一、先分清:进程卡住 和 进程中断 有何不同?
在动手排查前,先用一句话判断你遇到的是哪一类问题,避免走错方向:
| 维度 | 🧊 进程卡住 | ⚡ 进程中断 |
|---|---|---|
| 核心现象 | 任务执行中"冻住",长时间不结束 | 应用进程直接崩溃、异常退出 |
| 典型表现 | 伴随超时(timeout)报错;若配置"永不超时"则会一直卡住 | 进程消失,日志出现致命报错 |
| 排查重心 | 卡在哪个"环节"(下发 / 执行 / 等待) | 因"什么报错"退出(接口 / 任务 / 心跳 / 资源) |
更细的现象描述可参考:进程卡住问题现象描述、进程中断问题现象描述。
二、通用第一步:正确收集故障日志(关键!)
💡90% 的排查失败,都源于日志没收集全。两大专题的第一动作都是收集 CANN 日志,支持两种方式:
- 手动收集(最小集信息):在 Host 服务器规划一个目录,例如
${HOME}/err_log_info/,把默认应用类日志${HOME}/ascend/log移动进去;进程中断问题还需额外用msnpureport -f把 Device 侧系统日志、黑匣子等导出到 Host 侧。 - 工具自动收集(全量信息):执行
asys collect --output="path"一键收集安装版本、Device 健康状态、dump 文件、算子编译信息等(注意:集群 / 容器 / 云场景不支持 asys 一键收集)。
两种方式的完整步骤请参见 收集进程卡住问题信息、收集进程中断问题信息。
三、专题一:CANN 进程卡住问题定位实战 🧊
官方给出了一套清晰的"漏斗式"定位思路,按图索骥即可:
1. 抓调用栈:先判断卡住的大方向
用asys collect -r=stacktrace --remote=pid抓取卡住进程(替换为实际 PID)的调用栈,然后看栈里有什么:
- 栈中没有任何 CANN 内部函数→ 任务根本没下发到 CANN,去排查你自己的脚本/业务逻辑;
- 栈中有
SendTask→ 卡在 CANN 任务下发阶段; - 栈中有
Synchronize→ 卡在任务执行阶段,进入下一步精确定位。
2. 找卡住的流和任务
在 trace 日志(schedule_tracer_*.txt)中根据报错的stream_id检索流信息:看head值(当前正在执行的任务索引)和pos[索引](具体卡住的任务),即可锁定"任务 N 一直没执行完"。
3. 梳理流间依赖,锁定真正根因
- 若卡住任务是wait 类型(日志有
Event Wait和event_id),说明它在等另一条流的任务; - 用
grep -rn "event_id=1"找到下发对应Event Record任务的流,检查那条流的 record 任务是否没执行——这往往才是卡住的"真凶"。
完整定位细节与日志片段示例,请阅读 进程卡住问题定位思路。
四、专题二:CANN 进程中断问题定位实战 ⚡
进程中断的核心是"找到第一处报错",官方排查流程同样有流程图可循:
1. 先 grep 首报错,看有没有"错误码"
在应用类日志plog-*_*.log中执行grep -rn "ERROR",看第一处报错:
- 首报错带错误码(
E*9***系统内部错误码除外)→ 直接查 错误码参考 对照解决,最快! - 首报错无错误码→ 按下面 4 类继续排查。
2. 接口使用类错误
检查日志中是否有acl*、[drv api]、rt*等接口报错。存在对外接口(acl开头)报错时,对照 API 参考检查接口用法与参数。典型案例:调用SetDevice接口错误导致无可用Context、rtMemcpyAsync异步参数校验报错。
3. 任务执行类错误
- 搜
fault kernel_name/kernelName→ 表示算子执行报错,记下报错的 kernel 名称; - 搜
Task run failed→ 表示CANN 内部组件执行任务报错,建议用ascend-dmi工具压测后再定位。
4. 心跳丢失 / 资源未释放
- plog 有
Device lost heartbeat且黑匣子日志有HEARTBEAT EXCEPTION→ TaskScheduler CPU 心跳丢失; - syslog 有
fatal panic→ Control CPU 心跳丢失; - plog 有
RESOURCE_ALLOC_FAIL→内存等资源未及时释放,重点检查应用代码是否在资源用完后就释放。
完整定位思路与日志示例请阅读 进程中断问题定位思路。
五、典型案例与求助技巧 🛟
- fork 方式创建子进程导致应用进程卡死:这是"进程卡住"专题收录的经典案例,若你用了 fork 创建子进程,务必先看 fork方式创建子进程导致应用进程卡死。
- 已按文档排查仍无果?收集好日志后可联系技术支持。定位时建议同时提供现场业务信息(单算子 / 模型推理 / 模型训练、集群规模)与用户操作记录。
六、快速上手:文档导航清单 📚
| 你想做的事 | 对应文档 |
|---|---|
| 查看卡住专题全貌 | 进程卡住问题定位专题 |
| 查看中断专题全貌 | 进程中断问题定位专题 |
| 手动 / asys 收集日志 | 收集进程卡住问题信息 |
| 排查卡住根因 | 进程卡住问题定位思路 |
| 排查中断根因 | 进程中断问题定位思路 |
| 查 C/C++ / Python 堆栈 | 查看C/C++应用程序的堆栈 |
✅一句话总结:先分清是卡住还是中断,再收全日志,然后按流程图逐层下钻——卡住看"哪个环节",中断看"哪类报错"。掌握这套方法,绝大多数 CANN 进程级疑难故障都能迎刃而解。
【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考