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 \t $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 \t ${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 \t + \t Shared \t = \t RAM used \t 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` \t $b \t `convert $c` \t $d \t `convert $e` \t $f" echo "" fi done done < /tmp/res #this part print footer, with counted Ram usage echo "--------------------------------------------------------" echo -e "\t\t\t\t\t\t `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
对不起,这篇文章暂时关闭评论。