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打开,就可以使用图表功能生成出性能曲线。

转载于:https://www.cnblogs.com/AmilyWilly/p/6552381.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值