透過源碼看看Redis中如何計算QPS

一般咱們採集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值。spa

經過以上分析,咱們能夠經過 instantaneous_ops_per_sec 來較爲實時的獲取當前的一個QPS狀況,尤爲是當咱們對Redis實例數據採集週期比較長的時候,經過total_command_process 計算出來的有可能會被平均,而透過instantaneous_ops_per_sec 這個值獲得的數據剛好反應了最近2s的運行狀況。code

相關文章
相關標籤/搜索