透過原始碼看看Redis中如何計算QPS

fengjian1585發表於2024-07-01

通常我們採集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的執行情況。

摘自:

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

相關文章