---
title: 调优过程
description: "**表1 组网环境**"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/profiler/demo/kunpengmem_21_0002.html
sourcePath: /source/zh/kunpengdevps/profiler/demo/kunpengmem_21_0002.html
indexId: 58b29f6e39a33a96d34402340cf0b0333d85e9c590c45ec152aaf4570c3b5ebe61
---
# 调优过程

#### 组网环境


**表1 组网环境**

| 项目 | 说明 |
| --- | --- |
| 服务器 | TaiShan 200 服务器（型号2280） |
| CPU | 鲲鹏920处理器 |
| OS | openEuler 24.03 |
| 工具 | 鲲鹏DevKit系统诊断工具 |
| 实践demo | mem\-leak(https://github.com/kunpengcompute/devkitdemo/blob/main/Hyper\_tuner/testdemo/mem\-leak) |


#### 前提条件

- 服务器和操作系统正常运行。
- 已经安装DevKit系统诊断工具。
- 需要诊断的  demo(https://github.com/kunpengcompute/devkitdemo/blob/main/Hyper_tuner/testdemo/mem-leak/mem_leak.c)
程序。
  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. 重新使用工具进行诊断。
  将应用路径替换为优化后应用（mem_leak_fix）的路径重新创建诊断任务。

  报告中显示已经没有持续递增的内存使用情况，问题已解决（报告中展示的两处内存使用情况分别是调用pthread_create而导致的系统内部TLS内存分配和调用printf而导致的缓冲区内存分配）。


#### 总结

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