本文為博主原創,轉載請註明出處:
最近在進行壓測,為了觀察並定位服務效能的瓶頸,所以在程式碼中很多地方加了執行耗時的日誌,但這種方式只能觀察,卻在壓測的時候,不太能準確的把握程式碼中某些方法的效能,所以想到寫一個指令碼,用來統計所加的日誌中的平均耗時,最大耗時,最小耗時等等,這需要保證每行日誌都是唯一的,程式碼中新增日誌的方式如下:
為了便於驗證,寫了一個簡單的日誌檔案 console.log ,內容如下:
[root@iZ2ze10u5v2hhw1ezi52suZ shell]# cat console.log
filterStr 23
filterStr 56
filterStr 89
filterStr 1
filterStr 10
filterStr 2
requireTime 3
requireTime 4
requireTime 3
requireTime 10
1.先編寫一個計算 含 filterStr 日誌行的所有平均時間,最大時間,最小時間,指令碼示例如下:
#!/bin/bash
sum=0
min=`cat console.log|grep "filterStr"|awk '{print $2}'|head -n 1`
max=0
for value in `cat console.log|grep 'filterStr'|awk '{print $2}'`
do
sum=$(($sum+$value))
if [ $value -le $min ];then
min=$value
fi
if [ $value -ge $max ];then
max=$value
fi
done
echo "總共耗時:"$sum
totalCount=`cat console.log|grep 'filterStr'|awk '{print $2}'|wc -l`
echo "總共請求次數為:"$totalCount
#計算請求的平均時間
avageTime=$(($sum/$totalCount))
echo "平均請求響應時間為: "$avageTime
#列印最大值與最小值
echo "最大值為:"$max
echo "最小值為:"$min
最小值的初始定義命令為: min=`cat console.log|grep "filterStr"|awk '{print $2}'|head -n 1` ; 這行命令過濾出日誌的所有行,並取第一行中過濾出的第二個值(awk '{print $2}')。所以需要提前預定好 該耗時計算在日誌中的位置,我這邊示例中位於第二個位置,所以取第二個$2 的 值
該指令碼執行效果如下:
2. 通過動態傳參過濾內容的方式執行執行指令碼
由於服務中加了很多位於不同程式碼處的耗時日誌,所以想到通過動態傳參的方式執行指令碼,shell 指令碼示例如下:
#!/bin/bash sum=0 min=`cat console.log|grep "$filterStr"|awk '{print $2}'|head -n 1` max=0 filterStr=$1 for value in `cat console.log|grep "$filterStr"|awk '{print $2}'` do sum=$(($sum+$value)) if [ $value -le $min ];then min=$value fi if [ $value -ge $max ];then max=$value fi done echo "總共耗時:"$sum totalCount=`cat console.log|grep "$filterStr"|awk '{print $2}'|wc -l` echo "總共請求行數為:"$totalCount #計算請求的平均時間 avageTime=$(($sum/$totalCount)) echo "平均請求響應時間為: "$avageTime #列印最大值與最小值 echo "最大值為:"$max echo "最小值為:"$min
用該指令碼計算 console.log 中的 requireTime 相關行的耗時統計: