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

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

在server.c文件里邊有個(gè)最核心的入口函數(shù) Call(){ server.stat_numcommands++;} 這里會(huì)累加每次執(zhí)行的命令數(shù),而這個(gè)值正好就是我們調(diào)用INFO STATS 命令輸出項(xiàng) :total_commands_processed 的值,而另外一個(gè) instantaneous_ops_per_sec 是通過(guò)計(jì)算的來(lái)的,通過(guò)捌捌源代碼我們可以知道如下信息:我們Redis-Server會(huì)每100ms執(zhí)行一次采樣統(tǒng)計(jì),這個(gè)統(tǒng)計(jì)結(jié)果放入一個(gè)數(shù)組存放,當(dāng)我們調(diào)用 INFO 命令時(shí),其內(nèi)部會(huì)調(diào)用函數(shù):getInstantaneousMetric(STATS_METRIC_COMMAND),而這個(gè)函數(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; j++)
       sum += server.inst_metric[metric].samples[j];
   return sum / STATS_METRIC_SAMPLES;
}

而這個(gè)函數(shù)里邊就是計(jì)算這個(gè) ops 的方法,通過(guò)以上代碼可知,instantaneous_ops_per_sec 實(shí)際上就是我們過(guò)去16個(gè) 100ms 周期內(nèi)的平均QPS值。

通過(guò)以上分析,我們可以通過(guò) instantaneous_ops_per_sec 來(lái)較為實(shí)時(shí)的獲取當(dāng)前的一個(gè)QPS情況,尤其是當(dāng)我們對(duì)Redis實(shí)例數(shù)據(jù)采集周期比較長(zhǎng)的時(shí)候,通過(guò)total_command_process 計(jì)算出來(lái)的有可能會(huì)被平均,而透過(guò)instantaneous_ops_per_sec 這個(gè)值得到的數(shù)據(jù)恰好反應(yīng)了最近2s的運(yùn)行情況。

http://www.cnblogs.com/svan/p/7029577.html