smaps 使用&& 内存泄露
这是一般进程的地址空间划分,现在有个问题,如果进程出现使用较多内存,非常明显,在不使用valgrind 工具下 能否看出来大概原因??
top命令我们已经能看出进程的虚拟空间大小(VIRT)、占用的物理内存(RES)以及和其他进程共享的内存(SHR)。但是仅此而已; 但是想知道 更详细的呢??
/proc/self/maps,基于里面信息能大概判断泄露的内存的属性,是哪个区域在泄漏、对应哪个文件。辅助工具procmem输出更可读的maps信息。
参考:https://www.cnblogs.com/arnoldlu/p/10272466.html
参考:proc-smaps
在smaps文件中,每一条记录表示进程虚拟内存空间中一块连续的区域。其中第一行从左到右依次表示地址范围、权限标识、映射文件偏移、设备号、inode、文件路径
--00400000-00531000---该虚拟内存段的开始和结束位置 ---r-xp内存段的权限,最后一位p代表私有,s代表共享 ---00000000-该虚拟内存段在对应的映射文件中的偏移量 -fc:02---文件的主设备和次设备号-- -687197---被映射到虚拟内存的文件的索引节点号 --/opt/bin/proxy_test--- 被映射到虚拟内存的文件名称后面带(deleted)的是内存数据,可以被销毁 00400000-00531000 r-xp 00000000 fc:02 687197 /opt/bin/proxy_test Size: 1220 kB 是进程使用内存空间,并不一定实际分配了内存(VSS) Rss: 928 kB 实际分配的内存(不需要缺页中断就可以使用的) Pss: 894 kB 平摊计算后的使用内存(有些内存会和其他进程共享,例如mmap进来的) Shared_Clean: 68 kB RSS中其他进程共享的未改写页面 Shared_Dirty: 0 kB RSS中其他进程共享的已改写页面 Private_Clean: 860 kB RSS中未改写的私有页面页面 Private_Dirty: 0 kB RSS中已改写的私有页面页面 Referenced: 928 kB 标记为访问和使用的内存大小 -----indicates the amount of memory currently marked as referenced or accessed. Anonymous: 0 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 4 kB 内核页大小 MMUPageSize: 4 kB MMU页大小,基本和Kernel页大小相同 Locked: 0 kB Anonymous” shows the amount of memory that does not belong to any file. Even a mapping associated with a file may contain anonymous pages: when MAP_PRIVATE and a page is modified, the file page is replaced by a private anonymous copy
参考:https://www.modb.pro/db/47525
目前在处理问题过程中出现 进程内存一直都在增长,但是版本发布前使用valgrind发现没有出现内存泄漏, 同时是线上环境,目前不能动!
所以只能先将进程的smaps 打印出来;根据smaps的数据 每一个
00400000-00531000 r-xp 00000000 fc:02 687197
地址段的情况;根据其特定记录可能出现问题的地址段!!
然后使用gdb dump memory 名将此地址段的内存等都 dump到文件dumpres.text中;
然后strings -100 dumpres.text 分析 读取其字符
根据其内容分析可能有问题的地方
目前根据strings 结果发现有很多tls 相关信息。可能是使用tls 时出现错误吧!!!
目前在客户线程 关闭了https 代理 运行一天后 发现 内存没有增长, 所以应该 就是ssl/tls 使用不当导致的堆内存泄露
VSS - Virtual Set Size RSS - Resident Set Size PSS - Proportional Set Size USS - Unique Set Size ASAN - AddressSanitizer LSAN - LeakSanitizer
三个进程都需要使用libc的代码段。
VSS = 1 +2 +3
RSS = 4 +5 +6
PSS= 4/3 + 5/2 + 6 比例化的
USS= 6 独占且驻留的
工具:smem ,查看进程使用内存的情况。
一般来讲,进程使用的内存量,还是看PSS,强调公平性。看内存泄漏看USS 就好了。
内存泄漏 界定和检测方法
界定:连续多点采样法,随着时间越久,进程耗费内存越多。
主要由内存申请和释放不是成对引起。RSS/USS曲线,
观察方法:使用smem工具查看多次进程使用内存,USS使用量。
检查工具:
1、valgrind ,会跑一个虚拟机,运行时检查进程的内存行为。会放慢程序的速度。不需要重新编译程序。
2、addressanitizer,需要重新编译程序。编译时加参数,-fsanitize
gcc 4.9才支持,只会放慢程序速度2~3倍。