没有代码的解释不是解释,没有deadline的任务不是任务,没有流程图或分享的源码阅读不是源码阅读,没有报告的性能测试不是性能测试。 —— 漠冰 曰
这篇文章打算作为INFO命令的输出整理汇总,目前还未全部完成…
代码版本: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.1 源码位置
redis.c:2922:INFO命令中有关Memory模块的部分
2.2 Memory命令的输出(找一个内存碎片率比较大的实例)
$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值是一样的。
2.3 Redis4.0 新Memory命令
对内存信息控制更加精细,但是其中很多获取指标的方法还是原来的方法,后面有时间再分析。
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通常来说有三种状态:
shell
或者chrome浏览器
等用户态程序。通过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
时间都增长了: