您现在的位置是:首页 > 正文

Redis INFO 命令详解

2024-02-01 04:53:18阅读 2

没有代码的解释不是解释,没有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时间都增长了:

这里写图片描述

网站文章

  • win7计算机窗口左边被改了,win7电脑开始菜单变成经典模式?三种方法教你改回来...

    win7计算机窗口左边被改了,win7电脑开始菜单变成经典模式?三种方法教你改回来...

    今天小编一开电脑,觉得怪怪的,怎么感觉电脑桌面不太一样了?仔细一看,原来是系统开始菜单变成经典模式了,很不习惯,那怎么恢复呢?今天小编就以win7系统为例,教大家怎么改回来。方法一1.在桌面空白处单击...

    2024-02-01 04:52:51
  • Thinkphp5.1实现or查询

    1. where和whereor并用(闭包方式) 查询id = 1,并且user1 = ‘a’ or user2 = ‘a’ Model::where([ ['id', '=&...

    2024-02-01 04:52:45
  • javascript 闭包最简单理解

    javascript 闭包最简单理解 首先说3点与闭包有关系的东西。一、变量的作用域变量的作用域不难理解。1.函数内部可以访问函数外部的变量,而函数外部不能访问函数内部的变量。2.如果在函数内定义变量的时候,不加var,那么是全局变量(当然函数要...

    2024-02-01 04:52:37
  • jsoup 简介、中文文档、中英对照文档 下载

    jsoup 简介、中文文档、中英对照文档 下载

    jsoup 简介、中文文档、中英对照文档 下载;jsoup、org.jsoup、中文文档、中英对照文档、下载、包含jar包、原API文档、源代码、Maven依赖信息文件、翻译后的API文档、jsoup...

    2024-02-01 04:52:09
  • Java html转word,用freemark生成复杂word格式

    Java html转word,用freemark生成复杂word格式

    Java 生成word,可以将html 较好的转为word。

    2024-02-01 04:52:03
  • docker创建容器并且挂载相应目录

    【代码】docker创建容器并且挂载相应目录。

    2024-02-01 04:51:56
  • 视频直播推流攻略(整理的各大平台推流界面) 热门推荐

    视频直播推流攻略(整理的各大平台推流界面) 热门推荐

    如果我要做一场高端大气的直播活动,需要用高清摄像机拍摄画面,需要接入无人机的高空画面,需要在直播中插入多个镜头,甚至需要把电脑桌面共享到直播画面中...... 该如何将这类现场信号采集并整合起来传输到网络呢? 这个问题不仅牵扯了导播设备的功能性,也涉及了信号“推流”的问题,一般我们将这种前端采集阶段封包好的内容传输到服务器的过程叫做“推流”。 简言之,推流就是将视音频信号传...

    2024-02-01 04:51:49
  • logo自动旋转 html,HTML/CSS3 Logo选择器

    CSS语言:CSSSCSS确定@import "https://fonts.googleapis.com/css?family=Product+Sans";@import "https://fonts...

    2024-02-01 04:51:19
  • Zookeeper

    Zookeeper

    Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知...

    2024-02-01 04:51:14
  • 权限、内部类、Scanner、Random、ArrayList随即名单和final

    权限、内部类、Scanner、Random、ArrayList随即名单和final

    private:类内部可见。default:类内部、包内部可见;无论是方法,还是属性,不写修饰符,就是这个权限。protected:类内部、包内部、子类可见。public:类内部、包内部、子类内部、外...

    2024-02-01 04:51:08