鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

调优过程

组网环境

表1 组网环境

项目

说明

服务器

TaiShan 200 服务器(型号2280)

CPU

鲲鹏920处理器

OS

openEuler 24.03

工具

鲲鹏DevKit 25.1.0

实践demo

mem_leak.c

前提条件

  • 服务器和操作系统正常运行。
  • 已经安装DevKit系统诊断工具。
  • 需要诊断的demo程序。

调优思路

  1. 使用DevKit系统诊断工具对程序进行内存使用分析。
  2. 查看内存使用分析报告,通过调用栈定位内存泄漏点。
  3. 优化程序后,再次使用工具判断问题是否解决。

调优过程

  1. 创建内存使用任务。

    选择要诊断的应用,输入服务器密码并选择采样时长。

  2. 等待任务执行结束查看报告内容。

    通过堆栈信息和内存在用视图从整体上查看内存在用情况,可发现存在模块内存使用随时间不断增长,可以确定该段时间内存在内存泄漏。

  3. 查看调用栈信息。

    发现具体的内存泄漏点为mem_leak.c文件的第9行。

  4. 查看源码文件。

    发现第9行进行了内存申请,排查代码发现后续未对该处申请的内存进行释放。

  5. 通过修改源码将内存正确释放。

  6. 重新使用工具进行诊断。

    通过工具展示报告可以看出已经没有一直递增的内存使用情况,问题已解决(报告中展示的两处内存使用情况分别是调用pthread_create而导致的系统内部TLS内存分配和调用printf而导致的缓冲区内存分配)。

总结

初始的测试程序动态分配内存用于数据缓存,但在程序结束前未调用free释放分配的内存,造成内存未回收的情况。虽然程序逻辑简单并最终正常退出,但形成典型的内存泄漏问题。本次调优实践展示了一个典型的内存泄漏定位与修复过程,借助DevKit诊断工具,开发者可以快速定位内存泄漏问题根源,并验证优化效果。