透过源码看看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

相关文章
相关标签/搜索