这篇文章主要主要记录下我对 linux 开发板的一些性能工具的使用和各问题定位的学习和应用, 分4大块,基础知识,内存泄露的定位,cpu 性能的定位, 还有 coredump 文件分析。 主要是内存泄露的定位。不过,我觉得在定位这些问题首先应该对相关的代码有一定了解,因为对代码了解可以帮助我们更快的定位问题。
一. 基础知识
1.1 Linux 内核的 OOM 机制
Linux内核内存管理使用 OOM killer(Out-Of-Memory killer)机制,在系统内存不足时,选择性杀死一些进程以释放内存,以使系统继续运行。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的 oom 分数可以 /proc/PID/oom_score 中找到。
防止重要的系统进程触发(OOM)机制而被杀死:可以设置参数 /proc/PID/oom_adj 为-17,可临时关闭 linux 内核的 OOM 机制。
1.2 glibc 内存管理
-
理解 glibc malloc
glibc 内存管理机制:为每个程序的每个线程维护一块内存,称为 arena,随着线程的增加会动态的增加 arena 的数量,arena 申请不回收,并且每次申请大块的内存,自己管理,进程释放并不会立马还给系统而是自己管理,只有当堆顶的内存大于 M_TRIM_THRESHOLD 的值 glibc 才会真正的还给系统。
-
建议:
- 对长期驻留的程序,并且会存在一瞬间猛增很多个线程的程序会出现内存爆增的现象,建议使用内存池的方式管理内存
- 建议后申请的内存尽量先释放,利于堆顶内存的合并释放,也会相应的会减小内存碎片
- glibc 的默认阈值是根据类似 pc 这样的设备设置的,并不适用于小内存的开发板,我们需要根据自己内存的大小和进程的线程数设置合适的阈值。
1.3 linux 的 proc 目录详解
https://www.cnblogs.com/DswCnblog/p/5780389.html
1.4 基础工具的使用
linux 常用的基础工具有 nm,readlf,file,
gdb,gdbserver,strace,pstrace</