Redis INFO 命令详解

Posted 杨博东的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.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时间都增长了:

以上是关于Redis INFO 命令详解的主要内容,如果未能解决你的问题,请参考以下文章

死磕 Redis----- info 命令详解

死磕 Redis----- info 命令详解

Redis INFO 命令详解

redis info 参数详解

Redis info 参数详解

Redis info详解