解析系统信息文件#!/bin/bash## script of topcheck#log_dir=$(dirname $0)#LOG_FILE=$log_dir/`date +%Y-%m-%d.log`#echo -e "=============== START ================" >> $LOG_FILE#echo -e "====> icfs -s, `date`" >> $LOG_FILE#/usr/bin/timeout 10 /usr/bin/icfs -s &>> $LOG_FILE##echo -e "====> dstat 1 10, `date`" >> $LOG_FILE#/usr/bin/dstat 1 10 >> $LOG_FILE##echo -e "====> top -b -n 2, `date`" >> $LOG_FILE#/usr/bin/top -b -n 2 |awk '/icfs-mon|icfs-mds|icfs-osd|icfs-fuse|ganesha|Cpu|Mem/' &>> $LOG_FILE###echo -e "====> df -h, `date`" >> $LOG_FILE##/usr/bin/timeout 5 /usr/bin/df -h >> $LOG_FILE##echo -e "====> iostat -mx 1 2, `date`" >> $LOG_FILE#/usr/bin/iostat -mx 1 2 >> $LOG_FILE##echo -e "====> free -m, `date`" >> $LOG_FILE#/usr/bin/free -m >> $LOG_FILE##echo -e "==================== END ==========================\n\n" >> $LOG_FILE# start this scriptif [ $# -ne 1 ] || [ $1 = "-h" ]then echo -e "do it like this: $0 {file_name}" exit 0fiif [ ! -z $1 ]then  echo -e "\n\tplease make sure that the file $1 is exist.\n" exit -1fisrc_file=$1dst_file=./dst_filedst_icfs_file=./.dst_icfs_filedst_dstat_file=./.dst_dstat_filedst_top_file=./.dst_top_filedst_iostat_file=./.dst_iostat_filedst_free_file=./.dst_free_filestr_start="START"str_end="END"str_icfs="icfs -s"str_dstat="dstat "str_top="top -b -n"str_iostat="iostat -mx"str_free="free -k"echo >$dst_icfs_fileecho >$dst_dstat_fileecho >$dst_top_fileecho >$dst_iostat_fileecho >$dst_free_filefunction cmd_proc_icfs_write_title(){ arr_str=$1 attribute_num=$2 grep "attribute" $dst_icfs_file &>/dev/null if [ $? -eq 0 ] then return 0 else echo -e "icfs_attribute\t\t\t\t\t" >> $dst_icfs_file fi for (( idx = 0; idx do let idx_base=idx*3 let idx_attribute=idx_base+2 let idx_unit=idx_base+1 if [ ${arr_str[$idx_unit]} == "kB/s" ] || [ ${arr_str[$idx_unit]} == "MB/s" ] || [ ${arr_str[$idx_unit]} == "GB/s" ] then echo -ne "${arr_str[$idx_attribute]}(MB/s)\t" >> $dst_icfs_file elif [ ${arr_str[$idx_unit]} == "op/s" ] then echo -ne "${arr_str[$idx_attribute]}(op/s)\t" >> $dst_icfs_file fi done echo -ne "\n" >> $dst_icfs_file return 0}function cmd_proc_icfs_write_value(){ value=$1 attribute=$2 if [ "$attribute" == "kB/s" ] then value=`echo "scale=2; $value / 1024" | bc` fi echo -ne "$value\t\t" >> $dst_icfs_file return 0}function cmd_proc_icfs(){ str_log=$1 if [[ $str_log != *"client io "* ]] then return 0 fi #remove 'client to ' from str_log str_log=${str_log:10} #split str_log into array by ',' arr_str=(${str_log//,/ }) #get the number of element in arr_str arr_len=${#arr_str[@]} #get the number of attribute in arr_str attribute_num=`expr $arr_len / 3` cmd_proc_icfs_write_title "${arr_str[*]}" $attribute_num for (( idx = 0; idx do let idx_value=idx*3 let idx_att=idx_value+1 cmd_proc_icfs_write_value ${arr_str[$idx_value]} "${arr_str[$idx_att]}" done echo -ne "\n" >>$dst_icfs_file return 0}function cmd_proc_dstat_write_title(){ arr_str=$1 arr_len=$2 grep "attribute" $dst_dstat_file &>/dev/null if [ $? -eq 0 ] then return 0 else echo -e "dstat_attribute\t" >> $dst_dstat_file fi for (( idx = 0; idx do if [ $idx -eq 6 ] || [ $idx -eq 7 ] then echo -ne "${arr_str[$idx]}\t" >> $dst_dstat_file fi done grep "writ" $dst_dstat_file &>/dev/null if [ $? -eq 0 ] then echo -ne "\t\n" >> $dst_dstat_file fi return 0}dstat_read=0dstat_write=0dstat_index=0dstat_max=0function cmd_proc_dstat_write_value(){ value_read=$1 value_write=$2 if [ $dstat_index -eq 0 ] then let dstat_index=dstat_index+1 return 0 fi if [[ $value_read == *"k" ]]  then value_read=${value_read%k} value_read=`echo "scale=2; $value_read / 1024" | bc` elif [[ $value_read == *"B" ]] then value_read=${value_read%B} value_read=`echo "scale=2; $value_read / 1024 / 1024" | bc` else value_read=${value_read%M} fi dstat_read=`echo "scale=2; $dstat_read + $value_read" | bc` if [[ $value_write == *"k" ]]  then value_write=${value_write%k} value_write=`echo "scale=2; $value_write / 1024" | bc` elif [[ $value_write == *"B" ]] then value_write=${value_write%B} value_write=`echo "scale=2; $value_write / 1024 / 1024" | bc` else value_write=${value_write%M} fi dstat_write=`echo "scale=2; $dstat_write + $value_write" | bc` let dstat_index=dstat_index+1 if [ $dstat_index -eq $((dstat_max + 1)) ] then dstat_read=`echo "scale=2; $dstat_read / $dstat_max" | bc` dstat_write=`echo "scale=2; $dstat_write / $dstat_max" | bc` echo -e "$dstat_read\t$dstat_write\t\t" >> $dst_dstat_file dstat_write=0 dstat_read=0 dstat_index=0 fi return 0}function cmd_proc_dstat(){ str_log=$1 if [[ $str_log == *"You did not select"* ]] || [[ $str_log == *"total-cpu-usage"* ]] then  return 0 fi #split str_log into array by '|' arr_str=(${str_log//|/ }) #get the number of element in arr_str arr_len=${#arr_str[@]} #get the number of attribute in arr_str attribute_num=`expr $arr_len / 3` if [[ $str_log == *"usr sys idl wai hiq siq"* ]] then cmd_proc_dstat_write_title "${arr_str[*]}" $arr_len return 0 fi cmd_proc_dstat_write_value ${arr_str[6]} "${arr_str[7]}" return 0}function cmd_proc_top_write_title(){ grep "attribute" $dst_top_file &>/dev/null if [ $? -eq 0 ] then return 0 fi echo -e "top_attribute\t\t\t\t\t\t\t\t\ncpu_id(%)\tosd_max(M)\tosd_min(M)\tmon(M)\t\tmds(M)\tganesha(M)\t" >>$dst_top_file return 0}function cmd_proc_top_osd_info(){ osd_value=$1 if [[ $osd_value == *"g" ]] then osd_value=${osd_value%g} osd_value=`echo "scale=2; $osd_value * 1024" | bc` elif [[ $osd_value == *"m" ]] then osd_value=${osd_value%m} else osd_value=`echo "scale=2; $osd_value / 1024" | bc` fi ret=`echo "$top_osd_max if [ $ret -eq 1 ] then top_osd_max=`echo "scale=2; $osd_value / 1" | bc` fi if [ `echo "$top_osd_min == 0" | bc` -eq 1 ] then top_osd_min=$osd_value elif [ `echo "$top_osd_min > $osd_value" | bc` -eq 1 ] then top_osd_min=$osd_value fi return 0}function cmd_proc_top_mon_info(){ mon_value=$1 if [ $mon_value == *"g" ] then mon_value=${mon_value%g} mon_value=`echo "scale=2; $mon_value * 1024" | bc` elif [ $mon_value == *"m" ] then mon_value=${mon_value%m} else mon_value=`echo "scale=2; $mon_value / 1024" | bc` fi top_mon=$mon_value return 0}function cmd_proc_top_mds_info(){ mds_value=$1 if [ $mds_value == *"g" ] then mds_value=${mds_value%g} mds_value=`echo "scale=2; $mds_value * 1024" | bc` elif [ $mds_value == *"m" ] then mds_value=${mds_value%m} else mds_value=`echo "scale=2; $mds_value / 1024" | bc` fi top_mds=$mds_value return 0}function cmd_proc_top_ganesha_info(){ ganesha_value=$1        if [ $mds_value == *"g" ]        then                ganesha_value=${ganesha_value%g}                ganesha_value=`echo "scale=2; $ganesha_value * 1024" | bc`        elif [ $ganesha_value == *"m" ]        then                ganesha_value=${ganesha_value%m}        else                ganesha_value=`echo "scale=2; $ganesha_value / 1024" | bc`        fi        top_ganesha=$ganesha_value        return 0}top_is_first=0top_osd_max=0top_osd_min=0top_mon=0top_mds=0top_mds_cunt=1top_ganesha=0function cmd_proc_top(){ str_log=$1 if [[ $str_log == *"Cpu"* ]] then let top_is_first=top_is_first+1 fi if [ $top_is_first -eq 1 ] then return 0 fi if [[ $str_log == "top_done" ]] && [[ $top_is_first -eq 2 ]] then echo -ne "$top_osd_max\t\t$top_osd_min\t\t$top_mon\t\t$top_mds\t$top_ganesha\t\n" >> $dst_top_file top_is_first=0 top_osd_max=0 top_osd_min=0 return 0 elif [[ $str_log == "top_done" ]] then return 0 fi cmd_proc_top_write_title arr_str=(${str_log//,/ }) arr_len=${#arr_str[@]} case $str_log in *"Cpu"*) echo -ne "${arr_str[7]}\t\t" >> $dst_top_file ;; *"icfs-osd"*) cmd_proc_top_osd_info "${arr_str[5]}" ;; *"icfs-mon"*) cmd_proc_top_mon_info "${arr_str[5]}" ;; *"icfs-mds"*) cmd_proc_top_mds_info "${arr_str[5]}" ;; *"ganesha"*) cmd_proc_top_ganesha_info "${arr_str[5]}" ;; esac return 0}function cmd_proc_iostat_write_title(){ grep "attribute" $dst_iostat_file &>/dev/null if [ $? -eq 0 ] then return 0 fi echo -e "iostat_attribute\t\nwMB/s\t\tutil\t" >> $dst_iostat_file return 0}iostat_is_first=0iostat_average_wr=0iostat_average_util=0iostat_index=0function cmd_proc_iostat(){ str_log=$1 if [[ $str_log == *"Device:"* ]] then let iostat_is_first=iostat_is_first+1 fi if [ $iostat_is_first -le 1 ]  then return 0 fi if [[ $str_log != "sd"* ]] && [[ $str_log != "iostat_done" ]] then return 0 fi arr_str=(${str_log// / }) if [ ${arr_str[0]} == "sda" ] then return 0 fi if [[ $str_log = "iostat_done" ]] && [[ $iostat_is_first -eq 2 ]] then iostat_average_wr=`echo "scale=2; $iostat_average_wr / $iostat_index" | bc` iostat_average_util=`echo "scale=2; $iostat_average_util / $iostat_index" | bc` echo -e "$iostat_average_wr\t\t$iostat_average_util\t" >> $dst_iostat_file iostat_average_wr=0 iostat_average_util=0 iostat_index=0 iostat_is_first=0 return 0 elif [[ $str_log = "iostat_done" ]] then return 0 fi cmd_proc_iostat_write_title wrqm_ret=`echo "${arr_str[2]} == 0.00" | bc` if [[ $wrqm_ret -eq 1 ]] then return 0 fi let iostat_index=iostat_index+1 iostat_average_wr=`echo "scale=2; $iostat_average_wr + ${arr_str[6]}" | bc` iostat_average_util=`echo "scale=2; $iostat_average_util + ${arr_str[13]}" | bc` return 0}function cmd_proc_free(){ str_log=$1 grep "attribute" $dst_free_file &>/dev/null if [ $? -ne 0 ] then echo -e "free_attribute\t\t\t\nfree(M)\tbuff/cache(M)\t" >> $dst_free_file fi arr_str=(${str_log// / }) if [[ ${arr_str[0]} == "Mem:" ]] then echo -e "${arr_str[3]}\t${arr_str[5]}\t" >> $dst_free_file fi return 0}function analyze_source_data_file(){ while read str_line do case $str_line in *"$str_icfs"*) str_flag="icfs" continue ;; *"$str_dstat"*) str_flag="dstat" arr_str=(${str_line//,/ }) dstat_max=${arr_str[3]} continue ;; *"$str_top"*) str_flag="top" top_mds_cunt=1 continue ;; *"$str_iostat"*) str_flag="iostat" continue ;; *"$str_free"*) str_flag="free" continue ;; *"$str_start"* | *"$str_end"*) cmd_proc_top "top_done" cmd_proc_iostat "iostat_done" continue ;; esac case $str_flag in "icfs") cmd_proc_icfs "$str_line" ;; "dstat") cmd_proc_dstat "$str_line" ;; "top") cmd_proc_top "$str_line" ;; "iostat") cmd_proc_iostat "$str_line" ;; "free") cmd_proc_free "$str_line" ;; esac done return 0}function merge_submodule_data_file(){ paste -d " " $dst_iostat_file $dst_top_file  $dst_free_file $dst_dstat_file $dst_icfs_file > $dst_file cat $dst_file rm -rf $dst_iostat_file $dst_top_file  $dst_free_file $dst_dstat_file $dst_icfs_file return 0}analyze_source_data_filemerge_submodule_data_file
10-17 12:25