zoukankan      html  css  js  c++  java
  • Shell脚本分析服务器性能

    概述

    我们原先在服务器上想分析性能指标,需要执行一系列的linux命令。对于linux命令不熟悉的人来说,比较困难

    现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶颈

    脚本功能

    1、查看CPU利用率与负载(top、vmstat、sar)

    2、查看磁盘、Inode利用率与I/O负载(df、iostat、iotop、sar、dstat)

    3、查看内存利用率(free、vmstat)

    4、查看TCP连接状态(netstat、ss)

    5、查看CPU与内存占用最高的10个进程(top、ps)

    6、查看网络流量(ifconfig、iftop、iptraf)

    脚本如下

    #!/bin/bash
    #
    os_check() {
            if [ -e /etc/redhat-release ]; then
                    REDHAT=`cat /etc/redhat-release |cut -d' '  -f1`
            else
                    DEBIAN=`cat /etc/issue |cut -d' ' -f1`
            fi
            if [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ]; then
                    P_M=yum
            elif [ "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubutnu" ]; then
                    P_M=apt-get
            else
                    Operating system does not support.
                    exit 1
            fi
    }
    if [ $LOGNAME != root ]; then
        echo "Please use the root account operation."
        exit 1
    fi
    if ! which vmstat &>/dev/null; then
            echo "vmstat command not found, now the install."
            sleep 1
            os_check
            $P_M install procps -y
            echo "-----------------------------------------------------------------------"
    fi
    if ! which iostat &>/dev/null; then
            echo "iostat command not found, now the install."
            sleep 1
            os_check
            $P_M install sysstat -y
            echo "-----------------------------------------------------------------------"
    fi
    
    while true; do
        select input in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit; do
            case $input in
                cpu_load)
                    #CPU利用率与负载
                    echo "---------------------------------------"
                    i=1
                    while [[ $i -le 3 ]]; do
                        echo -e "33[32m  参考值${i}33[0m"
                        UTIL=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`
                        USER=`vmstat |awk '{if(NR==3)print $13"%"}'`
                        SYS=`vmstat |awk '{if(NR==3)print $14"%"}'`
                        IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
                        echo "Util: $UTIL"
                        echo "User use: $USER"
                        echo "System use: $SYS"
                        echo "I/O wait: $IOWAIT"
                        i=$(($i+1))
                        sleep 1
                    done
                    echo "---------------------------------------"
                    break
                    ;;
                disk_load)
                    #硬盘I/O负载
                    echo "---------------------------------------"
                    i=1
                    while [[ $i -le 3 ]]; do
                        echo -e "33[32m  参考值${i}33[0m"
                        UTIL=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'`
                        READ=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`
                        WRITE=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`
                        IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
                        echo -e "Util:"
                        echo -e "${UTIL}"
                        echo -e "I/O Wait: $IOWAIT"
                        echo -e "Read/s:
    $READ"
                        echo -e "Write/s:
    $WRITE"
                        i=$(($i+1))
                        sleep 1
                    done
                    echo "---------------------------------------"
                    break
                    ;;
                disk_use)
                    #硬盘利用率
                    DISK_LOG=/tmp/disk_use.tmp
                    DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/&&//dev/{printf $2" ";printf "%d",$3;print "GB"}'`
                    USE_RATE=`df -h |awk '/^/dev/{print int($5)}'`
                    for i in $USE_RATE; do
                        if [ $i -gt 90 ];then
                            PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
                            echo "$PART = ${i}%" >> $DISK_LOG
                        fi
                    done
                    echo "---------------------------------------"
                    echo -e "Disk total:
    ${DISK_TOTAL}"
                    if [ -f $DISK_LOG ]; then
                        echo "---------------------------------------"
                        cat $DISK_LOG
                        echo "---------------------------------------"
                        rm -f $DISK_LOG
                    else
                        echo "---------------------------------------"
                        echo "Disk use rate no than 90% of the partition."
                        echo "---------------------------------------"
                    fi
                    break
                    ;;
                disk_inode)
                    #硬盘inode利用率
                    INODE_LOG=/tmp/inode_use.tmp
                    INODE_USE=`df -i |awk '/^/dev/{print int($5)}'`
                    for i in $INODE_USE; do
                        if [ $i -gt 90 ]; then
                            PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
                            echo "$PART = ${i}%" >> $INODE_LOG
                        fi
                    done
                    if [ -f $INODE_LOG ]; then
                        echo "---------------------------------------"
                        rm -f $INODE_LOG
                    else
                        echo "---------------------------------------"
                        echo "Inode use rate no than 90% of the partition."
                        echo "---------------------------------------"
                    fi
                    break
                    ;;
                mem_use)
                    #内存利用率
                    echo "---------------------------------------"
                    MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`
                    USE=`free -m |awk '{if(NR==3) printf "%.1f",$3/1024}END{print "G"}'`
                    FREE=`free -m |awk '{if(NR==3) printf "%.1f",$4/1024}END{print "G"}'`
                    CACHE=`free -m |awk '{if(NR==2) printf "%.1f",($6+$7)/1024}END{print "G"}'`
                    echo -e "Total: $MEM_TOTAL"
                    echo -e "Use: $USE"
                    echo -e "Free: $FREE"
                    echo -e "Cache: $CACHE"
                    echo "---------------------------------------"
                    break
                    ;;
                tcp_status)
                    #网络连接状态
                    echo "---------------------------------------"
                    COUNT=`netstat -antp |awk '{status[$6]++}END{for(i in status) print i,status[i]}'`
                    echo -e "TCP connection status:
    $COUNT"
                    echo "---------------------------------------"
                    ;;
                cpu_top10)
                    #占用CPU高的前10个进程
                    echo "---------------------------------------"
                    CPU_LOG=/tmp/cpu_top.tmp
                    i=1
                    while [[ $i -le 3 ]]; do
                        #ps aux |awk '{if($3>0.1)print "CPU: "$3"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $CPU_LOG
                        ps aux |awk '{if($3>0.1){{printf "PID: "$2" CPU: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"
    ";else printf $i}}' |sort -k4 -nr |head -10 > $CPU_LOG
                        #循环从11列(进程名)开始打印,如果i等于最后一行,就打印i的列并换行,否则就打印i的列
                        if [[ -n `cat $CPU_LOG` ]]; then
                           echo -e "33[32m  参考值${i}33[0m"
                           cat $CPU_LOG
                           > $CPU_LOG
                        else
                            echo "No process using the CPU." 
                            break
                        fi
                        i=$(($i+1))
                        sleep 1
                    done
                    echo "---------------------------------------"
                    break
                    ;;
                mem_top10)
                    #占用内存高的前10个进程
                    echo "---------------------------------------"
                    MEM_LOG=/tmp/mem_top.tmp
                    i=1
                    while [[ $i -le 3 ]]; do
                        #ps aux |awk '{if($4>0.1)print "Memory: "$4"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $MEM_LOG
                        ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"
    ";else printf $i}}' |sort -k4 -nr |head -10 > $MEM_LOG
                        if [[ -n `cat $MEM_LOG` ]]; then
                            echo -e "33[32m  参考值${i}33[0m"
                            cat $MEM_LOG
                            > $MEM_LOG
                        else
                            echo "No process using the Memory."
                            break
                        fi
                        i=$(($i+1))
                        sleep 1
                    done
                    echo "---------------------------------------"
                    break
                    ;;
                traffic)
                    #查看网络流量
                    while true; do
                        read -p "Please enter the network card name(eth[0-9] or em[0-9]): " eth
                        #if [[ $eth =~ ^eth[0-9]$ ]] || [[ $eth =~ ^em[0-9]$ ]] && [[ `ifconfig |grep -c "<$eth>"` -eq 1 ]]; then
                        if [ `ifconfig |grep -c "<$eth>"` -eq 1 ]; then
                                break
                        else
                            echo "Input format error or Don't have the card name, please input again."
                        fi
                    done
                    echo "---------------------------------------"
                    echo -e " In ------ Out"
                    i=1
                    while [[ $i -le 3 ]]; do
                        #OLD_IN=`ifconfig $eth |awk '/RX bytes/{print $2}' |cut -d: -f2`
                        #OLD_OUT=`ifconfig $eth |awk '/RX bytes/{print $6}' |cut -d: -f2`
                        OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
                        #CentOS6和CentOS7 ifconfig输出进出流量信息位置不同,CentOS6中RX与TX行号等于8,CentOS7中RX行号是5,TX行号是5,所以就做了个判断.       
                        OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
                        sleep 1
                        NEW_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
                        NEW_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
                        IN=`awk 'BEGIN{printf "%.1f
    ",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`
                        OUT=`awk 'BEGIN{printf "%.1f
    ",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`
                        echo "${IN}MB/s ${OUT}MB/s"
                        i=$(($i+1))
                        sleep 1
                    done
                    echo "---------------------------------------"
                    break
                    ;;
                            quit)
                                    exit 0
                                    ;;
                   *)
                        echo "---------------------------------------"
                        echo "Please enter the number." 
                        echo "---------------------------------------"
                        break
                        ;;
            esac
        done
    done
    

    运行效果如下

    # sh show_sys_info.sh

    1)cpu_load:分析cpu

    util:cpu已使用百分比

    user use:用户使用cpu百分比

    system use:系统使用cpu百分比

    I/O wait:I/O等待百分比

    三次刷新,间隔时间1s

    2)disk_load 分析磁盘

    Util:每秒磁盘处理的百分比
    vda:
    I/O Wait:IO等待时间
    Read/s:每秒磁盘读数据量
    vda:
    Write/s:每秒磁盘写数据量
    vda:

    3)disk_use 磁盘使用情况

    disk total:打印磁盘数量和磁盘分区使用情况

    4)disk_inode  如果有磁盘inodo超过90%,这里会打印出来

    5)mem_use  内存占用情况

    Total:总内存

    use:已使用内存

    free:剩余内存

    cache:缓存占用内存

    6)tcp_status tcp状态 

    7)cpu_top10 占用cpu最大的十个进程

    8)mem_top10 占用内存最大的十个进程

    9)traffic 查看网卡进出流量 

  • 相关阅读:
    初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
    【树形dp】7.14城市
    【树形背包】bzoj4033: [HAOI2015]树上染色
    【计数】51nod1677 treecnt
    【树链剖分 差分】bzoj3626: [LNOI2014]LCA
    【最短路径树】51nod1443 路径和树
    python--异常处理
    常用模块之hashlib,configparser,logging模块
    面向对象之反射及内置方法
    python之封装
  • 原文地址:https://www.cnblogs.com/Zfc-Cjk/p/11490648.html
Copyright © 2011-2022 走看看