zoukankan      html  css  js  c++  java
  • Linux服务器性能日志收集和分析脚本(转)

    最近老大要求分析服务器的性能数据,找到服务器运行的性能瓶颈,结果花了两天时间,写了两个脚本可以生成日志并可以进行数据提取,最终生成数据可以放到excel生成报表。过程中也学到了不少shell编程技术。

    收集性能数据系统日志,每3秒收集一次,将脚本放到后台运行就行。

    [plain] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. #!/bin/sh  
    2.   
    3. while :  
    4. do  
    5.     iostat -x -t >> /var/log/jciostat.log  
    6.     vmstat -t -S M >> /var/log/jcvmstat.log  
    7.     free -g >> /var/log/jcfree_g.log  
    8.     top -b -n 1 |head -5 >> /var/log/jctop.log  
    9.     sar -P ALL 1 1 | grep : | grep all | cut -d: -f2 >> /var/log/jccpu.log  
    10.     sar -n DEV 1 1 | grep : | cut -d: -f2 >> /var/log/jcnetwork.log  
    11.   
    12.     if [ -f "/var/log/jciostat.log" ];then  
    13.         if [ $(stat -c "%s" /var/log/jciostat.log) -gt $((100*1024*1024)) ];then  
    14.             # file size is greater more than 200MB,clean file data  
    15.             cd /var/log/ >/dev/null 2>&1  
    16.             tar czvf jc.log.tar.gz jciostat.log jcvmstat.log jcfree_g.log jctop.log > /dev/null 2>&1  
    17.             echo "" > /var/log/jciostat.log  
    18.             echo "" > /var/log/jcvmstat.log  
    19.             echo "" > /var/log/jcfree_g.log  
    20.             echo "" > /var/log/jctop.log  
    21.             cd - > /dev/null 2>&1  
    22.         fi  
    23.     fi  
    24.     sleep 1  
    25. done  





    日志文件分析脚本

    [plain] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. #!/bin/sh  
    2.   
    3. print_help()  
    4. {  
    5. echo "use age: analyz.sh  -day <day> -start <start time> -end <end time> -<option1> <colum1,colum2...> -<option2> <colum1,colum2...> -<option3> <colum1,colum2...>"  
    6. echo "day: YYYY-MM-DD"  
    7. echo "start time:HH:MM:SS"  
    8. echo "end time:HH:MM:SS"  
    9. echo "                   1    2        3       4       5       6        7        8         9         10     11     12     13  14  15  16  17"  
    10. echo "-vmstat:           r    b        swpd    free    buff    cache    si       so        bi        bo     in     cs     us  sy  id  wa  st"  
    11. echo "-sda:                   rrqm/s   wrqm/s  r/s     w/s     rsec/s   wsec/s   avgrq-sz  avgqu-sz  await  svctm  %util"  
    12. echo "-sdb:                   rrqm/s   wrqm/s  r/s     w/s     rsec/s   wsec/s   avgrq-sz  avgqu-sz  await  svctm  %util"  
    13. echo "-network                rxpck/s  txpck/s rxkB/s  txkB/s  rxcmp/s  txcmp/s  rxmcst/s"  
    14. echo "-cpu                    us       ni      sy      wa      st       id"  
    15. echo "-mem:                   total    used    free    shared  buffers  cached"  
    16. echo "-swap:                  total    used    free"  
    17. echo "-la(load average): 5min 10min    15min"  
    18. echo "-network <netdev:[cloudbr0/bond0/eth0...]> <colum1,colum2...>"  
    19. echo "example:$0 -sda 1,2,3 -sdb 10,11,12 -network cloudbr0 2,3,4 -swap 3,4 -day 2016-07-08 -start 07:00:00 -end 08:00:00"  
    20. }  
    21.   
    22. cp /var/log/jc*.log ./  
    23.   
    24. day=""  
    25. start=""  
    26. end=""  
    27.   
    28. vmstat=""  
    29. sda=""  
    30. sdb=""  
    31. mem=""  
    32. swap=""  
    33. la=""  
    34. cpu=""  
    35. network=""  
    36. netdev=""  
    37. while [ -n "$1" ]  
    38. do    
    39. case "$1" in     
    40.     "-vmstat")  
    41.         vmstat=$2  
    42.         shift  
    43.         ;;    
    44.     "-sda")    
    45.         sda=$2  
    46.         shift  
    47.         ;;    
    48.     "-sdb")    
    49.         sdb=$2  
    50.         shift  
    51.         ;;    
    52.     "-mem")    
    53.         mem=$2  
    54.         shift  
    55.         ;;  
    56.     "-swap")    
    57.         swap=$2  
    58.         shift  
    59.         ;;   
    60.     "-la")    
    61.         la=$2  
    62.         shift  
    63.         ;;  
    64.     "-day")  
    65.         day=$2  
    66.         shift  
    67.         ;;  
    68.     "-start")  
    69.         start=$2  
    70.         shift  
    71.         ;;  
    72.     "-end")  
    73.         end=$2  
    74.         shift  
    75.         ;;  
    76.     "-cpu")  
    77.         cpu=$2  
    78.         shift  
    79.         ;;  
    80.     "-network")  
    81.         netdev=$2  
    82.         network=$3  
    83.         shift  
    84.         shift  
    85.         ;;  
    86.     "--help")  
    87.         print_help  
    88.         exit 0  
    89.         ;;  
    90.      *)  
    91.       echo "$1 is not an option"  
    92.       ;;  
    93. esac  
    94. shift  
    95. done  
    96.   
    97. # 第一步:生成独立的日志csv文件  
    98. if [ ! -z $vmstat ];then  
    99.     colum_name=("CST" "vmstat_r" "vmstat_b" "vmstat_swpd" "vmstat_free" "vmstat_buff" "vmstat_cache" "vmstat_si" "vmstat_so" "vmstat_bi" "vmstat_bo" "vmstat_in" "vmstat_cs" "vmstat_us" "vmstat_sy" "vmstat_id" "vmstat_wa" "vmstat_st")  
    100.     OLD_IFS="$IFS"  
    101.     IFS=","  
    102.     colums=($vmstat)  
    103.     IFS="$OLD_IFS"  
    104.     o_colum=""  
    105.     o_colum_name=""  
    106.     for c in ${colums[@]}  
    107.     do  
    108.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    109.             continue  
    110.         fi  
    111.         o_colum=${o_colum}$$c","  
    112.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    113.     done  
    114.     o_colum=${o_colum%"}  
    115.     o_colum=${o_colum%,}  
    116.     o_colum=${o_colum%"}  
    117.     o_colum_name=${o_colum_name%,}  
    118.     echo $o_colum_name > vmstat.csv1  
    119.       
    120.     # 因为gawk '{print $o_colum}'引用$o_colum做输出控制,但是无法使用,只能转到临时脚本中再执行  
    121.     echo '#!/bin/sh' > vmstat.sh  
    122.     echo "grep ${colum_name[0]} jcvmstat.log | gawk '{print $o_colum}' >> vmstat.csv1" >> vmstat.sh  
    123.     chmod u+x vmstat.sh  
    124.     ./vmstat.sh  
    125.     rm -rf vmstat.sh  
    126. fi  
    127.   
    128. if [ ! -z $sda ];then  
    129.     colum_name=("sda" "" "sda_rrqm/s" "sda_wrqm/s" "sda_r/s" "sda_w/s" "sda_rsec/s" "sda_wsec/s" "sda_avgrq-sz" "sda_avgqu-sz" "sda_await" "sda_svctm" "sda_%util")  
    130.     OLD_IFS="$IFS"   
    131.     IFS=","   
    132.     colums=($sda)   
    133.     IFS="$OLD_IFS"   
    134.     o_colum=""  
    135.     o_colum_name=""  
    136.     for c in ${colums[@]}   
    137.     do  
    138.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    139.             continue  
    140.         fi  
    141.         o_colum=${o_colum}$$c","  
    142.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    143.     done  
    144.     o_colum=${o_colum%"}  
    145.     o_colum=${o_colum%,}  
    146.     o_colum=${o_colum%"}  
    147.     o_colum_name=${o_colum_name%,}  
    148.     echo $o_colum_name > sda_io.csv1  
    149.       
    150.     # 因为gawk '{print $o_colum}'引用$o_colum做输出控制,但是无法使用,只能转到临时脚本中再执行  
    151.     echo '#!/bin/sh' > sda.sh  
    152.     echo "grep ${colum_name[0]} jciostat.log | gawk '{print $o_colum}' >> sda_io.csv1" >> sda.sh  
    153.     chmod u+x sda.sh  
    154.     ./sda.sh  
    155.     rm -rf sda.sh  
    156. fi  
    157.   
    158. if [ ! -z $sdb ];then  
    159.     colum_name=("sdb" "" "sdb_rrqm/s" "sdb_wrqm/s" "sdb_r/s" "sdb_w/s" "sdb_rsec/s" "sdb_wsec/s" "sdb_avgrq-sz" "sdb_avgqu-sz" "sdb_await" "sdb_svctm" "sdb_%util")  
    160.     OLD_IFS="$IFS"   
    161.     IFS=","   
    162.     colums=($sdb)   
    163.     IFS="$OLD_IFS"   
    164.     o_colum=""  
    165.     o_colum_name=""  
    166.     for c in ${colums[@]}   
    167.     do  
    168.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    169.             continue  
    170.         fi  
    171.         o_colum=${o_colum}$$c","  
    172.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    173.     done  
    174.     o_colum=${o_colum%"}  
    175.     o_colum=${o_colum%,}  
    176.     o_colum=${o_colum%"}  
    177.     o_colum_name=${o_colum_name%,}  
    178.     echo $o_colum_name > sdb_io.csv1  
    179.       
    180.     # 因为gawk '{print $o_colum}'引用$o_colum做输出控制,但是无法使用,只能转到临时脚本中再执行  
    181.     echo '#!/bin/sh' > sdb.sh  
    182.     echo "grep ${colum_name[0]} jciostat.log | gawk '{print $o_colum}' >> sdb_io.csv1" >> sdb.sh  
    183.     chmod u+x sdb.sh  
    184.     ./sdb.sh  
    185.     rm -rf sdb.sh  
    186. fi  
    187.   
    188. if [ ! -z $mem ];then  
    189.     colum_name=("Mem" "" "mem_total" "mem_used" "mem_free" "shared" "buffers" "cached")  
    190.     OLD_IFS="$IFS"   
    191.     IFS=","   
    192.     colums=($mem)   
    193.     IFS="$OLD_IFS"   
    194.     o_colum=""  
    195.     o_colum_name=""  
    196.     for c in ${colums[@]}   
    197.     do  
    198.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    199.             continue  
    200.         fi  
    201.         o_colum=${o_colum}$$c","  
    202.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    203.     done  
    204.     o_colum=${o_colum%"}  
    205.     o_colum=${o_colum%,}  
    206.     o_colum=${o_colum%"}  
    207.     o_colum_name=${o_colum_name%,}  
    208.     echo $o_colum_name > mem_used.csv1  
    209.       
    210.     echo '#!/bin/sh' > mem.sh  
    211.     echo "grep ${colum_name[0]} jcfree_g.log | gawk '{print $o_colum}' >> mem_used.csv1" >> mem.sh  
    212.     chmod u+x mem.sh  
    213.     ./mem.sh  
    214.     rm -rf mem.sh  
    215. fi  
    216.   
    217. if [ ! -z $swap ];then  
    218.     colum_name=("Swap" "" "swap_total" "swap_used" "swap_free")  
    219.     OLD_IFS="$IFS"   
    220.     IFS=","   
    221.     colums=($swap)   
    222.     IFS="$OLD_IFS"  
    223.     o_colum=""  
    224.     o_colum_name=""  
    225.     for c in ${colums[@]}   
    226.     do  
    227.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    228.             continue  
    229.         fi  
    230.         o_colum=${o_colum}$$c","  
    231.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    232.     done  
    233.     o_colum=${o_colum%"}  
    234.     o_colum=${o_colum%,}  
    235.     o_colum=${o_colum%"}  
    236.     o_colum_name=${o_colum_name%,}  
    237.     echo $o_colum_name > swap_used.csv1  
    238.     echo '#!/bin/sh' > swap.sh  
    239.     echo "grep ${colum_name[0]} jcfree_g.log | gawk '{print $o_colum}' >> swap_used.csv1" >> swap.sh  
    240.     chmod u+x swap.sh  
    241.     ./swap.sh  
    242.     rm -rf swap.sh  
    243. fi  
    244.   
    245. if [ ! -z $la ];then  
    246.     colum_name=("load average" "load_5min" "load_10min" "load_15min")  
    247.     OLD_IFS="$IFS"  
    248.     IFS=","   
    249.     colums=($la)  
    250.     IFS="$OLD_IFS"  
    251.     o_colum=""  
    252.     o_colum_name=""  
    253.     for c in ${colums[@]}   
    254.     do  
    255.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    256.             continue  
    257.         fi  
    258.         o_colum=${o_colum}$$c  
    259.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    260.     done  
    261.     o_colum=${o_colum%"}  
    262.     o_colum=${o_colum%,}  
    263.     o_colum=${o_colum%"}  
    264.     o_colum_name=${o_colum_name%,}  
    265.     echo $o_colum_name > load.csv1  
    266.       
    267.     echo '#!/bin/sh' > la.sh  
    268.     echo "grep "${colum_name[0]}" jctop.log | cut -d, -f3,4,5 | cut -d: -f2 | gawk '{print $o_colum}'>> load.csv1" >> la.sh  
    269.     chmod u+x la.sh  
    270.     ./la.sh  
    271.     rm -rf la.sh  
    272. fi  
    273.   
    274. if [ ! -z $cpu ];then  
    275.     colum_name=("all" "" "us" "ni" "sy" "wa" "st" "id")  
    276.     OLD_IFS="$IFS"  
    277.     IFS=","   
    278.     colums=($cpu)  
    279.     IFS="$OLD_IFS"  
    280.     o_colum=""  
    281.     o_colum_name=""  
    282.     for c in ${colums[@]}   
    283.     do  
    284.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    285.             continue  
    286.         fi  
    287.         o_colum=${o_colum}$$c","  
    288.         o_colum_name=${o_colum_name}${colum_name[$c]},  
    289.     done  
    290.     o_colum=${o_colum%"}  
    291.     o_colum=${o_colum%,}  
    292.     o_colum=${o_colum%"}  
    293.     o_colum_name=${o_colum_name%,}  
    294.     echo $o_colum_name > cpu.csv1  
    295.       
    296.     echo '#!/bin/sh' > cpu.sh  
    297.     echo "grep "${colum_name[0]}" jccpu.log | gawk '{print $o_colum}'>> cpu.csv1" >> cpu.sh  
    298.     chmod u+x cpu.sh  
    299.     ./cpu.sh  
    300.     rm -rf cpu.sh  
    301. fi  
    302.   
    303. if [ ! -z $network ];then  
    304.     colum_name=("" "" "rxpck/s" "txpck/s" "rxkB/s" "txkB/s" "rxcmp/s" "txcmp/s" "rxmcst/s")  
    305.     OLD_IFS="$IFS"  
    306.     IFS=","   
    307.     colums=($network)  
    308.     IFS="$OLD_IFS"  
    309.     o_colum=""  
    310.     o_colum_name=""  
    311.     for c in ${colums[@]}   
    312.     do  
    313.         if [ -z "${colum_name[$c]}" ] || [ $c -ge ${#colum_name[@]} ];then  
    314.             continue  
    315.         fi  
    316.         o_colum=${o_colum}$$c","  
    317.         o_colum_name=${o_colum_name}${colum_name[$c]}"_"${netdev},  
    318.     done  
    319.     o_colum=${o_colum%"}  
    320.     o_colum=${o_colum%,}  
    321.     o_colum=${o_colum%"}  
    322.     o_colum_name=${o_colum_name%,}  
    323.     echo $o_colum_name > network.csv1  
    324.       
    325.     echo '#!/bin/sh' > network.sh  
    326.     echo "grep "$netdev" jcnetwork.log | gawk '{print $o_colum}'>> network.csv1" >> network.sh  
    327.     chmod u+x network.sh  
    328.     ./network.sh  
    329.     rm -rf network.sh  
    330. fi  
    331.   
    332. #输出时间  
    333. echo time > time.csv1  
    334. grep "CST" jcvmstat.log | gawk {'print $18"/"$19'} >> time.csv1  
    335.   
    336. # 第二步:整合csv文件  
    337. i=0 # next csv file  
    338. j=0 # prev csv file  
    339. csv_files=`ls *.csv1|grep -v "time.csv1"`  
    340. for f in $csv_files  
    341. do  
    342.     # 可能在行尾有逗号,删除这个逗号  
    343.     sed -i 's/,$//g' $f  
    344.       
    345.     if [ $i -eq 0 ];then  # first  
    346.         gawk 'NR==FNR{a[FNR]=$0;next}{print a[FNR]","$0;next}' time.csv1 $f > tmp$j.csv2  
    347.         i=$(($i+1))  
    348.     else # not first  
    349.         gawk 'NR==FNR{a[FNR]=$0;next}{print a[FNR]","$0;next}' tmp$j.csv2 $f > tmp$i.csv2  
    350.         i=$(($i+1))  
    351.         j=$(($j+1))  
    352.     fi  
    353. done  
    354.   
    355. i=$(($i-1))  
    356. mv tmp$i.csv2  result.csv  
    357. sed -i 's/time/    /g' result.csv  
    358.   
    359. #gawk 'NR==FNR{a[FNR]=$0;next}{print a[FNR]","$0;next}' time.csv swap_used.csv > tmp1.csv  
    360. #gawk 'NR==FNR{a[FNR]=$0;next}{print a[FNR]","$0;next}' tmp1.csv sda_used.csv > tmp2.csv  
    361. #gawk 'NR==FNR{a[FNR]=$0;next}{print a[FNR]","$0;next}' tmp2.csv sdb_used.csv > tmp3.csv  
    362. #gawk 'NR==FNR{a[FNR]=$0;next}{print a[FNR]","$0;next}' tmp3.csv load.csv > result.csv  
    363. #sed -i 's/time/    /g' result.csv  
    364.   
    365. if [ ! -z $day ];then  
    366.     date_str=`echo $day | grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}'`  
    367.     if [ ! -z "$date_str" ];then  
    368.         head -1 result.csv > $date_str.csv  
    369.         grep $date_str result.csv >> $date_str.csv  
    370.         sed -i 's/ //g' $date_str.csv  
    371.         if [ ! -z $start ] && [ ! -z $end ];then  
    372.             st=`echo $start | grep -E '^[0-9]{2}:[0-9]{2}:[0-9]{2}'`  
    373.             et=`echo $end | grep -E '^[0-9]{2}:[0-9]{2}:[0-9]{2}'`  
    374.             if [ ! -z $st ] && [ ! -z $et ];then  
    375.                 stn=`echo $st|sed 's/://g'`  
    376.                 etn=`echo $et|sed 's/://g'`  
    377.                 filename=${date_str}-${stn}-${etn}.csv  
    378.                 head -1 $date_str.csv > $filename  
    379.                 lines=`cat $date_str.csv`  
    380.                 for line in $lines  
    381.                 do  
    382.                     ctn=`echo $line | cut -d',' -f1|cut -d'/' -f2|sed 's/://g'`  
    383.                     if [ `expr $ctn + 0` -gt `expr $stn + 0` ] && [ `expr $ctn + 0` -lt `expr $etn + 0` ];then  
    384.                         echo $line >> $filename  
    385.                     fi  
    386.                 done  
    387.             else  
    388.                 echo "Time foramt error.Please input HH-MM-SS"  
    389.             fi  
    390.         fi  
    391.     else  
    392.         echo "Date foramt error.Please input YYYY-MM-DD"  
    393.     fi  
    394. fi  
    395. rm -rf *.csv1  
    396. rm -rf *.csv2  
    397. rm -rf jc*.log  

    要生成 2016年7月8日 早上7点到8点之间内存的used和cache,swap的used和free,sda磁盘的%util 可以使用如下命令:

    ./analyz.sh -swap 3,4 -sda 12  -mem 3,7 -day 2016-07-08 -start 07:00:00 -end 08:00:00

    将生成的csv文件用excel打开,就可以使用图表功能生成出性能曲线。

  • 相关阅读:
    又到一年高考时
    嵌套母版页中的控件访问
    用临时表改善嵌套SQL语句的执行速度
    利用图片进行定位
    CSS样式嵌套
    触摸MVP
    抱SQL SERVER大腿之从巨大表中提炼非重复数据
    用参数来控制用户控件的缓存
    Understand static/global data completely in C++
    VS资源(基础)
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/6552381.html
Copyright © 2011-2022 走看看