没有代码的解释不是解释,没有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.1 源码位置
server.c#L3274:info 的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
关注的主要信息就是这三种us 用户态
,sy 内核态
,id 空闲
,这三个值加起来接近100.
其他字段信息解释见:http://blog.scoutapp.com/articles/2015/02/24/understanding-linuxs-cpu-stats
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
时间都增长了: