定时取指定进程内存脚本

用于分析指定进程是否存在内存泄漏,

使用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):

#!/bin/sh
# writed by yijian on 2016/7/11
# filename mem.sh
if test $# -lt 1; then
    echo "uage: mem.sh pid interval(seconds)"
    exit 1
fi
if test $# -eq 2; then
    interval=$2
else
    interval=60
fi
if test $interval -lt 2; then
    interval=2
fi
pid=$1
file=$pid.mem
rm -f $file
while true
do
    filesize=$(ls -l /tmp/$pid.mem 2>/dev/null|cut -d' ' -f5)
    if test ! -z $filesize; then
        if test $filesize -gt 1048576; then
            mv /tmp/$file /tmp/$file.old
        fi
    fi
    virt=0
    res=0
    eval $(cat /proc/$pid/statm 2>/dev/null| awk '{ printf("virt=%d\nres=%d", $1*4096/1024/1024,$2*4096/1024/1024); }')
    if test $virt -eq 0 -a $res -eq 0; then
        break
    fi
    echo "[`date '+%Y-%m-%d %H:%M:%S'`] ${virt}m ${res}m" | tee -a /tmp/$file
    sleep $interval
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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

Java 并发包中的读写锁及其实现分析

Java 并发包中的读写锁及其实现分析 1. 前言 在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他锁,这些锁在同一时刻只允许一个线...

3364
来自专栏落花落雨不落叶

vue+sass 下sass不能运行问题

3698
来自专栏lzj_learn_note

Volley源码分析学习

2)根据SDK版本来创建HttpStack的实现,如果是2.3以上的,则使用基于HttpUrlConnection实现的HurlStack,反之,则利用Http...

1076
来自专栏企鹅号快讯

Python接口自动化-4-HTTPS请求

Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的。 verify参数: 默认verify=Tru...

2899
来自专栏一个爱瞎折腾的程序猿

asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

开局一张图,然后开始编,一些基本的asp.net core东西就不再赘述,本文只对Swashbuckle.AspNetCore的几个使用要点进行描述。

1361
来自专栏农夫安全

sqlmap被ban了ip怎么办

sqlmap被ban了ip怎么办 第一种办法 好不容易挖到的注入点,结果总是因为请求速度过快被ban掉ip,我觉得可以给sqlmap加个代理池!暑假前的想法,...

5696
来自专栏Python中文社区

多线程爬取斗图网站,赶紧上车

專 欄 ? ❈致Great,Python中文社区专栏作者 博客: http://www.jianshu.com/u/261e23a40f71 ❈ 最近看了Py...

22810
来自专栏向治洪

Android 使用android-support-multidex解决Dex超出方法数的限制问题

随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的...

3308
来自专栏刘望舒

Android系统启动流程(四)Launcher启动过程与系统启动流程

前言 此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:L...

2278
来自专栏WindCoder

通过Js判断客户端为PC端还是手持设备

Js中获取浏览器信息字符串只要使用navigator.userAgent即可,这样我们再利用indexof来判断版本或其它信息了。

2692

扫码关注云+社区