1 初步确认内存泄漏
在进行长期稳定的测试的时候,定期查看内存使用情况,初步确定是否存在,一般需要较长时间的稳定测试
1.1 linux free 命令
https://blog.csdn.net/qq_35462323/article/details/105724468
执行free 命令可以得到系统当前内存的情况
此时所有的数据默认都是 KB,如果想要得到MB, 则输入free -m
#free -m
total used free shared buffers cached
Mem: 16081 15285 796 0 154 6901
-/+ buffers/cache: 8229 7852
Swap: 0 0 0
对于输出的第一行,我们先纵向看,可以发现除去第一列,后面一共有六列,分别为total、used、free、shared、buffers、cached
- total:物理内存大小,就是机器实际的内存
- used:已使用的内存大小,这个值包括了 cached 和 应用程序实际使用的内存
- free:未被使用的内存大小
- shared:共享内存大小,是进程间通信的一种方式
- buffers:被缓冲区占用的内存大小
- cached:被缓存占用的内存大小 对于Mem对应的行:total = used + free
下面一行,代表应用程序实际使用的内存:
- 前一个值表示 - buffers/cached,即 used - buffers/cached,表示应用程序实际使用的内存。
- 后一个值表示 + buffers/cached,即 free + buffers/cached,表示理论上都可以被使用的内存。 这两个值相加=total 所以说我们在说机器的内存使用率的时候,简单的使用used/total,并不准确,应为total不代表应用程序实际使用过的内存,只有减去buffers/cached才准确,所以计算公式应该为:(used -buffers-cached)/total,结果则为应用程序实际使用内存的内存使用率。
用shell命令可以这么写:
free |grep Mem|awk -F ' ' '{printf("%.2f",($3-$7-$6)/$2)}'
另外执行 free -h
$ free -h
total used free shared buff/cache available
Mem: 1.8G 366M 514M 18M 1.0G 1.3G
Swap: 0B 0B 0B
1.2 top命令
使用top指令可以查看当前系统的内存&CPU占用情况
-
按m,可以按内存占用高低显示CPU占用率
-
按s,或使用top -m可以显示内存占用
通常关注以下值:
- RSS:表示该进程分配的内存大小,不包括swap,包括共享库(实际加载到内存的部分)、堆、栈
- VSZ:进程已分配的虚拟内存大小,包括swap、共享库、堆、栈
1.3 cat /proc/xxx/status
https://blog.csdn.net/weixin_40584007/article/details/88847745
执行ps可获取进程运行的pid,假设为xxx
执行cat /proc/xxx/status 可获取进程当前的资源占用状态,包括内存
通常关注以下值:
- VmSize:虚拟内存使用量
- VmRSS:物理内存使用量
2 详细定位
tcmalloc 定位
tcmalloc分析需要符号表,请使用-g参数编译程序
tcmalloc本质是替换libc库中的malloc、new等内存相关函数。
valgrind 定位
3 脚本分析
上位机 ubuntu perf 进行分析