通常我們採集Redis的性能數據時,或者想要知道Redis當前的性能如何時,需要知道這個實例的QPS數據,那麼這個QPS數據是如何計算的呢?我們都有哪些辦法或者這個QPS ? QPS顧名思義就是每秒執行的指令數,猜想Redis裡邊肯定是有個計數器來對每次執行的命令進行一次累計操作,通過這個思路不難想 ...
通常我們採集Redis的性能數據時,或者想要知道Redis當前的性能如何時,需要知道這個實例的QPS數據,那麼這個QPS數據是如何計算的呢?我們都有哪些辦法或者這個QPS ?
QPS顧名思義就是每秒執行的指令數,猜想Redis裡邊肯定是有個計數器來對每次執行的命令進行一次累計操作,通過這個思路不難想到INFO stats 輸出中有個 輸出項:total_commands_processed ,相信大部分情況下我們都是通過兩次獲取這個值,然後取一個差值求平均得到的。那麼除了這種辦法外,還有其他辦法麽?我們註意到 info stats 輸出中還有一個叫:instantaneous_ops_per_sec 看起來像是和QPS一樣的東西,不過它具體是什麼,我們從源碼上一看便知。
在server.c文件裡邊有個最核心的入口函數 Call(){ server.stat_numcommands++;}
這裡會累加每次執行的命令數,而這個值正好就是我們調用INFO STATS 命令輸出項 :total_commands_processed 的值,而另外一個 instantaneous_ops_per_sec 是通過計算的來的,通過捌捌源代碼我們可以知道如下信息:我們Redis-Server會每100ms執行一次採樣統計,這個統計結果放入一個數組存放,當我們調用 INFO 命令時,其內部會調用函數:getInstantaneousMetric(STATS_METRIC_COMMAND)
,而這個函數體如下所示:
#define STATS_METRIC_SAMPLES 16 /* Number of samples per metric. */
#define STATS_METRIC_COMMAND 0 /* Number of commands executed. */
/* Return the mean of all the samples. */
long long getInstantaneousMetric(int metric) {
int j;
long long sum = 0;
for (j = 0; j < STATS_METRIC_SAMPLES; j++)
sum += server.inst_metric[metric].samples[j];
return sum / STATS_METRIC_SAMPLES;
}
而這個函數裡邊就是計算這個 ops 的方法,通過以上代碼可知,instantaneous_ops_per_sec 實際上就是我們過去16個 100ms 周期內的平均QPS值。
通過以上分析,我們可以通過 instantaneous_ops_per_sec 來較為實時的獲取當前的一個QPS情況,尤其是當我們對Redis實例數據採集周期比較長的時候,通過total_command_process 計算出來的有可能會被平均,而透過instantaneous_ops_per_sec 這個值得到的數據恰好反應了最近2s的運行情況。