QPS(Query per second) 每秒查詢量
TPS(Transaction per second)每秒事務量
這是Mysql的兩個重要性能指標,需要經常查看,和Mysql基准測試的結果對比,如果值過高,就要盡快處理了
計算方法
01
QPS
QPS = Queries / Seconds
Queries 是系統狀態值--總查詢次數,可以通過 show status 查詢得出
Seconds 是監控的時間區間,單位為秒
例如采樣10秒內的查詢次數,那么先查詢一次Queries值(Q1),等待10秒,再查詢一次Queries值(Q2)
QPS = (Q2 - Q1) / 10
02
TPS
mysql中沒有直接的事務計數器,需要通過事務提交數和事務回滾數來計算
TPS = (Com_commit + Com_rollback) / Seconds
Com_commit、Com_rollback 的值通過 show status 查詢得出
計算思路與 QPS 相似
統計腳本
上面是QPS/TPS的統計思路,實際操作中如果用手動方式計算很不方便,最好用程序實現
mysqladmin 的 extended-status 指令和 show status 差不多,可以查看mysql的狀態值,如
# mysqladmin -uroot -p'密碼' extended-status
其中含有我們需要的狀態值,那么就可以分析extended-status的結果信息,然后計算,最后顯示出來
統計目標
每隔一秒統計一次 QPS、TPS
mysql 還有兩個信息比較重要:
Threads_connected 當前連接的線程的個數
Threads_running 運行狀態的線程的個數
這兩個值也在extended-status的結果中,所以可以一道顯示出來
最后統計結果信息包括:
QPS、TPS、Threads_connected、Threads_running
先看下統計結果的展現形式
基本思路
每秒鍾運行一次extended-status,使用awk分析結果值,從中篩選出我們需要的值:
Queries、Com_commit、Com_rollback、Threads_connected、Threads_running
QPS = Queries值 - 上一次的值
TPS = (Com_commit值 - 上一次的值) + (Com_rollback值 - 上一次的值)
因為是1秒鍾統計一次,所以計算QPS/TPS時就不用除以秒數了
腳本代碼
代碼分析
awk是代碼中的重點,mysqladmin 的執行結果通過管道傳給 awk 進行分析
'BEGIN{flag=0;
print "";
print "QPS TPS Threads_con Threads_run ";
print "------------------------------------- "}
這部分是初始設置,打印出表頭
flag=0 是設置一個標識位,后面用到
$2 ~ /Queries$/ {q=$4-lq;lq=$4;}
其中 $2 $4 代表某列的內容
awk是按行分析並按空格分割的,例如行信息為:
| Queries | 213263713 |
按空格分割后得到5列:
'|', 'Queries', '|', '213263713', '|'
$2 : Queries
$4 : 213263713
那么這句的意思就是:
當第2列的值匹配‘Queries’時,
變量q = 第4列的值 - 變量lq的值,
變量lq = 第4列的值
變量q 就是 QPS值,用這一次的 Queries值 減去 上一次的值
$2 ~ /Com_commit$/ {c=$4-lc;lc=$4;}
$2 ~ /Com_rollback$/ {r=$4-lr;lr=$4;}
$2 ~ /Threads_connected$/ {tc=$4;}
$2 ~ /Threads_running$/ {tr=$4;
這幾句的意思與上一句類似
if(flag==0){
flag=1;
}
這里用到了flag這個標識位,意思是對第一次的分析結果什么都不做,因為這句
{q=$4-lq;lq=$4;}
q=$4-lq; 中的 lq 在第一次分析中還沒有值
else {
printf "%-6d %-8d %-10d %d \n", q,c+r,tc,tr;
}
這部分就是打印統計結果信息
下面是腳本代碼下載地址,有興趣的話可以下來實驗一下
http://devdd.oss-cn-beijing.aliyuncs.com/mysql_QPS_TPS.txt
#!/bin/bash mysqladmin -uroot -p'瀵嗙爜' extended-status -i1|awk \ 'BEGIN{flag=0; print ""; print "QPS TPS Threads_con Threads_run "; print "------------------------------------- "} $2 ~ /Queries$/ {q=$4-lq;lq=$4;} $2 ~ /Com_commit$/ {c=$4-lc;lc=$4;} $2 ~ /Com_rollback$/ {r=$4-lr;lr=$4;} $2 ~ /Threads_connected$/ {tc=$4;} $2 ~ /Threads_running$/ {tr=$4; if(flag==0){ flag=1; count=0 }else { printf "%-6d %-8d %-10d %d \n", q,c+r,tc,tr; } }'