轉載用sql語句計算出mysql資料庫的qps,tps,iops效能指標

來源:互聯網
上載者:User

標籤:擷取   函數   nod   tab   amp   sql語句   邏輯   mysql啟動   cas   

本帖最後由 LUK 於 2014-9-21 22:39 編輯 

思路:

1 關注MYSQL三個方面的效能指標,分別為query數,transaction數,io請求數

2 在某個時間範圍內(例如20秒),統計MYSQL中上面的三個指標的總量,以及每一秒的量 ,同時每隔一秒種列印一個當前的指標量,在最後再計算並列印時間段內總量及每秒量

3 在IO的統計公式如下:
Key_reads  * 2 +  Key_writes * 2 + Key_read_requests + Innodb_data_reads + Innodb_data_writes + Innodb_dblwr_writes + Innodb_log_writes (該公式最早從taobaodba.com這個網上傳出,這裡學習借鑒)

key_reads 和 key_writes都乘以2的原因是因為如果從磁碟中讀或寫索引塊之後會再去磁碟讀或寫資料區塊,所以就會有至少兩倍的IO請求.
事務數總量為 com_commit+com_rollback
query數通過 com_select擷取


4 雖然統計的時間範圍可以自己指定(例如20秒),但最終計算每秒的指標量時,是以指令碼開始執行時間至指令碼執行結束時mysql uptime的時間差來算的,因為指令碼執行會消耗一定時間,這樣,實際的時間會多於我們指定的時間
(結束時的量-開始時的量)/(結束時uptime-開始時uptime)




#!/bin/bash

#filename mysqlgather.sh
#param
#N seconds
#s print query 
#t print transaction 
#i print mysql io
# example
# ./mysqlgather.sh 20 s t i  

--指令碼的名字為mysqlgather.sh,執行例子為 ./mysqlgather.sh 20 s t i  
其中20為取樣的時間範圍,在這裡假設20s,這個時間參數必須要輸入,時間大小可以自己定
s 表示要統計query及query per second (選擇性參數)
t 表示要統計transaction及transaction per second (選擇性參數)
i 表示要統計mysql中的io請求數及io per second (選擇性參數)

s t i 三個參數可以只輸入其中任意一個或多個,可以只統計三個指標中的一個或者兩個

如果三個參數都寫或者都不寫,表示都要統計s t i


--selecom函數取query數量
#qps

selcom ()
{
      mysql -uroot -e "show global status where variable_name in (‘com_select‘);" > select.out
      SELECT_NUM=`grep -i "com_select"  select.out | awk ‘{print $2}‘`

      echo "com_select: $SELECT_NUM"
}


--trans_num函數 統計transaction數量
#tps

trans_num ()
{
     mysql -uroot -e "show global status where variable_name in(‘com_commit‘,‘com_rollback‘);" > transactions.out

     COMMIT_NUM=`grep -i "com_commit"  transactions.out | awk ‘{print $2}‘`
     ROLLBACK_NUM=`grep -i "com_rollback"  transactions.out | awk ‘{print $2}‘`

     SUM_TRAN=$[ $COMMIT_NUM1 + $ROLLBACK_NUM1 ]
     echo "transations:$SUM_TRAN"
}


--ionum函數統計io讀寫請求數

#IO

ionum ()
{
mysql -uroot -e "show global status where variable_name in(‘Key_reads‘,‘Key_writes‘,‘Key_read_requests‘,‘Innodb_data_reads‘,‘Innodb_data_writes‘,‘Innodb_dblwr_writes‘,‘Innodb_log_writes‘);" > iops.out
KEYREAD=`grep -i "Key_reads"  iops.out | awk ‘{print $2}‘`
KEYWRITE=`grep -i "Key_writes"  iops.out | awk ‘{print $2}‘`
READREQ=`grep -i "Key_read_requests"  iops.out | awk ‘{print $2}‘`
DATAREAD=`grep -i "Innodb_data_reads"  iops.out | awk ‘{print $2}‘`
DATAWRITE=`grep -i "Innodb_data_writes"  iops.out | awk ‘{print $2}‘`
DBLWR=`grep -i "Innodb_dblwr_writes"  iops.out | awk ‘{print $2}‘`
LOGWRITE=`grep -i "Innodb_log_writes"  iops.out | awk ‘{print $2}‘`

SUM_IO=$[ $KEYREAD * 2 + $KEYWRITE * 2 + $READREQ + $DATAREAD + $DATAWRITE + $DBLWR + $LOGWRITE ]
echo "io:$SUM_IO"
}

--up_time函數是統計MYSQL啟動後的時間
#uptime
up_time ()
{
      mysql -uroot -e "show global status where variable_name in (‘Uptime‘);" > uptime.out
     UP_TIME=`grep -i "Uptime"  uptime.out | awk ‘{print $2}‘`
}



--下面的程式邏輯是先檢查輸入了哪些參數,再計算所想要統計的指標
NUM_PARM=$#

if [ $NUM_PARM = 1 ];then
PARM1=$1
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
trans_num
SUM_TRAN1=$SUM_TRAN
ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
trans_num
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_TRAN2=$SUM_TRAN
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME


--統計時間範圍內的總量
SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]

--統計每秒的量
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND; trans_s:$TRANS_PERSECOND; io_s:$IOREQ_PERSECOND"
elif [ $NUM_PARM = 2 ];then
PARM1=$1
PARM2=$2

case $PARM2 in 
"s")
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
up_time
UP_TIME2=$UP_TIME
SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND;"

;;

"t")
PARM1=$1
up_time
UP_TIME1=$UP_TIME
trans_num
SUM_TRAN1=$SUM_TRAN
sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
trans_num
PARM1=$[ $PARM1 - 1]
sleep 1
done
SUM_TRAN2=$SUM_TRAN
up_time
UP_TIME2=$UP_TIME
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
echo -n " trans_s:$TRANS_PERSECOND; "

;;

"i")
PARM1=$1
up_time
UP_TIME1=$UP_TIME

ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 

ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done

SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]
TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n " io_s:$IOREQ_PERSECOND"

;;

*)
exit;
esac



elif [ $NUM_PARM = 3 ];then
PARM1=$1
PARM2=$2
PARM3=$3

if [ $PARM2 = "s" ] || [ $PARM2 = "t" ] && [ $PARM3 = "s" ] || [ $PARM3 = "t" ]; then
PARM1=$1
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
trans_num
SUM_TRAN1=$SUM_TRAN
sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
trans_num
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_TRAN2=$SUM_TRAN
up_time
UP_TIME2=$UP_TIME

SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND; trans_s:$TRANS_PERSECOND;"

elif [ $PARM2 = "s" ] || [ $PARM2 = "i" ] && [ $PARM3 = "s" ] || [ $PARM3 = "i" ];

PARM1=$1
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME

SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND;  io_s:$IOREQ_PERSECOND"
else
PARM1=$1
up_time
UP_TIME1=$UP_TIME
trans_num
SUM_TRAN1=$SUM_TRAN
ionum
SUM_IO1=$SUM_IO

sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
trans_num
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SUM_TRAN2=$SUM_TRAN
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n " trans_s:$TRANS_PERSECOND; io_s:$IOREQ_PERSECOND"
fi
elif [ $NUM_PARM = 4 ];then
PARM1=$1
PARM2=$2
PARM3=$3
PARM4=$4
up_time
UP_TIME1=$UP_TIME
selcom
SELECT_NUM1=$SELECT_NUM
trans_num
SUM_TRAN1=$SUM_TRAN
ionum
SUM_IO1=$SUM_IO
sleep 1
PARM1=$[ $PARM1 - 1]
while [ $PARM1 -gt 0 ]
do 
selcom
trans_num
ionum
PARM1=$[ $PARM1 - 1]
sleep 1
done
SELECT_NUM2=$SELECT_NUM
SUM_TRAN2=$SUM_TRAN
SUM_IO2=$SUM_IO
up_time
UP_TIME2=$UP_TIME


SELECT_DIFF=$[ $SELECT_NUM2 - $SELECT_NUM1 ]
TRANS_DIFF=$[ $SUM_TRAN2 - $SUM_TRAN1 ]
IO_DIFF=$[ $SUM_IO2 - $SUM_IO1 ]

TIME_DIFF=$[ $UP_TIME2 - $UP_TIME1 ]

SELECT_PERSECOND=$[ $SELECT_DIFF / $TIME_DIFF]
TRANS_PERSECOND=$[ $TRANS_DIFF / $TIME_DIFF]
IOREQ_PERSECOND=$[ $IO_DIFF / $TIME_DIFF]
echo -n "sel_s:$SELECT_PERSECOND; trans_s:$TRANS_PERSECOND; io_s:$IOREQ_PERSECOND"


else
echo "You have not input any parameter!";
exit;
fi

轉載用sql語句計算出mysql資料庫的qps,tps,iops效能指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.