1. 程式人生 > >Redis INFO 命令詳解

Redis INFO 命令詳解

沒有程式碼的解釋不是解釋,沒有deadline的任務不是任務,沒有流程圖或分享的原始碼閱讀不是原始碼閱讀,沒有報告的效能測試不是效能測試。 —— 漠冰

這篇文章打算作為INFO命令的輸出整理彙總,目前還未全部完成…

1. 環境

程式碼版本:redis-4.0.6
工具:本地用CLion開啟,增加CMakeLists.txt就可以除錯了。

cmake_minimum_required(VERSION 3.6)
project(redis-4.0.6)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g"
) add_custom_target(redis COMMAND make CFLAGS="-g" -C ${redis-4.0.6_SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR})

2. Memory模組

2.1 原始碼位置
redis.c:2922:INFO命令中有關Memory模組的部分

2.2 Memory命令的輸出(找一個記憶體碎片率比較大的例項)

這裡寫圖片描述

  • used_memory:表示Redis從啟動開始到現在malloc的記憶體數量,由zmalloc.c中定義一個靜態全域性變數used_memory表示,每次記憶體分配或者回收的時候都會
    更新
    它的值。
  • used_memory_rss:表示Redis程序駐留記憶體中的物理頁面數量 * 頁面大小,其中物理頁面數量通過/proc/pid/stat獲取,程式碼見這裡,以上面截圖為例,ps命令找到pid,去/proc/pid/下看這個Redis程序的情況。
$cat stat
109821 (rredis) S 1 109821 109821 0 -1 4202560 1495102 0 0 0 6481 13490 0 0 20 0 6 0 2063841897 245932032 1037 18446744073709551615 1 1 0 0 0 0 0 16781313 17610 18446744073709551615 0 0 17 2 0
0 0 0 0

輸出結果中第24欄位是rss的值,具體參考man 5 /proc,它的值為:1037,這也就是Redis程序駐留記憶體的物理頁面數量, 計算下Redis程序的記憶體大小:1037頁*4K=1037*4*1024位元組=4247552位元組,可以看到和used_memory_rss值是一樣的。

  • used_memory_peak:表示Redis在執行過程中使用記憶體的最大值,它的值由serverCron()函式定期更新,每次判斷used_memory當前值是否大於used_memory_peak,如果大於就將它的值更新為used_memory值,程式碼見這裡
  • total_system_memory:表示系統總記憶體大小,獲取方式見這裡
  • used_memory_lua:表示執行lua佔用的記憶體,通過lua_gc()獲取,程式碼見這裡
  • maxmemory:使用者指定的Redis最大記憶體消耗數量,超過這個值會按照既定的淘汰策略淘汰Key。
  • mem_fragmentation_ratio:記憶體碎片率,它的值為 used_memory_rss/used_memory,計算方法見這裡。如果此值接近1表示伺服器記憶體碎片很少,大於1.5表示記憶體碎片率較大,舉個例子解釋:如果Redis程序malloc了1024K記憶體,作業系統如果為它分配了256個物理頁(頁面大小為4K),剛好為1024K,那說明記憶體分配非常緊湊,可是如果超過256太多,甚至達到了500,在計算RSS的時候,500*4K = 2000K,此時的mem_fragmentation_ratio = 2000/1024=2左右,說明記憶體碎片率較高。

2.3 Redis4.0 新Memory命令
對記憶體資訊控制更加精細,但是其中很多獲取指標的方法還是原來的方法,後面有時間再分析。

3. CPU模組

3.2 含義解釋
通過INFO CPU命令可以檢視Redis程序對於CPU的使用情況,如下:

這裡寫圖片描述

這幾個欄位的含義如下所示:

used_cpu_sys: System CPU consumed by the Redis server 
used_cpu_user:User CPU consumed by the Redis server
used_cpu_sys_children: System CPU consumed by the background processes
used_cpu_user_children: User CPU consumed by the background processes

3.3 什麼是System CPU?什麼是User CPU
CPU通常來說有三種狀態:

  • Idle, 空閒,什麼也不做.
  • Running a user space program,執行在使用者態,例如shell或者chrome瀏覽器等使用者態程式。
  • Running the kernel, 執行在核心態,管理中斷或者資源,執行系統呼叫,例如使用者態程式malloc記憶體,fork子程序等.

通過top命令可以檢視到CPU的資訊:

%Cpu(s): 24.8 us,  0.5 sy,  0.0 ni, 73.6 id,  0.4 wa,  0.0 hi,  0.2 si,  0.0 st

3.4 Redis INFO CPU 資訊來源
實際上是通過呼叫 getrusage 這個系統呼叫完成的。

NAME
     getrusage -- get information about resource utilization
     int getrusage(int who, struct rusage *r_usage);
DESCRIPTION
     getrusage() returns information describing the resources utilized by the current process, or all its terminated child processes.

可以統計一個程序佔用的CPU資訊,第二個引數是統計資訊的結構體,將資訊儲存至結構體返回。

因此INFO CPU命令輸出的資訊表示的是:從Redis啟動到此刻,CPU所分別花費在系統和使用者態的時間累積,因此只要Redis程序不退出,這個數值是不斷變大的,原始碼見這裡

繼續給文章開頭啟動的Redis插入1G的資料,可以看見使用CPU時間都增長了:

這裡寫圖片描述