zoukankan      html  css  js  c++  java
  • 定时取指定进程内存脚本

    用于分析指定进程是否存在内存泄漏,
    使用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 res=%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
    res=%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
  • 相关阅读:
    HTML5
    HTML5
    HTML5
    HTML5
    HTML5
    HTML5
    HTML5
    HTML5
    HTML5
    53.Maximum Subarray
  • 原文地址:https://www.cnblogs.com/aquester/p/9891524.html
Copyright © 2011-2022 走看看