随笔-150  评论-223  文章-30  trackbacks-0
   为方便查看特定TCP服务器进程的CPU、内存和网络连接情况,编写了一个简单的脚本perf.sh,其原理是指定--tcp或-t选项来调用netstat命令,指定aux -T选项参数调用ps命令,对输出结果根据进程名称或PID调用grep过滤;为了输出结果的可读性,先调用ps和netstat,用head取出保存大多是说明描述性的头几行。这里的实现具有如下特点:
    支持单独查看CPU和内存利用率,或网络连接情况,或两者皆可,name表示进程名,address表示网络地址
    支持输出重定向,使用exec实现将标准输出重定向到file文件,当没指定-o file选项参数时,则为标准输出
    支持设置刷新时间,当没指定-t seconds选项参数时,则默认为3秒 
    支持显示多线程,当指定-m选项时,则显示多个线程的情况,默认不显示
  1#! /bin/bash
  2#perf.sh
  3
  4name=
  5address=
  6file=
  7seconds=
  8show_mthread=0
  9is_count=0
 10
 11while getopts :p:n:o:t:mv opt
 12do
 13    case $opt in
 14    p)  name=$OPTARG
 15        ;;
 16    n)  address=$OPTARG
 17        ;;
 18    o)  file=$OPTARG
 19        ;;
 20    t)  seconds=$OPTARG
 21        ;;
 22    m)  show_mthread=1
 23        ;;
 24    v)  is_count=1
 25        ;;
 26    '?')    echo "$0: invalid option -$OPTARG" >&2
 27            echo "Usage: $0 [-p name] [-n address] [-o file] [-t seconds] [-m]" >&2
 28            exit 1
 29            ;;
 30    esac
 31done
 32
 33shift $((OPTIND-1))
 34
 35if [ -"$name" --"$address" ]; then
 36    print"Usage $(basename "$0") [-p name] [-n address] [-o file] [-t seconds] [-m]\nname or address must not be null\n"
 37    exit 1
 38fi
 39
 40if [ -"$seconds" ]; then
 41    seconds=3
 42fi
 43
 44psflag="aux"
 45if [ "$show_mthread" = 1 ]; then
 46    psflag="$psflag -T"
 47fi
 48
 49psheader="`ps $psflag | head -n 1`"
 50sortflag="-k3nr -k4nr" #sort by descend order according to cpu and mem 
 51
 52netflag="-an --tcp --inet"
 53netheader="`netstat $netflag | head -n 2`"
 54is_exist=
 55
 56show_process_info()
 57{
 58    if [ -"$1" ]; then
 59        return 255
 60    fi
 61
 62    result=`ps $psflag | grep -"$1" | grep --"gdb|grep|$0" | sort $sortflag`
 63    if [ -"$result" ]; then
 64        is_exist=0    
 65    else
 66        is_exist=1
 67        uptime 
 68        echo "$psheader" 
 69        echo "$result"
 70    fi
 71    echo ""
 72}

 73
 74show_net_connection()
 75{
 76    if [ -"$1" ]; then
 77        return 255
 78    fi
 79
 80    result=`netstat  $netflag | grep -E $1
 81    if [ -"$result" ]; then
 82        echo "$netheader" 
 83        if [ "$is_count" = 1 ]; then
 84            echo "$result" | awk '/^tcp/ ++S[$NF] } ENDfor(a in S) print a, S[a] }'
 85        fi
 86    fi
 87    echo ""
 88}

 89
 90tmpfile=`mktemp /tmp/per.XXXXXXXXXXXX`
 91
 92while true
 93do
 94    if [ -"$file" ]; then
 95        exec 1> $tmpfile
 96    fi
 97
 98    show_process_info $name
 99    show_net_connection $address
100    echo ""
101
102    sleep $seconds
103
104    if [ -"$file" ]; then 
105        exec 1>&-
106
107        if [ "$is_exist" = 1 ]; then
108            cat $tmpfile >> $file
109        fi
110
111        size=`ls -l $file | awk '{print $5}'`
112        if [ $size -ge $(expr 1024 \* 1024 \* 1) ]; then
113            cat  /dev/null > $file    
114        fi
115    else
116        clear
117    fi
118done
   最后顺便提下,上面是查看某单个服务器进程的性能,若要查看整体服务器系统的性能,可以运用vmstat、iostat和free等命令。
posted on 2012-09-04 16:35 春秋十二月 阅读(1683) 评论(1)  编辑 收藏 引用 所属分类: System

评论:
# re: shell应用(2):查看TCP服务器的性能 2012-09-04 21:50 | 万连文
呃,转行了?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理