已关闭
[Bug-Report|缺陷反馈]: 线程复用时通知容量缓存被调小,导致 notify 重复分配和资源持续增长 #1060
wangzw创建于  17 天前关闭于  9 天前
wangzw
wangzw
17 天前 创建

Describe the current behavior / 问题描述 (Mandatory / 必填)

源码版本:HCOMM 8597a98202446c455eaccb626e86707bce2374e6。

问题描述

ThreadMgr::SupplementNotify() 仅在目标数量大于缓存数量时增配 notify,但之后无条件覆盖容量缓存:

threadVec[i].notifyNum = config[i].notifyNumPerThread;

当目标需求减小时,底层没有释放 notify,缓存却随之减小。下次需求恢复时,会把仍存在的资源误判为不足,再次增配。

触发条件与影响

通过 HcclThreadAcquireWithConfig(),对同一通信域、相同 engine/type 复用一个线程,通知需求依次为 8 → 4 → 8 → 4 → 8。例如使用 COMM_ENGINE_CPU 或 COMM_ENGINE_AICPU,线程类型为 THREAD_TYPE_TS,配置经 ThreadConfigInit() 初始化。

按源码的增量分配逻辑,各次实际资源数为 8 → 8 → 12 → 12 → 16,而最大需求始终只有 8。底层 AicpuTsThread::SupplementNotify() 按已有数量加增量扩容,没有隐含缩容。

重复上述合法请求会持续占用额外通知资源,增加资源耗尽及后续申请失败的风险;不需要增加线程数量。

建议修复

缓存应表示已分配容量,需求减小时保留原值;增配成功后更新为 max(原容量, 目标需求)。补充通知需求往返变化的回归,检查线程 handle 复用且实际资源数不超过所需的历史最大值。

Environment / 环境信息 (Mandatory / 必填)

Ascend 950PR、Ascend 950DT。

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

无

Describe the expected behavior / 预期结果 (Mandatory / 必填)

无

无

Special notes for this issue/备注 (Optional / 选填)

likedislike
LLeewis成员
17 天前 将 dingweiqin_57、Innoecho 设为负责人
LLeewis成员
17 天前 issue类型由 任务 改变为 缺陷
Leewis成员
17 天前 评论:

📋 Issue 分析报告

判定结果: ✅ 确认为有效问题

问题类型: bug
分类审视: 标题模板选择正确,与问题类型一致;Issue 类型已修正为「缺陷」
严重程度: medium
置信度: 80%

📋 问题摘要

线程复用时通知容量缓存被无条件覆盖,导致需求减小时缓存减小而底层资源未释放,后续需求恢复时重复分配资源

🔍 根因分析

提供的代码文件未包含 thread_manager.cc 和 aicpu_ts_thread.cc,无法直接验证,但基于 Issue 描述的详细代码逻辑分析:在 ThreadMgr::SupplementNotify() 中,仅在目标数量大于缓存数量时增配 notify,但之后无条件执行 threadVec[i].notifyNum = config[i].notifyNumPerThread; 覆盖缓存。当需求从 8 降到 4 时,底层 AicpuTsThread::SupplementNotify() 不释放资源(实际仍为 8),但缓存被覆盖为 4。下次需求从 4 升回 8 时,缓存为 4,判断为需要增配,于是又分配 4 个,实际变为 12。如此往复导致资源持续增长。该逻辑符合常见的资源管理缺陷模式,且 Issue 提供了具体的函数名、变量名和代码片段,描述自洽且合理。

📁 涉及的文件/模块

  • src/coll_communicator_mgr/resource_mgr/local/my_rank/comm_engine/threads/thread_manager.cc
  • src/base_comm/resources/comm_engine_res/threads/aicpu_ts_thread.cc

💡 建议的修复方案

建议在 ThreadMgr::SupplementNotify() 中,增配成功后更新缓存为 max(原容量, 目标需求),需求减小时保留原值。同时检查线程 handle 复用场景,确保实际资源数不超过历史最大值。具体修改位置为 thread_manager.cc 中 SupplementNotify() 函数内的缓存更新逻辑。

⚠️ 风险提示

修复时需确保在真正释放资源时才减小缓存,否则可能导致缓存与实际不符。需检查是否有其他逻辑依赖 notifyNum 的当前值,以及缩容逻辑是否会引入新的资源同步问题。

👤 责任人与责任田分配

src/coll_communicator_mgr/ → @dingweiqin_57(hcomm-mgr) - HCOMM 集合通信域管理 HCCM(拓扑、建链、rank info detect)

  • src/coll_communicator_mgr/resource_mgr/local/my_rank/comm_engine/threads/thread_manager.cc

src/base_comm/ → @Innoecho(hcomm-base) - HCOMM 基础通信层(endpoint、channel、内存、线程)

  • src/base_comm/resources/comm_engine_res/threads/aicpu_ts_thread.cc

待确认负责人: @dingweiqin_57 @Innoecho


⏳ 等待人工确认

请以上负责人确认此问题:

  • 确认有效 → 评论 /label add confirmed 添加确认标签,并由责任人跟进处理
  • 如非有效问题 → 回复说明理由(供 Issue 提出人参考),并关闭 Issue

本回复为 AI 结合源码深度分析生成,将同步对应责任田团队进行二次确认。

likedislike
LLeewis成员
17 天前 添加了label:bugpending-confirmation
Leewis成员
17 天前 评论:
likedislike
littlemons成员
17 天前 评论:

/label add confirmed

likedislike
CANN-robotCANN-robot成员
17 天前 添加了label:confirmed
littlemons成员
17 天前 评论:

问题已确认,将于10.23完成修改

likedislike
Leewis成员
17 天前 评论:

/assign @littlemons

likedislike
LLeewis成员
17 天前 将 littlemons 设为负责人
CANN-robotCANN-robot成员
17 天前 将 littlemons 设为负责人
LLeewis成员
17 天前 移除了负责人 dingweiqin_57
LLeewis成员
17 天前 移除了负责人 Innoecho
LLeewis成员
17 天前 删除了label:pending-confirmation
LLeewis成员
12 天前 关联了看板:HCOMM
CANN-robotCANN-robot成员
9 天前 关闭了 issue
CANN-robotCANN-robot成员
9 天前 添加了label:resolved