通常我們采集Redis的性能數(shù)據(jù)時,或者想要知道Redis當前的性能如何時,需要知道這個實例的QPS數(shù)據(jù),那么這個QPS數(shù)據(jù)是如何計算的呢?我們都有哪些辦法或者這個QPS ?

QPS顧名思義就是每秒執(zhí)行的指令數(shù),猜想Redis里邊肯定是有個計數(shù)器來對每次執(zhí)行的命令進行一次累計操作,通過這個思路不難想到INFO stats 輸出中有個 輸出項:total_commands_processed ,相信大部分情況下我們都是通過兩次獲取這個值,然后取一個差值求平均得到的。那么除了這種辦法外,還有其他辦法么?我們注意到 info stats 輸出中還有一個叫:instantaneous_ops_per_sec 看起來像是和QPS一樣的東西,不過它具體是什么,我們從源碼上一看便知。

在server.c文件里邊有個最核心的入口函數(shù) Call(){ server.stat_numcommands++;} 這里會累加每次執(zhí)行的命令數(shù),而這個值正好就是我們調(diào)用INFO STATS 命令輸出項 :total_commands_processed 的值,而另外一個 instantaneous_ops_per_sec 是通過計算的來的,通過捌捌源代碼我們可以知道如下信息:我們Redis-Server會每100ms執(zhí)行一次采樣統(tǒng)計,這個統(tǒng)計結(jié)果放入一個數(shù)組存放,當我們調(diào)用 INFO 命令時,其內(nèi)部會調(diào)用函數(shù):getInstantaneousMetric(STATS_METRIC_COMMAND),而這個函數(shù)體如下所示:

#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