【問題描述】 Queries_per_sec (QPS)是資料庫兩個比較重要的性能計數器指標。我們經常要求開發告知這個參數,以評估資料庫的一個負載情況。下麵的這段代碼連上伺服器,做一個簡單的查詢: using (MySqlConnection conn = new MySqlConnection() ...
【問題描述】
Queries_per_sec (QPS)是資料庫兩個比較重要的性能計數器指標。我們經常要求開發告知這個參數,以評估資料庫的一個負載情況。下麵的這段代碼連上伺服器,做一個簡單的查詢:
using (MySqlConnection conn = new MySqlConnection())
{
conn.ConnectionString = "Database=xx;Host=xx;Port=xx;User Id=xx; Password=xx; charset=utf8;pooling=true;";
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
conn.Open();
cmd.CommandText = " select * from test where ID = 3";
cmd.ExecuteNonQuery();
conn.Close();
}
我們加一個迴圈,執行200萬次。可以看到Queries_per_sec 大約在930次/秒。
Questions_per_sec 大約在620次/秒
執行的時間從14:56:52開始到16:45:22結束,約6510秒,期間執行200萬次。根據我們的理解,QPS應該在 200萬/6510 = 310次/秒左右。但我們系統採集的Queries_per_sec或Questions_per_sec都和這個數據不符。Questions_per_sec是期望值的兩倍,Queries_per_sec是期望值的三倍。這是為什麼呢。
【問題分析】
性能計數器是我們從show global status採集而來。其中的Questions和Queries定義如下:
Questions
The number of statements executed by the server. This includes only statements sent to the server by clients and not statements executed within stored programs, unlike the Queries variable. This variable does not count COM_PING, COM_STATISTICS, COM_STMT_PREPARE, COM_STMT_CLOSE, or COM_STMT_RESET commands.
Queries
The number of statements executed by the server. This variable includes statements executed within stored programs, unlike the Questions variable. It does not count COM_PING or COM_STATISTICS commands.
這個定義有點複雜。我們在伺服器上開啟General Log, 就可以看到,上面的查詢其實還包含Init DB的操作:
3499308 Init DB testdb
3499308 Query select * from test where ID = 3
3499308 Init DB testdb
3499308 Query select * from test where ID = 3
所以,這就解釋了為何Questions_per_sec 比我們預期的多了一倍,這是因為有Init DB操作的緣故。
應該還有另外一個操作,使得Queries_per_sec 這個性能計數器是我們預期的QPS的三倍左右。我們跟蹤show global status like 'com_%'; 這個命令,可以發現下麵三個計數在增加:
1、Com_admin_commands
2、Com_change_db
3、Com_select
第二和第三比較好解釋,Com_Change_DB相當於我們的Init DB, COM_Select就是我們的SELECT查詢。而第一個Com_admin_commands就比較奇怪了。經查代碼,這是下麵的幾計數器的集合。其他的一般都用不到,能用到的就剩下COM_PING了。
COM_CHANGE_USER
COM_SHUTDOWN
COM_PING
COM_DEBUG
COM_BINLOG_DUMP_GTID
COM_BINLOG_DUMP
所以問題就比較清楚了。
【結論】
Queries_per_sec 比我們預期的QPS高三倍,是由於驅動程式對連接有Ping的一個檢驗動作。這個動作應該也算作Queries。在Questions里體現不出來。