ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CANN Runtime 错误码 EK0201 深度解析:Profiling 主机内存分配失败(Resource_Error_Insufficient_Host_Memory)

2026/9/19 2:40:54 拓冰建站 浏览量
CANN Runtime 错误码 EK0201 深度解析:Profiling 主机内存分配失败(Resource_Error_Insufficient_Host_Memory) CANN Runtime 错误码 EK0201 深度解析Profiling 主机内存分配失败Resource_Error_Insufficient_Host_Memory【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读EK0201 是 CANN Runtime 中 Profiling 错误码系列EK 前缀下的资源类错误表示 Profiling 数据采集过程在**主机侧Host**申请内存失败。本文以 CANN runtime 仓库的错误码参考文档为核心结合 error_code.json 中的错误码定义、error_manager.c 中的错误码上报模板以及 msprof 采集链路中多个触发点的源码实现完整讲解 EK0201 的错误格式、触发场景、底层上报机制与排查思路。读完本文你将能够准确识别 EK0201 的出现时机、理解%s占位符所代表的实际含义并掌握一套可落地的排查与规避方法。错误码概览EK0201 属于 Profiling ErrorsEK 系列中的资源错误类别其错误标题为Resource_Error_Insufficient_Host_Memory语义为Profiling 所需的主机内存不足。在 error_code.json 中该错误码的完整登记信息如下字段值errClassProfiling ErrorserrTitleResource_Error_Insufficient_Host_MemoryErrCodeEK0201ErrMessageFailed to allocate %s host memory for Profiling.Arglistbuf_sizePossible CauseAllocation failed due to insufficient host memory.SolutionStop unnecessary processes and ensure that the required memory is available.从仓库中同一错误码族可以看到EK0202Failed to allocate host memory by %s.与 EK0203Failed to create host thread for Profiling. Reason: %s.同属 Profiling 主机资源类错误EK0201 专门针对**内存分配allocation**失败这一场景是 Profiling 初始化与配置阶段最常遇到的资源类错误之一。错误格式与示例原文档给出的错误格式模板如下Failed to allocate %s host memory for Profiling.其中占位符%s表示申请失败的内存大小。实际报错示例Failed to allocate 100M host memory for Profiling.结合仓库源码可以更精确地理解%s的取值。在 prof_api_common.cpp 中aclprofCreateSubscribeConfig创建配置结构体失败时上报的%s参数为std::to_string(sizeof(aclprofSubscribeConfig)) B即内存大小以字节B为单位同样在 prof_acl_api.cpp 中aclprofCreateConfig失败时上报的是std::to_string(sizeof(aclprofConfig)) B。因此实际报错中的%s形如100M、512B或1048576B等带单位的内存大小描述而非抽象的错误代码。源码中的错误码定义与模板EK0201 在仓库中存在两处登记分别服务于不同的错误码框架1. 新框架error_code.jsonmsprof / acl 侧src/dfx/error_manager/error_code.json 中定义了 EK0201 的完整信息包括错误模板Failed to allocate %s host memory for Profiling.、参数列表Arglist: buf_size以及建议的 Possible Cause 与 Solution。msprof 采集侧的MSPROF_ENV_ERROR(EK0201, ...)宏调用即以此模板为基础将buf_size替换为实际申请大小后输出错误。2. 旧框架error_manager.cruntime_compact 侧runtime_compact/c_base/src/error_manager.c 的ERROR_MAP中登记了 EK0201{EK0201, Failed to allocate host memory for Profiling: %s., Available memory is insufficient., Close unused applications., {buf_size}},该数组结构依次为错误码、错误消息模板、可能原因、解决方案与参数列表。单元测试 error_manager_test.cc 验证了该模板的最终输出格式EK0201: Failed to allocate host memory for Profiling: 100. PossibleCause: Available memory is insufficient. Solution: Close unused applications.从测试断言可以看出错误码上报后最终以错误码: 消息开头随后逐行附带PossibleCause与Solution方便用户直接根据输出定位问题。哪些场景会触发 EK0201从源码结构看EK0201 主要出现在 Profiling 配置对象创建与内部缓冲池初始化的内存分配失败路径上典型触发点包括1. aclprofCreateConfigProfiling 配置结构创建失败prof_acl_api.cpp 中aclprofCreateConfig使用new (std::nothrow)创建aclprofConfig时若返回空指针则通过MSPROF_ENV_ERROR(EK0201, {buf_size}, {sizeof(aclprofConfig)})上报随后返回nullptr。2. aclgrphProfCreateConfig图引擎侧 Profiling 配置创建失败prof_ge_core.cpp 中图Graph场景下的aclgrphProfCreateConfig创建aclgrphProfConfig失败时同样上报 EK0201。3. aclprofCreateSubscribeConfig订阅配置创建失败prof_api_common.cpp 中aclprofCreateSubscribeConfig创建aclprofSubscribeConfig失败时上报 EK0201。4. MsprofTxManager戳stamp缓冲池初始化失败msprof_tx_manager.cpp 中MsprofTxManager::Init初始化ProfStampPoolstamp 缓冲池大小为CURRENT_STAMP_SIZE失败时上报 EK0201并返回PROFILING_FAILED。该场景与 msproftx通过aclprofInit初始化 Profiling 数据采集密切相关。5. uploader_mgr数据上传管理器初始化失败uploader_mgr.cpp 中Profiling 数据上传管理器初始化分配内存失败时同样上报 EK0201。6. 其他 msprof 内部路径prof_acl_core.cpp、msprofiler_acl_api.cpp 等文件中也存在 EK0201 的上报调用。归纳而言EK0201 的触发共同点是Profiling 子系统在 Host 侧通过new、缓冲池初始化等途径申请内存失败涉及的 API 覆盖aclprofCreateConfig、aclgrphProfCreateConfig、aclprofCreateSubscribeConfig以及 msproftx 的初始化流程。底层上报机制MSPROF_ENV_ERROR 与错误消息的产出链路从源码结构看EK0201 的上报遵循登记模板 → 宏替换参数 → 拼接错误消息的链路模板登记错误码与消息模板在 error_code.json新框架或 error_manager.cruntime_compact 的ERROR_MAP中登记参数列表明确为buf_size。宏上报各触发点调用MSPROF_ENV_ERROR(EK0201, std::vectorstd::string({buf_size}), std::vectorstd::string({实际大小}))或REPORT_INPUT_ERROR将模板中的%s替换为实际申请的内存大小如100M、1048576B。消息输出错误消息最终以EK0201: Failed to allocate host memory for Profiling: 大小.的格式输出并附上PossibleCause与Solution提示参见 error_manager_test.cc 的断言。值得注意的是runtime_compact 侧的ERROR_MAP还通过SearchFromErrorMap使用二分查找bsearch按错误码检索模板见 error_manager.c并且错误消息按线程存储__thread ErrorInfoThread* g_errorThread每个线程可独立获取自己产生的错误消息。可能原因根据原文档以及 error_code.json 中的登记信息EK0201 的可能原因表述为Allocation failed due to insufficient host memory.即Profiling 组件在申请主机内存时系统可用内存不足导致new/ 缓冲池初始化失败。常见的加剧因素包括同一主机上运行的 Profiling 进程如 msprof 命令行采集与应用进程同时采集内存占用叠加主机侧同时运行多个训练/推理任务或其他内存密集型进程系统内存碎片化严重虽然总量有余但无法满足 Profiling 需要的连续大块内存如 stamp 池、上传缓冲等。解决方案与排查步骤原文档给出的解决方案为Stop unnecessary processes and ensure that the required memory is available.即停止不必要的进程确保所需内存可用。结合源码中的实际申请场景可进一步细化为以下排查步骤定位报错中的内存大小查看报错信息中%s携带的大小如100M、1048576B判断是否为异常的大块申请。若大小与该次 Profiling 采集的数据量级严重不符需排查是否为配置错误导致异常申请。检查主机内存余量使用系统命令如free -h查看可用内存、top/htop查看进程内存占用确认主机当前可用内存是否充足。关闭无关进程停掉不再需要的应用、后台服务或其他 Profiling 采集任务释放内存后重试。减少并发采集避免在同一个主机上同时启动多个 Profiling 采集任务包括 msprof 命令行与应用内 ACL API 采集同时开启降低内存峰值同时注意 EK0007 相关说明中不要同时启用两种以上采集模式的约束。检查系统内存限制确认进程是否受 cgroup、ulimit 等资源限制如ulimit -v虚拟内存上限必要时调整限制值。重试验证释放内存后重新运行 Profiling 采集确认 EK0201 不再出现若仍然出现则结合该时刻的 Profiling 日志msprof 侧日志进一步定位具体申请点。如何进一步查阅本文依据的原始文档EK0201 Resource_Error_Insufficient_Host_Memory中文版Profiling 错误码总览Profiling-Errors错误码模板登记src/dfx/error_manager/error_code.json、src/runtime_compact/c_base/src/error_manager.c触发点源码src/dfx/msprof/collector/dvvp/msprofiler/prof_acl_api.cpp、src/dfx/msprof/collector/dvvp/msprofiler/prof_ge_core.cpp、src/dfx/msprof/collector/dvvp/msprofiler/prof_api_common.cpp、src/dfx/msprof/collector/dvvp/msprof/msproftx/src/msprof_tx_manager.cpp单元测试验证tests/ut/runtime/runtime_c/testcase/c_base/error_manager_test.cc总结EK0201 是 CANN Runtime Profiling 子系统中典型的主机内存资源不足错误它集中出现在 Profiling 配置对象创建与内部缓冲池初始化的内存分配失败路径上。理解其错误格式%s即内存大小、触发场景aclprofCreateConfig、aclgrphProfCreateConfig、aclprofCreateSubscribeConfig、msproftx stamp 池初始化等以及底层模板替换机制可以帮助开发者在收到该错误时快速定位是哪个组件在申请多大内存失败从而通过释放内存、降低并发采集等方式高效解决保证 Profiling 数据采集流程正常启动。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考