如何計算MySQL中的QPS及TPS指標

指標介紹

  • QPS:Queries Per Second
    查詢量/秒,是一臺服務器每秒可以相應的查詢次數,是對一個特定的查詢服務器在規定時間內所處理查詢量多少的衡量標準。mysql

  • TPS : Transactions Per Second 事務數/秒,是一臺數據庫服務器在單位時間內處理的事務的個數。面試

QPS指標

先來認識一下如下幾個有關查詢的指標:sql

  1. Questions:MySQL從上一次啓動到當前客戶端發送給MySQL的查詢數量,不包括存儲過程內部的查詢。它不統計COM_PING,COM_STATISTICS,COM_STMT_PREPARE,COM_STMT_CLOSE,COM_STMT_RESET數量,但它會把show命令計算到指標當中。
  2. Queries:MySQL從上一次啓動到當前客戶端發送給MySQL的查詢數量,包括存儲過程內部的查詢,它不統計COM_PING和COM_STATISTICS兩個命令。
  3. Com_select:MySQL從上一次啓動到當前所執行的查詢語句總數量。

由上可見,在數據庫中執行show命令會使questions值加1,而com_select則不記錄,並且對於數據庫的監控,常常會用到show命令,因此在用questions方式計算時,數據實際上是被污染的。 並且questions的值在設置環境變量的時候,也是一直在增加的,而com_select的值在此過程當中,並不增加。 因此在使用question方式進行計算時,人爲拉高了qps的結果,相對來講,使用com_select此種方式來計算qps,相對比較帖近真實狀況一些,也就是說,在同等條件下,拉高了qps的值。數據庫

如下將介紹經過Questions方式以及Com_select方式計算QPSbash

Questions方式計算QPS

1.Questions方式計算QPS公式服務器

questions = show global status where variable_name='Questions';
uptime = show global status like 'Uptime';
qps=questions/uptime
複製代碼

如上,拿當前Questions值除去Uptime=QPS,這個QPS的意義爲從MySQL上一次啓動到當前而且包含show命令平均每秒的QPS值,假如某個時間段的查詢數量特別高,可是經過除Uptime時間,也會被拉下來。而且此questions值包含了show命令及環境變量所形成的數據污染。markdown

2.Questions方式計算QPS指標SQL 注:如下SQL在MySQL8.0中進行測試,5.6或5.7中的稍有差別。架構

select round(sum(if(variable_name='Questions',variable_value,0))/sum(if(variable_name='Uptime',variable_value,0)),1) as 'QPS' from performance_schema.global_status where variable_name in ('Questions','Uptime');
複製代碼

Com_select方式計算QPS

經過Com_select來計算QPS,能夠連續獲取兩次Com_select指標,拿新指標減去老指標後再除於間隔時長的出間隔時間內的每秒平均值。這種方式更貼近真實一些。 1.Com_Select方式計算QPS腳本運維

Com_Select = show global status where Variable_name='Com_select';
#!/usr/bin/env bash
OLD_QPS=`echo "show global status where Variable_name='Com_select';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
sleep $1
NEW_QPS=`echo "show global status where Variable_name='Com_select';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
echo "($NEW_QPS-$OLD_QPS) / $1" | bc
複製代碼

TPS指標

獲取TPS指標的方式也有兩種:分佈式

  1. 基於com_commitcom_rollback計算tps
  2. 基於com_insertcom_deletecom_updatestatus,變量計算tps

基於com_commit、com_rollback計算tps

相關指標介紹:

  • Com_commit:MySQL從上一次啓動到當前所執行的提交語句總數量
  • Com_rollback:MySQL從上一次啓動到當前所執行的回退語句總數量

1.基於com_commit和com_rollback方式計算TPS公式 這樣計算出來的TPS也是MySQL從上次啓動到當前平均每秒的TPS指標

com_commit = show global status where variable_name='com_commit';
com_rollback = show global status where variable_name='com_rollback';
uptime = show global status where Variable_name='Uptime';
tps=(com_commit + com_rollback)/uptime
複製代碼

2.計算腳本

#!/usr/bin/env bash
COM_COMMIT=`echo "show global status where Variable_name='Com_commit';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
COM_ROLLBACK=`echo "show global status where Variable_name='Com_rollback';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
UPTIME=`echo "show global status where Variable_name='Uptime';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`

echo "($COM_COMMIT + $COM_ROLLBACK) / $UPTIME" | bc
複製代碼

基於com_insert、com_delete、com_update的status計算tps

相關指標介紹:

  • Com_update: MySQL從上一次啓動到當前所執行的更新語句總數量
  • Com_delete:MySQL從上一次啓動到當前所執行的刪除語句總數量
  • Com_insert:MySQL從上一次啓動到當前所執行的插入語句總數量

1.計算腳本 指定間隔時間內取值兩次,而後新指標減去老指標後三個指標相加再除以間隔時間得出間隔時間內每秒平均TPS

#/usr/bin/env bash
OLD_COM_INSERT=`echo "show global status where Variable_name='Com_insert';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
OLD_COM_UPDATE=`echo "show global status where Variable_name='Com_update';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
OLD_COM_DELETE=`echo "show global status where Variable_name='Com_delete';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
sleep $1
NEW_COM_INSERT=`echo "show global status where Variable_name='Com_insert';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
NEW_COM_UPDATE=`echo "show global status where Variable_name='Com_update';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`
NEW_COM_DELETE=`echo "show global status where Variable_name='Com_delete';"|mysql --defaults-file=./.my.cnf -N|awk '{print $2}'`

echo "(($NEW_COM_INSERT - $OLD_COM_INSERT) + ($NEW_COM_UPDATE - $OLD_COM_UPDATE) + ($NEW_COM_DELETE - $OLD_COM_DELETE)) / $1" | bc
複製代碼

如上內容如存在錯誤或意見不一致,歡迎指出並在評論區討論更好的方法 ※更多文章和資料|點擊後方文字直達 ↓↓↓ 100GPython自學資料包 阿里雲K8s實戰手冊 [阿里雲CDN排坑指南]CDN ECS運維指南 DevOps實踐手冊 Hadoop大數據實戰手冊 Knative雲原生應用開發指南 OSS 運維實戰手冊 雲原生架構白皮書 Zabbix企業級分佈式監控系統源碼文檔 雲原生基礎入門手冊 10G大廠面試題戳領

相關文章
相關標籤/搜索