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
時間都增長了: