已关闭
[RFC]: MetaService加载不匹配MemFabric版本时发生coredump #281
zhangjiale创建于  8月28日关闭于  25 天前
zhangjiale成员
8月28日 创建

问题描述

MemCache 与 MemFabric 小版本切换或三方库版本未对齐时,mmc_meta_service 进程可能同时包含编译期内嵌的 MemFabric 实现和运行环境中的另一版本 libmf_smem.so。外部动态库会抢占 libmf_memcache.so 中默认可见的同名 C++ 符号及全局对象,导致跨版本对象被混合创建、访问和析构,最终出现 coredump。

软件配套与复现场景

组件 版本/提交 作用
MemCache develop@bad2b60c15c519cb768643166362fa7e6dff3a9e 编译 libmf_memcache.so 和 mmc_meta_service
编译期 MemFabric 9a832dee6a6ac95a95e6e5aabc117362c1cdd898,版本 1.3.0 作为三方子模块,config_store/acc_links 部分实现嵌入 MemCache 产物
运行期 MemFabric c5d098ff...,版本 1.2.0 通过 LD_PRELOAD 优先加载该版本的 libmf_smem.so
环境 143,zjl-vllm 容器,AArch64 DEBUG 构建并启动 MetaService

复现步骤:

  1. 使用 MemFabric 1.3.0 编译 develop 版本 MemCache;
  2. 启动 MetaService 时通过 LD_PRELOAD 注入 MemFabric 1.2.0 的 libmf_smem.so;
  3. MetaService 能够完成启动;
  4. 进程退出清理时触发 double free 并生成 core。

关键日志:

Meta Service launched successfully
double free or corruption (fasttop)
timeout: the monitored command dumped core

Core 文件:

/home/zjl/core-mmc_meta_servic-68954-1787845366

coredump 关键堆栈

PID 68954 - core
TID 68954:
#0  libc.so.6
#1  libc.so.6
#2  libc.so.6
#3  libc.so.6
#4  libc.so.6
#5  libc.so.6
#6  libc.so.6
#7  libc.so.6
#8  std::__new_allocator<std::__detail::_Hash_node_base*>::deallocate(
        std::__detail::_Hash_node_base**, unsigned long)
    /usr/include/c++/12/bits/new_allocator.h:158

其他存活线程位于运行期注入的 MemFabric 1.2.0 libmf_smem.so 的 AccTcp worker/cleanup 路径,说明进程退出时混用了不同版本的全局状态。

完整堆栈记录:

/home/zjl/memfabric-decouple/logs/runtime-mismatch.eu-stack.txt

根因

  1. config_store_object 和 ptracer_object 已经嵌入 libmf_memcache.so,但 mmc_meta_service 又重复编译了一份,进程内形成两套 C++ 单例和全局状态;
  2. libmf_memcache.so 内嵌的 config_store/acc_tcp_net_static 符号未做本地绑定,运行环境中另一版本 libmf_smem.so 的同名默认可见符号能够发生 ELF symbol interposition;
  3. 不同版本容器、互斥量及网络对象的创建和析构路径被交叉使用,在退出阶段触发 double free。

建议修复

  1. MetaService 不再重复编译 ptracer_object 和 config_store_object,统一使用 libmf_memcache.so 中的实现;
  2. 对 libmf_memcache.so 使用 -Wl,-Bsymbolic,将内嵌 MemFabric 私有实现及全局状态绑定到库内部,阻止外部 libmf_smem.so 抢占;
  3. 保持现有 C ABI/dlopen 调用边界,使运行期 MemFabric 版本变化不会影响 MetaService 的私有 C++ 状态。

验收标准

  • develop 和 release/1.2 均能完成编译;
  • 正常 MemFabric 配套下 MetaService 能启动并正常停止;
  • 注入 MemFabric 1.2.0 libmf_smem.so 后仍能启动并正常停止;
  • 不出现 double free,不产生新 core;
  • libmf_memcache.so 不直接依赖 libmf_smem.so,且相关私有 C++ 状态不再保留可被抢占的动态重定位。
likedislike
Zzhangjiale成员
8月28日 关联了pull request:fix: 修复MemFabric版本不一致导致MetaService崩溃
Zzhangjiale成员
8月28日 关联了pull request:fix: 修复release/1.2中MemFabric版本不一致导致MetaService崩溃
shilinlee
shilinlee成员
8月28日 评论:

/label add triaged

likedislike
shilinlee
shilinlee成员
8月28日 评论:

Issue 标签使用规范

请根据以下规则为 Issue 打标签,保持分类准确:

# 场景 标签
1 提交者本人提的 Issue /label add triaged
2 属于 v1.0.0/release 里程碑的问题 high-priority
3 提交者本人正在跟进 / 排查中 triage-review
4 系统自动打标(无需手动操作) triaged
5 测试同学提的 Issue 需确保复现步骤明确、所属仓库准确
6 开发同学提的建设性 Issue 按类型选择:feature / rfc / performance
7 已定位、待合入或待测试 ok-to-test
8 方案未明确、需团队讨论 help-wanted

⚠️ 测试or用户提 Issue 前请检查:问题描述是否清晰、仓库是否正确,避免信息不全影响处理效率。

likedislike
ascend-robotascend-robot成员
8月28日 添加了label:triaged
Zzhangjiale成员
8月31日 修改标题为 “[RFC]MetaService加载不匹配MemFabric版本时发生coredump”,原标题为“MetaService加载不匹配MemFabric版本时发生coredump”
ascend-robotascend-robot成员
8月31日 添加了label:rfc
Zzhangjiale成员
8月31日 修改标题为 “[RFC]: MetaService加载不匹配MemFabric版本时发生coredump”,原标题为“[RFC]MetaService加载不匹配MemFabric版本时发生coredump”
Zzhangjiale成员
9月1日 关联了pull request:feat: 提供memcache运行时C ABI
Zzhangjiale成员
9月1日 关联了pull request:feat: 提供memcache运行时C ABI
曲子熹曲子熹成员
9月1日 将 zhangjialee 设为负责人
lujiajun
lujiajun成员
9月1日 评论:

边界与验收建议

该问题应归类为 MemCache ↔ MemFabric 跨组件 ABI/生命周期契约问题,而不是单独归责某一个仓库。编译期内嵌的 MemFabric C++ 实现与运行期另一版本 libmf_smem.so 发生符号抢占,导致两套全局对象交叉创建/析构,退出时触发 double free。

当前 MemCache #536/#537 与 MemFabric #1210/#1211 采用版本化纯 C ABI、函数表校验和运行时加载的方向是合理的。建议验收至少包括:

  • 编译版本与运行版本匹配时,MetaService 正常启动、服务和退出;
  • 故意注入旧版/不兼容 libmf_smem.so 时必须 fail-fast,输出 ABI 版本/结构长度/缺失函数,不能 core;
  • develop 与 release/1.2 都验证真实动态库加载路径、DT_NEEDED 和导出符号;
  • 覆盖重复初始化/退出、异常启动回滚及异步线程仍存活时的卸载;
  • 建立 MemCache 编译版本 × MemFabric 运行版本兼容矩阵。

在相关 PR 合入前,运行环境应严格保持 MemCache 编译依赖与实际加载的 MemFabric 版本配套。

likedislike
Zzhangjiale成员
25 天前 issue状态由 TODO 改变为 DONE
Zzhangjiale成员
25 天前 关闭了 issue