zoukankan      html  css  js  c++  java
  • Linux 性能搜集【linux_reports-cpu/memory/disks/network】

    为方便问题发生后,问题原因的分析排查,我们可以在服务器中事先部署如下脚本,方便故障发生后,问题原因的分析排查

    脚本部署方法:

    1.将脚本【linux_reports.sh】上传到服务器

    2.登陆虚拟机,并切换到root用户

    3.执行命令: chmod +x  <path>/linux-reports.sh  【<path>替换成实际脚本上传的目录】

    4.执行命令:crontab -e

    5.添加定时任务:* * * * * <the path of the script>/linux-reports.sh <ouputs name> <keeps>

    备注:

    范例:*/6 * * * * /root/linux-reports.sh performancelog 120 &

    a.performancelog为输出日志名称k,可以根据实际情况任意指定

    b.120为性能数据保留的最长期限,单位为分钟。比如120,就是代表所有的性能数据收集的时间在120分钟之内的予以保留,超过120分钟的会被删除。如果想保留超过一天及以上的,只有输入确定的分钟数即可,比如保留三天,那么分钟数为4320。

    c.所有的性能数据都存放在目录/var/tmp/下. 命名类似:

     6.可以通过如下方法查看搜集到的性能日志:

    gunzip performancelog_hlmcent69nma_070001-22-Nov-2017.tar.gz
    tar xvf performancelog_hlmcent69nma_070001-22-Nov-2017.tar
    cd hlmcent69nma_070001-22-Nov-2017/
    [root@hlmcent69nma hlmcent69nma_070001-22-Nov-2017]# ll
    total 28
    drwxr-xr-x. 2 root root 4096 Nov 22 07:00 cpu
    drwxr-xr-x. 2 root root 4096 Nov 22 07:00 disks
    drwxr-xr-x. 2 root root 4096 Nov 22 07:00 log
    drwxr-xr-x. 2 root root 4096 Nov 22 07:00 memory
    drwxr-xr-x. 2 root root 4096 Nov 22 07:00 network
    drwxr-xr-x. 2 root root 4096 Nov 22 07:00 sar
    -rw-r--r--. 1 root root  489 Nov 22 07:00 vminfo
    

      

    脚本详情如下:

    #!/bin/bash
    #
    # Verify Linux Distro - this will work with RHEL, SuSE, Ubuntu
    # Verify if iostat is installed if not it will install
    # Collect memory info and stats 
    # Collect disk data 
    # Collect sar if available
    # Collect logs
    ########################################
    
    exec 2> /var/tmp/linux-reports.log
    
    # Frequency and repetitions for iostat and vmstat
    fre=1
    #rep=60
    
    #to allow enough time to complete
    safetime=20
    
    clear
    
    ## Start to comment out
    #echo "By running this script you agree for data collection from your Virtual Machine"
    #echo -n "sysstat (enabling iostat) will be installed if not already installed -  Please enter Y or N [ENTER]: "
            
    #    read answer
    
    #if [ "$answer" = "Y" ] || [ "$answer" = "y" ]
    #  then
    #    echo " "
    #    echo -n "Please supply a 15 digit Microsoft case number: "
    #    read sr
    #    LEN=$(echo ${#sr})
    
    # if [ $LEN -ne 15 ]; then
    #        echo $sr "Microsoft case number should be of 15 digits"
    #        exit
    # fi
    #else
    
    #if [ "$answer" = "N" ]
    #        then
    #        echo "you answered  "$answer "exiting.." 
    #        fi
    #exit
    #fi
    
    #export case=$sr
    #direc="/var/tmp/$sr"
    
    ## End to comment out
    
    if [ $# != 2 ]; then
            echo "Invalid option, try chpa.sh <case number> <keeps>"  
            exit
    fi
    
    
    export case=$1
    direc=/var/tmp/$1
    keeps=$2
    
    ####################################
    #
    # Clean up the logs which is expired
    # Bruce Pan on 2016-03-30
    ####################################
    
    for i in `find /var/tmp/ -type f -amin +$keeps -print `
    do
    rm -rf $i
    done
    
    
    
    ####################################
    #
    # Change frequency to collect data
    # or go with default of 300 seconds
    ####################################
    
    ## Object: the script will be used to collect linux performance data recurrently. Disabled the interaction, replaced with parameters.
    ## Modified by Bruce Pan ( chpa@microsoft.com ) on 2016-03-30
    
    ## Start comment out
    #echo ""
    #echo "The data collection for vmstat and iostat is set to 5 minutes (300 seconds) with 1 second intervals"
    #echo " "
    #echo -en "Enter a new value to change from default of [300 seconds] "
    
    #       read rep
    
    #if [ -z "$rep" ]
    #  then
    #    rep="300"
    #fi
    ## End comment out
    rep="300"
    
    if [ $rep -ne 0 -o $rep -eq 0 2>/dev/null ]
    then
    
    # An integer is either equal to 0 or not equal to 0.
    # 2>/dev/null suppresses error message.
    echo " "
        echo "will run vmstat and iostat for $rep seconds"
    
    else
    
    echo ""
        echo "Supplied Input $rep is not an Integer..exiting"
    exit
    fi
    
    
    echo " "
    echo " "
    echo "Proceeding to data collection"
    
    sleepduration=`expr $rep + $safetime`
    ###############
    
    dd=`date +%H%M%S-%d-%h-%Y`                                 
    mkdir -p $direc/$sr/`hostname`_$dd
    datadir=$direc/$sr/`hostname`_$dd
    timest=`date +%d-%h-%Y_%H:%M:%S`
    
    
    #########################
    #
    # Verify distro
    #
    #########################
    
    which python  > /dev/null 2>&1
    python_status=`echo $?`  
    #echo $python_status
    
    if [ "$python_status" -eq 0 ];  then
    #    echo "python is installed"
        distro=`python -c 'import platform ; print platform.dist()[0]'`
        echo " "
        echo "This is Linux distro" $distro
    else
        distro=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
    echo $distro
    fi
    
    
    #######################################################
    #                                         
    #   Verify if iostat is installed if not install it.   
    #
    ########################################################
    
    which iostat > /dev/null 2>&1
    iostat_status=`echo $?` 
    # echo $iostat_status
    if [ "$iostat_status" -eq 0 ];  then 
        echo ""
        echo "iostat already installed..."
    
    elif
        [ $distro = Ubuntu ];  then
        echo "Installing iostat"
        sudo apt-get -y install sysstat
    
    elif
            [ $distro = centos ] || [ $distro = redhat ];  then
        echo "Installing iostat"
        yum -y install sysstat
            yum update -y sysstat
    
    elif
        [ $distro = SuSE ];  then    
        echo "Installing iostat"
        sudo su -c "zypper install -y sysstat"
    else
        echo "Not installing iostat for distro $distro script exiting - this script runs on centos, oracle, ubuntu and sles"
    exit
    fi
    
        cat /etc/*release > $datadir/vminfo
    
        echo "uname -a " >> $datadir/vminfo
        echo " " >> $datadir/vminfo
        
        echo " " >> $datadir/vminfo
        echo "uptime " >> $datadir/vminfo
           
        uptime >> $datadir/vminfo
        echo " " >> $datadir/vminfo
    
        waagent --version >> $datadir/vminfo
        echo " " >> $datadir/vminfo
        
        lsmod >> $datadir/vminfo
        echo "**************************** " >> $datadir/vminfo
        echo " " >> $datadir/vminfo
        
        modinfo hv_storvsc  >> $datadir/vminfo
        echo " " >> $datadir/vminfo
        echo "**************************** " >> $datadir/vminfo
     
        modinfo hv_netvsc >> $datadir/vminfo
        echo "**************************** " >> $datadir/vminfo
        echo " " >> $datadir/vminfo
        
        modinfo hv_utils  >> $datadir/vminfo    
        echo " " >> $datadir/vminfo
        echo "**************************** " >> $datadir/vminfo
        
        modinfo hv_vmbus >> $datadir/vminfo
        echo " " >> $datadir/vminfo
        echo "**************************** " >> $datadir/vminfo
    
    #################################
    #
    # Collect memory info. and stats
    #
    #################################
    
    mkdir $datadir/memory
    memory="$datadir/memory/memory_$timest.txt"
    vmst=$datadir/memory/vmstat_$timest.txt
    
        echo "Summary for VM `hostname` " > $memory
        echo " " >> $memory
        echo " " >> $memory
        free -m >> $memory
        echo " " >> $memory
        echo "*************************************** " >> $memory
        cat /proc/meminfo >> $memory
        echo " " >> $memory
    
        echo "Top 30 processe Resident Size memory usage" >> $memory
        ps aux --sort -rss | head -30 >> $memory
        echo "*************************************** " >> $memory
        echo " " >> $memory
        
        echo "Top 30 processes memory usage" >> $memory
        ps aux --sort -pmem | head -30  >> $memory
        echo " " >> $memory
        echo "*************************************** " >> $memory
        echo " " >> $memory
    
    
    #################################
    #
    # Collect cpu info. and stats
    #
    #################################
    
    mkdir $datadir/cpu
    cpu="$datadir/cpu/cpu_$timest.txt"
    
        echo "Summary for VM `hostname` " > $cpu
        date >> $cpu
        echo " " >> $cpu
        echo " " >> $cpu
        echo "*************************************** " >> $cpu
        cat /proc/cpuinfo >> $cpu
        echo " " >> $cpu
        echo " " >> $cpu
        
        echo "Top cpu processes usage" >> $cpu
        ps aux --sort=-pcpu | head -n 20 >> $cpu
        echo "*************************************** " >> $cpu
        echo " " >> $cpu
    
    
        
    ##############################
    #
    # Collect disk info and stats
    #
    ##############################
    
    mkdir $datadir/disks
    disks=$datadir/disks/disks_$timest.txt
    
        #df -h, df -i, fdisk -l,blkid, /etc/fstab , /etc/mdadm.conf  cat /proc/mdstat    
    
        echo "disk utilisation" >> $disks
        df -h >> $disks
        echo " " >> $disks
    
        echo "disk inode utilisation" >> $disks
        df -i >> $disks
        echo " "
        
        echo "disks attached " >> $disks
        fdisk -l >> $disks
        echo " " >> $disks
        
        echo " " >> $disks
        echo "disks blkid " >> $disks
        blkid >> $disks
        echo " " >> $disks
    
        echo "swap file configuration" >> $disks
        swapon -s >> $disks
    
        cp /etc/fstab $datadir/disks/
        cp /proc/mdstat $datadir/disks/ > /dev/null 2>&1
    
    
    #####################
    #                   #
    # Collect vmstat and#
    # iostat            #
    #                   #
    #####################
    
    echo "collecting data..."
    
    # Collect vmstat and iostat data with normal load 
    # Check disk values as per the official values
    # https://msdn.microsoft.com/en-us/library/azure/dn197896.aspx
    # If required locate no. of processors per VM - grep -i processor /proc/cpuinfo 
    
        echo "vmstat data" > $vmst
        date >> $vmst
        #strftime does not work with awk on ubuntu 12
        #vmstat 1 2 | awk '{now=strftime("%Y-%m-%d %T "); print now $0}'  >> $vmst
    
        vmstat $fre $rep  >> $vmst &
    
    
    iostat_detailed=$datadir/disks/iostat_detailed.txt
    iostat_summ=$datadir/disks/iostat_summ.txt
    
    if [ $distro = Ubuntu ]; then
            osver=`grep -i version_id /etc/os-release`
                            if [ $osver = VERSION_ID="12.04" ]; then
                            #iostatcmd1="`iostat -xd $fre $rep > $datadir/disks/iostat_detailed.txt`"
                            iostatcmd1="`iostat -xd $fre $rep > $iostat_detailed`" &
                            iostatcmd2="`iostat $fre $rep > $iostat_summ`" &
    
                    elif [ $osver = VERSION_ID="14.04" ] || [ $osver = VERSION_ID="14.10" ] ;then
    
                            iostat -yxd $fre $rep  | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_detailed &
                            iostat -y $fre $rep  | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_summ &
                            #iostatcmd1="`iostat -yxd $fre $rep  | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_detailed`" &
                            #iostatcmd2="`iostat -y $fre $rep  | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_summ`" &
                    
        fi
    
    #check suse version
    elif [ $distro = SuSE ]; then
    
            osver=`grep -i version /etc/SuSE-release|awk '{print $3}'`
    
                            if [ $osver = 11 ]; then
                            iostatcmd1="`iostat -xd $fre $rep > $iostat_detailed`" &
                            iostatcmd2="`iostat $fre $rep > $iostat_summ`" &
    
                    elif [ $osver = 12 ] ;then
                            iostatcmd1="`iostat -yxd $fre $rep  | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_detailed`" &
                            iostatcmd2="`iostat -y $fre $rep  | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_summ`" &
    
        fi
    
    # Not checkking for Centos,Oracle or Rhel version
    # if required new [ $distro = centos ] || [ $distro = redhat ];  then
    
    
    else
        iostat -xd $fre $rep | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_detailed &
            iostat $fre $rep | awk '{now=strftime("%Y-%m-%d %T "); print now $0}' > $iostat_summ &
    
    fi
    
    #
    
    ###############
    #             # 
    #    network  #
    #             #
    ###############
    
    mkdir $datadir/network
    network=$datadir/network/network_$timest.txt
    
    echo "Network Configuration..." >> $network
    ip addr show >> $network
    echo " " >> $network
    
    echo "(Routing table...)" >> $network
    netstat -rn >> $network
    echo " " >> $network
    
    ip route show >> $network
    echo " " >> $network
    
    echo "(DNS Configuration...)" >> $network
    cat /etc/resolv.conf  >> $network
    echo " " >> $network
    
    echo "(Hosts file...)" >> $network
    cat /etc/hosts  >> $network
    echo " " >> $network
    
    echo "(Network Connections...)" >> $network
    netstat -tulpn >> $network
    echo " " >> $network
    
    echo "(Network statistics...)" >> $network
    netstat -s >> $network
    echo " " >> $network
    ########################################################
    #    
    # Collect only last versions of log files and sar data
    #
    ########################################################
    
    mkdir $datadir/log
    mkdir -p $datadir/sar
    logdir=$datadir/log
    sardata=$datadir/sar
    
    ls -ltr /var/log > $logdir/logfiles_listing
    
    if [ $distro = Ubuntu ]; then
        logs=("wtmp" "btmp" "dmesg" "boot.log" "lastlog" "dpkg.log" "kern.log" "waagent.log" "syslog" "cloud-init.log" )
        sarlogs="/var/log/sysstat"
        #cp "${logs[@]}" $logdir > /dev/null 2>&1
         cp "${logs[@]/#//var/log/}" $logdir
        cp -R $sarlogs/. $sardata > /dev/null 2>&1
    
    elif
            [ $distro = centos ] || [ $distro = redhat ]; then
        logs=("wtmp" "btmp" "dmesg" "boot.log" "lastlog" "yum.log" "messages" "waagent.log" "cron" "secure" "debug")
        sarlogs="/var/log/sa"
        #cp "${logs[@]}" $logdir > /dev/null 2>&1
         cp "${logs[@]/#//var/log/}" $logdir
        cp -R $sarlogs/. $sardata > /dev/null 2>&1
    
    elif
    
            [ $distro = SuSE ]; then
        logs=("wtmp" "btmp" "boot.*" "pbl.log" "lastlog" "zypper.log" "cloudregister" "waagent.log" "messages" "warn")
        sarlogs="/var/log/sa"
        #cp "${logs[@]}" $logdir > /dev/null 2>&1
         cp "${logs[@]/#//var/log/}" $logdir
        cp -R $sarlogs/. $sardata > /dev/null 2>&1
    
    fi
    
        cp /etc/waagent.conf $logdir > /dev/null 2>&1
        sysctl -a > $logdir/kernel_params.txt 
        
    #################################
    #
    #Collect the data in a tar file
    #
    #################################
    
    #allow enough time for iostat, vmstat to complete
    sleep $sleepduration
    
    
            cd $direc
            tar -zcvf $case"_"`hostname`_$dd.tar . > /dev/null 2>&1
            mv $case"_"`hostname`_$dd.tar /var/tmp
        gzip /var/tmp/$case"_"`hostname`_$dd.tar
        echo "Please send the file "/var/tmp/$case"_"`hostname`_$dd".tar.gz"
        cd /var/tmp
        rm -Rf $direc/
        
    

      

  • 相关阅读:
    Unity3D实践系列08, MonoBehaviour类的各种触发事件
    Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件
    Unity3D实践系列06,球体撞击物体游戏
    Linux tee的花式用法和pee
    bash内置命令mapfile:读取文件内容到数组
    Perl正则表达式引用
    Perl文件句柄引用
    透明代理、正向代理、反向代理的区别说明
    Perl回调函数和闭包
    一文搞懂:词法作用域、动态作用域、回调函数、闭包
  • 原文地址:https://www.cnblogs.com/stonehe/p/7879301.html
Copyright © 2011-2022 走看看