使用动态内存一致性工具自动完成上证信息所弱内存序问题排查案例
1、背景
某交易所核心后端系统基于C/C++技术栈,大量使用共享内存进行多进程数据交换。为保障业务平滑迁移至鲲鹏平台(ARM弱内存序架构),希望对其业务代码进行全量扫描,以排除因弱内存序可能导致的潜在风险。
2、工具介绍及获取方式
采用鲲鹏DevKit命令行工具包中的 dr-check 动态内存一致性检测功能。该工具无需修改源码,通过动态执行目标程序,在程序运行时记录共享内存的地址相关读写操作,能够精准检测出因弱内存序导致的数据竞争问题,并给出插入内存屏障(如dmb指令)的具体建议。
工具获取: https://www.hikunpeng.com/developer/devkit/downloadNew

3、使用效果
目前,动态内存一致性检测工具已支持对基于共享内存的多进程通信模式进行内存一致性问题检测。
为便于理解,以下抽象出客户的典型业务模型(服务端与客户端均基于共享内存通信):

•Server:共享内存创建模块、预处理模块、数据处理模块、数据发布模块、数据落盘模块等
•Shm:Vector、Queue、List、Cqueue
•Client:数据接收模块(含 TCP/UDP 接收插件)
服务端存在多个子进程,基于自研高性能容器(vector、list 等)进行数据交换。为检测多进程操作同一容器时的访问冲突,按以下步骤使用 DevKit 工具进行扫描和问题修复。
步骤一:执行初始检测,生成基础报告
动态内存一致性工具的原理是基于二进制插桩方式,记录不同线程对内存地址的读写操作。由于服务端在创建共享内存区域时,会涉及大量地址分配与申请操作,直接使用工具拉起应用会导致运行速度显著下降。经与用户确认,该阶段的内存操作是安全的,因此采用自定义信号实现采集功能的启停控制,以跳过初始化阶段,待业务阶段再开始采集。
具体操作流程如下:
1.确定阶段切换点:结合用户业务侧的运行日志,使用脚本判断初始化完成与业务逻辑开始的界限。
2.拉起各应用进程:分别对服务端和客户端的各个应用进程,执行以下命令启动:
./devkit advisor dr-check -f <待分析的应用程序> -ec false -em true -o <报告保存路径>
此命令中:
-ec false:启动后先暂停采集,待收到自定义信号后才开始工作,以此安全跳过初始化阶段;
-em true:开启多进程采集模式
3.动态开启采集:待初始化完成后,使用以下命令向对应进程发送采集启动信号:
./devkit advisor dr-check -f <待分析的应用程序> --start-collect <应用进程pid>
4.获取检测报告:执行完毕后,在 -o 指定的路径下,会输出每个进程各自的业务报告,以及一份汇总的多进程报告,便于从全局视角定位并发问题。

步骤二:查看报告,分析报告并定位弱内存序风险点
报告不仅会输出存在弱内存序风险的内存地址,还会呈现对该地址的两次并发访问的详细信息,包括函数名、源码文件及行号。
初步排查发现,报告中存在与析构函数相关的风险场景。因其业务模型为:初始化时批量申请内存块,运行结束时统一释放,期间不存在反复申请与释放。因此,构造函数和析构函数相关的风险属于误报,可以过滤。
步骤三:使用过滤参数重新检测,生成精准报告
利用 -d / -dm 参数对单进程或多进程报告中的特殊成员函数(构造函数和析构函数)进行过滤,配合 -ff all 参数重新运行检测。执行命令示例:
./devkit advisor dr-check -f <待分析的应用程序> -d/-dm <待处理的单进程报告> -ff all -o <报告保存路径>

步骤四:根据报告修复并验证
修复验证操作如下:
1.代码修复:依据报告中的建议,在共享内存访问的读操作后、写操作前,插入 dmb 内存屏障指令,用于矫正弱内存序带来的并发访问异常。
2.重新检测:修改完成后重新编译应用,并按步骤一的方式再次执行扫描命令。本次执行时,开启 -eh true 选项,启用历史报告过滤能力。
./devkit advisor dr-check -f <待分析的应用程序> -ec false -em true -eh true -o <报告保存路径>
3.结果复核:借助历史过滤功能,工具会自动比对新旧报告,帮助我们快速确认所有建议修改点是否已全面落实,同时筛选出是否存在被遗漏的未处理位置。
4、成果
1、精准定位:在10万行级代码中,工具精准锁定并报告了60余处存在潜在内存一致性风险的位置,并为每一处提供了源码行级定位和插入内存屏障的修复建议。
2、高效降噪:利用工具内置的特殊成员函数过滤功能,在特定业务场景下,工具扫描结果的误报率成功降低近90%,极大减少了用户人工过滤的工作量。
3、最终采纳:经用户技术团队基于业务实际并发模型逐项复核后,最终确认并采纳了其中10项高风险问题的修复方案。修复后,系统在鲲鹏平台上的长稳压测中未再出现因内存序导致的数据不一致或崩溃问题。
DevKit的dr-check动态检测工具能够高效、准确地帮助开发者发现C/C++项目在ARM弱内存序平台上的共享内存并发问题。其低误报、可操作的建议输出,显著降低了此类底层问题的排查与修复成本,为业务平滑迁移至鲲鹏架构提供了关键保障。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)