Linux性能优化从入门到实战:11 内存篇:内存泄漏的发现与定位
用户空间内存包括多个不同的内存段,比如只读段、数据段、堆、栈以及文件映射段等。但会发生内存泄漏的内存段,只有堆和文件映射段中的共享内存。
内存泄漏的危害非常大,这些忘记释放的内存,不仅应用程序自己不能访问,系统也不能把它们再次分配给其他应用。内存泄漏不断累积,甚至会耗尽系统内存。最终,系统通过 OOM (Out of Memory)机制杀死进程,但进程在 OOM 前,可能已经引发了一连串导致严重性能问题的现象。
(1) vmstat、memleak 工具
# install sysstat (include vmstat)
sudo apt-get install -y sysstat
# Install bcc (include memleak)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo "deb https://repo.iovisor.org/apt/bionic bionic main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r)
vmstat :观察memory栏中的free列,可以方便查看当前系统的memory状态:
$ vmstat 3  # 每隔 3 秒输出一组数据
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 6601824  97620 1098784    0    0     0     0   62  322  0  0 100  0  0
memleak :可以发现 child () 函数中调用的 fibonacci() 函数有内存泄漏:
$ /usr/share/bcc/tools/memleak -p $(pidof app) -a
Attaching to pid 12512, Ctrl+C to quit.
[03:00:41] Top 10 stacks with outstanding allocations:
    addr = 7f8f70863220 size = 8192
    addr = 7f8f70861210 size = 8192
    addr = 7f8f7085b1e0 size = 8192
    addr = 7f8f7085f200 size = 8192
    addr = 7f8f7085d1f0 size = 8192
    40960 bytes in 5 allocations from stack
        fibonacci+0x1f [app]
        child+0x4f [app]
        start_thread+0xdb [libpthread-2.27.so] 
(2) valgrind 工具
  Valgrind官网:http://valgrind.org/downloads/repository.html
  参考文献:https://blog.csdn.net/kesalin/article/details/2593958
Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:
Memcheck 工具主要检查下面的程序错误:
    使用未初始化的内存 (Use of uninitialised memory)
    使用已经释放了的内存 (Reading/writing memory after it has been free’d)
    使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
    对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
    申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
    malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
    src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
Callgrind:
    Callgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。
Cachegrind:
    它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。
Helgrind:
    它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为” Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。
Massif:
    堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
安装及使用:
git clone http://repo.or.cz/valgrind.git
cd valgrind
./autogen.sh
./configure --prefix=/home/your_name/valgrind/
make
make install
gcc -Wall test.c -g -o test
valgrind --tool=memcheck --leak-check=full ./test
Linux性能优化从入门到实战:11 内存篇:内存泄漏的发现与定位的更多相关文章
- Linux性能优化从入门到实战:01 Linux性能优化学习路线
		我通过阅读各种相关书籍,从操作系统原理.到 Linux内核,再到硬件驱动程序等等. 把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序.库函数.系统调用.再到内核和硬件等不同的层级贯 ... 
- Linux性能优化从入门到实战:07 CPU篇:CPU性能优化方法
		性能优化方法论 动手优化性能之前,需要明确以下三个问题: (1)如何评估性能优化的效果? 确定性能的量化指标.测试优化前的性能指标.测试优化后的性能指标. 量化指标的选择.至少要从应用程序 ... 
- Linux性能优化从入门到实战:16 文件系统篇:总结磁盘I/O指标/工具、问题定位和调优
		(1)磁盘 I/O 性能指标 文件系统和磁盘 I/O 指标对应的工具 文件系统和磁盘 I/O 工具对应的指标 (2)磁盘 I/O 问题定位分析思路 (3)I/O 性能优化思路 Step 1:首先采用 ... 
- Linux性能优化从入门到实战:12 内存篇:Swap 基础
		内存资源紧张时,可能导致的结果 (1)OOM 杀死大内存CPU利用率又低的进程(系统内存耗尽的情况下才生效:OOM 触发的时机是基于虚拟内存,即进程在申请内存时,如果申请的虚拟内存加上服务器实际已用的 ... 
- Linux性能优化从入门到实战:09 内存篇:Buffer和Cache
		Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储. 避免跟文中的"缓存"一词混淆,而文中的"缓存",则通指内存中的临时存储 ... 
- Linux性能优化从入门到实战:08 内存篇:内存基础
		内存主要用来存储系统和应用程序的指令.数据.缓存等. 内存映射 物理内存也称为主存,动态随机访问内存(DRAM).只有内核才可以直接访问物理内存. Linux 内核给每个进程都提供了一个独立的 ... 
- Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?
		缓存命中率 缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比,可以衡量缓存使用的好坏.命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好. 实际上,缓存是 ... 
- Linux性能优化从入门到实战:17 网络篇:网络基础
		网络模型 为了解决网络互联中异构设备的兼容性问题,并解耦复杂的网络包处理流程,国际标准化组织制定了开放式系统互联通信参考模型(Open System Interconnection Reference ... 
- Linux性能优化从入门到实战:04 CPU篇:CPU使用率
		CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00 ... 
随机推荐
- hihocoder1286 : 子矩阵求和
			http://hihocoder.com/problemset/problem/1286 题解 NB分析题. 首先我们令\(s[i][j]\)表示以\((i,j)\)为左上角的矩形的权值和. 因为\( ... 
- three arrays
			three arrays 字典树上贪心 #include<bits/stdc++.h> using namespace std; ][][]; ][]; ]; ]; ][]; ][]; i ... 
- 解决:使用ajax验证登录信息返回前端页面时,当前整个页面刷新。
			源代码如下: function loginform(){ $.ajax({ url:"loginValidate.do", type:'post', data:{"nam ... 
- HDU 6592 (LIS+输出字典序最大最小)
			题意:给你一个序列,让你找长度最长的字典序最小和最大的单峰序列,单峰序列就是满足先增后降的序列. 思路:先正着求一遍LIS,再反着求一遍LIS,然后用单调栈来模拟. 求字典序最小的话,首先找到第一个顶 ... 
- 修改mac默认python版本 为python3
			mac一般自带python2.7 可以修改 ~/.bash_profile (具体的path取决于你的python3安装路径): vi ~/.bash_profile # 添加这一行 alias py ... 
- 关于 Visual stdio 编译报错:error MSB6006: “CL.exe”已退出
			网上查看,原因有多种. 1,我自己遇到的是这样的: 环境:VS2019,编译项目 image-master,中间自己重整了原来的目录,移动了很多文件.编译报错:error MSB6006: “CL.e ... 
- React-Native 之 GD (二十)removeClippedSubviews / modal放置的顺序 / Android 加载git图\动图 / 去除 Android 中输入框的下划线 / navigationBar
			1.removeClippedSubviews 用于提升大列表的滚动性能.需要给行容器添加样式overflow:’hidden’.(Android已默认添加此样式)此属性默认开启 这个属性是因为在早期 ... 
- 深入理解webpack基本配置(一)
			1. 安装webpack到全局 在学习构建之前,我们来在本地文件新建一个存放项目的文件夹,比如叫demo1这个项目,然后进入demo1该项目的根目录后,执行命令 npm init运行下,一路回车(先简 ... 
- source ~/.bash_profile是什么意思
			~ 这个符号表示你的家目录,.bash_profile 是一个隐藏文件,主要是用来配置bash shell的,source -/.bash_profile 就是让这个配置文件在修改后立即生效. 
- struts2 token 防止表单重复提交
			1.jsp页面 输入框,提交按钮 <%@ page language="java" contentType="text/html" pageEncodi ... 
