Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8068365
  • 博文数量: 594
  • 博客积分: 13065
  • 博客等级: 上将
  • 技术积分: 10324
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-26 16:44
个人简介

推荐: blog.csdn.net/aquester https://github.com/eyjian https://www.cnblogs.com/aquester http://blog.chinaunix.net/uid/20682147.html

文章分类

全部博文(594)

分类: LINUX

2016-07-11 11:42:36

mem.zip
用于分析指定进程是否存在内存泄漏,
使用ps等命令统计开销相对较大,直接读取/proc文件系统则高效许多。

格式(利用了awk给外部变量赋值,请参考博文http://blog.chinaunix.net/uid-20682147-id-3024853.html):
eval $(cat /proc/[pid]/statm | awk '{ printf("virt=%d,res=%d", $1,$2); }')
示例(进程ID为3739):
eval $(cat /proc/3739/statm | awk '{ printf("virt=%d\nres=%d", $1,$2); }');echo $virt;echo $res;

通过以上得到的virt和res,分别为虚拟内存和物理内存的页数,再乘以页大小4096即为字节数。

一分钟统计一次脚本(统计间隔为60秒,带一个参数,即被统计进程的进程ID):

  1. #!/bin/sh
  2. # writed by yijian on 2016/7/11
  3. # filename mem.sh
  4. if test $# -lt 1; then
  5.     echo "uage: mem.sh pid interval(seconds)"
  6.     exit 1
  7. fi
  8. if test $# -eq 2; then
  9.     interval=$2
  10. else
  11.     interval=60
  12. fi
  13. if test $interval -lt 2; then
  14.     interval=2
  15. fi
  16. pid=$1
  17. file=$pid.mem
  18. rm -f $file
  19. while true
  20. do
  21.     filesize=$(ls -l /tmp/$pid.mem 2>/dev/null|cut -d' ' -f5)
  22.     if test ! -z $filesize; then
  23.         if test $filesize -gt 1048576; then
  24.             mv /tmp/$file /tmp/$file.old
  25.         fi
  26.     fi
  27.     virt=0
  28.     res=0
  29.     eval $(cat /proc/$pid/statm 2>/dev/null| awk '{ printf("virt=%d\nres=%d", $1*4096/1024/1024,$2*4096/1024/1024); }')
  30.     if test $virt -eq 0 -a $res -eq 0; then
  31.         break
  32.     fi
  33.     echo "[`date '+%Y-%m-%d %H:%M:%S'`] ${virt}m ${res}m" | tee -a /tmp/$file
  34.     sleep $interval
  35. done

cat /proc/[pid]/statm
示例(进程ID为3739):
# cat /proc/3739/statm
6521 5646 687 668 0 5035 0

各字段说明(单位均为页数,一页大小为4K):
6521 相当于top命令中的VIRT或ps命令中的VSZ,也就是虚拟内存页数
5646 相当于top命令中的RES或ps命令中的RSS,也就是物理内存页数
687 相当于top命令中的SHR,也就是共享内存页数
668 可执行虚拟内存页数
0 映射到进程空间库的页数,从Linux 2.6开始不再使用
5035 数据段和用户态的栈的大小
0 脏页数量,从Linux 2.6开始不再使用

相关的(读取statm简单些):
# cat /proc/3739/status
Name:   wx_msg_sender
State:  S (sleeping)
SleepAVG:       98%
Tgid:   3739
Pid:    3739
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 32
Groups: 0 
VmPeak:    27064 kB
VmSize:    26916 kB
VmLck:         0 kB
VmHWM:     23496 kB
VmRSS:     23428 kB
VmData:    20888 kB
VmStk:        84 kB
VmExe:      2672 kB
VmLib:      2872 kB
VmPTE:        64 kB
Threads:        1
SigQ:   1/16376
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 000000007ffb34ff
SigCgt: 0000000180000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   00000000,00000000,00000000,0000000f
Mems_allowed:   1


阅读(2955) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~