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

调优过程

组网环境

表1 组网环境

项目

说明

服务器

TaiShan 200 服务器(型号2280)

CPU

鲲鹏920处理器

OS

openEuler 24.03

工具

鲲鹏DevKit-系统诊断工具

实践demo

mem_leak

前提条件

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

    demo编译命令:

    gcc -g -o mem_leak mem_leak.c & gcc -g -o mem_leak_fix mem_leak_fix.c

调优思路

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

调优过程

  1. 创建内存使用任务。

    选择要诊断的应用,输入服务器密码并选择采样时长,单击“校验并创建”按钮创建任务。

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

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

  3. 查看调用栈信息。

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

  4. 查看源码文件。

    源码文件mem_leak.c中发现第9行进行了内存申请,排查代码发现后续未对该处申请的内存进行释放。

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

    修改后的源码文件为mem_leak_fix.c。

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

    将应用路径替换为/opt/testdemo/mem_leak_fix重新创建诊断任务。

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

总结

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