zoukankan      html  css  js  c++  java
  • SHELL:Find Memory Usage In Linux (统计每个程序内存使用情况)

    转载一个shell统计linux系统中每个程序的内存使用情况,因为内存结构非常复杂,不一定100%精确,此shell可以在Ghub上下载。

    [root@db231 ~]# ./memstat.sh  
    Private          +       Shared          =       RAM used        Program
    540.78 mb        +       175.56 mb       =       716.35 mb       oracle(25)
    24.50 mb         +       327.00 kb       =       24.82 mb        iscsiuio
    15.37 mb         +       341.00 kb       =       15.70 mb        yum-updatesd
    12.51 mb         +       853.00 kb       =       13.35 mb        gdmgreeter
    11.69 mb         +       74.00 kb        =       11.77 mb        tnslsnr
    4.74 mb          +       302.00 kb       =       5.03 mb         Xorg
    1.42 mb          +       1016.00 kb      =       2.41 mb         smbd(2)
    2.04 mb          +       347.00 kb       =       2.38 mb         gdm-rh-security
    1.83 mb          +       433.00 kb       =       2.25 mb         sshd(2)
    1.51 mb          +       379.00 kb       =       1.88 mb         iscsid(2)
    748.00 kb        +       958.00 kb       =       1.66 mb         gdm-binary(2)
    1.02 mb          +       134.00 kb       =       1.15 mb         cupsd
    ...
    --------------------------------------------------------
                                                     808.08 mb 
    ========================================================
    [root@db231 ~]# free
                 total       used       free     shared    buffers     cached
    Mem:       8174740    7339076     835664          0     486208    6085484
    -/+ buffers/cache:     767384    7407356
    Swap:      8393920      19996    8373924
    
    

    memory stat shell

    #!/bin/bash
    # Make sure only root can run our script
    
    if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
    fi
    
    ### Functions
    #This function will count memory statistic for passed PID
    get_process_mem ()
    {
    PID=$1
    #we need to check if 2 files exist
    if [ -f /proc/$PID/status ];
    then
    if [ -f /proc/$PID/smaps ];
    then
    #here we count memory usage, Pss, Private and Shared = Pss-Private
    Pss=`cat /proc/$PID/smaps | grep -e "^Pss:" | awk '{print $2}'| paste -sd+ | bc `
    Private=`cat /proc/$PID/smaps | grep -e "^Private" | awk '{print $2}'| paste -sd+ | bc `
    #we need to be sure that we count Pss and Private memory, to avoid errors
    if [ x"$Rss" != "x" -o x"$Private" != "x" ];
    then
    
    let Shared=${Pss}-${Private}
    Name=`cat /proc/$PID/status | grep -e "^Name:" |cut -d':' -f2`
    #we keep all results in bytes
    let Shared=${Shared}*1024
    let Private=${Private}*1024
    let Sum=${Shared}+${Private}
    
    echo -e "$Private + $Shared = $Sum 	 $Name"
    fi
    fi
    fi
    }
    
    #this function make conversion from bytes to Kb or Mb or Gb
    convert()
    {
    value=$1
    power=0
    #if value 0, we make it like 0.00
    if [ "$value" = "0" ];
    then
    value="0.00"
    fi
    
    #We make conversion till value bigger than 1024, and if yes we divide by 1024
    while [ $(echo "${value} > 1024"|bc) -eq 1 ]
    do
    value=$(echo "scale=2;${value}/1024"|bc)
    let power=$power+1
    done
    
    #this part get b,kb,mb or gb according to number of divisions
    case $power in
    0) reg=b;;
    1) reg=kb;;
    2) reg=mb;;
    3) reg=gb;;
    esac
    
    echo -n "${value} ${reg} "
    }
    
    #to ensure that temp files not exist
    [[ -f /tmp/res ]] && rm -f /tmp/res
    [[ -f /tmp/res2 ]] && rm -f /tmp/res2
    [[ -f /tmp/res3 ]] && rm -f /tmp/res3
    
    #if argument passed script will show statistic only for that pid, of not  we list all processes in /proc/ #and get statistic for all of them, all result we store in file /tmp/res
    if [ $# -eq 0 ]
    then
    pids=`ls /proc | grep -e [0-9] | grep -v [A-Za-z] `
    for i in $pids
    do
    get_process_mem $i >> /tmp/res
    done
    else
    get_process_mem $1>> /tmp/res
    fi
    
    #This will sort result by memory usage
    cat /tmp/res | sort -gr -k 5 > /tmp/res2
    
    #this part will get uniq names from process list, and we will add all lines with same process list
    #we will count nomber of processes with same name, so if more that 1 process where will be
    # process(2) in output
    for Name in `cat /tmp/res2 | awk '{print $6}' | sort | uniq`
    do
    count=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $6}}'|wc -l| awk '{print $1}'`
    if [ $count = "1" ];
    then
    count=""
    else
    count="(${count})"
    fi
    
    VmSizeKB=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $1}}' | paste -sd+ | bc`
    VmRssKB=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $3}}' | paste -sd+ | bc`
    total=`cat /tmp/res2 | awk '{print $5}' | paste -sd+ | bc`
    Sum=`echo "${VmRssKB}+${VmSizeKB}"|bc`
    #all result stored in /tmp/res3 file
    echo -e "$VmSizeKB + $VmRssKB = $Sum 	 ${Name}${count}" >>/tmp/res3
    done
    
    #this make sort once more.
    cat /tmp/res3 | sort -gr -k 5 | uniq > /tmp/res
    
    #now we print result , first header
    echo -e "Private 	 + 	 Shared 	 = 	 RAM used 	 Program"
    #after we read line by line of temp file
    while read line
    do
    echo $line | while read a b c d e f
    do
    #we print all processes if Ram used if not 0
    if [ $e != "0" ]; then
    #here we use function that make conversion
    echo -en "`convert $a` 	 $b 	 `convert $c` 	 $d 	 `convert $e` 	 $f"
    echo ""
    fi
    done
    done < /tmp/res
    
    #this part print footer, with counted Ram usage
    echo "--------------------------------------------------------"
    echo -e "						 `convert $total`"
    echo "========================================================"
    
    # we clean temporary file
    [[ -f /tmp/res ]] && rm -f /tmp/res
    [[ -f /tmp/res2 ]] && rm -f /tmp/res2
    [[ -f /tmp/res3 ]] && rm -f /tmp/res3
    
    

    --注意全角引号

    [oracle@dbserver89 ~]$ pmap  -d 5502
    5502:   oracleora11g (LOCAL=NO)
    Address           Kbytes Mode  Offset           Device    Mapping
    0000000000400000  183540 r-x-- 0000000000000000 008:00006 oracle
    000000000b93c000    1884 rwx-- 000000000b33c000 008:00006 oracle
    000000000bb13000     304 rwx-- 000000000bb13000 000:00000   [ anon ]
    000000001819f000     544 rwx-- 000000001819f000 000:00000   [ anon ]
    0000000060000000   32768 rwxs- 0000000000000000 000:0000c 13 (deleted)
    ffffffffff600000    8192 ----- 0000000000000000 000:00000   [ anon ]
    ...
    mapped: 4753296K    writeable/private: 8536K    shared: 4507648K
  • 相关阅读:
    IE版本
    我的班级首页,九九计四
    三层体系结构的ASP应用程序
    寻实习有悟
    servlet中请求转发(forword)与重定向(sendredirect)的区别
    Android之Providing Resources(提供资源)
    PHP用SAX解析XML
    Android之Handling Runtime Changes(处理运行时更改)
    Android 之Accessing Resource(资源调用)
    实习第一天
  • 原文地址:https://www.cnblogs.com/travel6868/p/5016164.html
Copyright © 2011-2022 走看看