Redis info
Redis 提供了一个非常有用的查看状态信息的命令:info。它以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。使用方法有如下三种:

  1. info:部分Redis系统状态统计信息。
  2. info all:全部Redis系统状态统计信息。
  3. info section:某一块的系统状态统计信息,其中section可以忽略大小写。

详细内容如下表格:

参数名 说明
server 获取 server 信息
clients 获取 clients 信息,如客户端连接数等
memory 获取 server 的内存信息,包括当前内存消耗、内存使用峰值
persistence 获取 server 的持久化配置信息
stats 获取 server 的一些基本统计信息,如处理过的连接数量等
replication 获取 server 的主从配置信息
cpu 获取 server 的 CPU 使用信息
keyspace 获取 server 中各个 DB 的 key 的数量
cluster 获取集群节点信息,仅在开启集群后可见
commandstas 获取每种命令的统计信息

其中 memory,stats,clients,keyspace 是 Redis 运行时经常要关注的信息。

1、server

获取 server 信息,包括 version, OS, port 等信息

属性名 属性值 说明
redis_version 5.0.3 Redis 服务版本号
redisgitsha1 00000000 Git SGA1
redisgitdirty 0 Git dirty flag
redisbuildid 89e87c8197752890 Redis build ID
redis_mode standalone 运行模式,分为:standalone、sentinel、cluster
os Darwin 18.2.0 x86_64 Redis 所在机器的操作系统
arch_bits 64 架构(32位或者64位)
multiplexing_api kqueue Redis 所使用的事件处理机制
atomicvar_api atomic-builtin Atomicvar API
gcc_version 4.2.1 编译 Redis 时所使用的 GCC 版本
process_id 40163 服务进程 ID
run_id c4f8bb49f8214f406725136e6f589b46502a0e00 run_id
tcp_port 6379 监听端口
uptimeinseconds 496059 自 Redis 服务器启动已来,运行的秒数
uptimeindays 5 自 Redis 服务启动已来,运行的天数
hz 10 serverCron 每秒运行次数
configured_hz 10
lru_clock 5452491 以分钟为单位进行自增的时钟,用于 LRU 管理
executable /../redis-5.0.3/src/./redis-server 运行文件
config_file /../redis-5.0.3/redis.conf 配置文件

2、clients

获取 clients 信息,如客户端连接数等

属性名 属性值 说明
connected_clients 1 当前客户端连接数
clientrecentmaxinputbuffer 2 当前连接的客户端当中,最大输入缓存
clientrecentmaxoutputbuffer 0 当前连接的客户端当中,最长的输出列表
blocked_clients 0 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量

3、memory

获取 server 的内存信息,包括当前内存消耗、内存使用峰值

属性名 属性值 说明
used_memory 18813680 由 redis 分配器(标准libc,jemalloc或其他分配器,例如tcmalloc)分配的内存总量,以字节(byte)为单位
usedmemoryhuman 17.94M redis 分配的内存总量
usedmemoryrss 1945600 从操作系统的角度,Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top、ps 等命令的输出一致。
usedmemoryrss_human 1.86M 操作系统角度,返回 redis 分配的内存总量
usedmemorypeak 18900752 redis 的内存消耗峰值(以字节为单位)
usedmemorypeak_human 18.03M Redis 的内存消耗峰值
usedmemorypeak_perc 99.54% usedmemorypeak在used_memory中所占的百分比
usedmemoryoverhead 11135798 分配用于管理其内部数据结构的所有开销的总字节数
usedmemorystartup 988448 启动时消耗的初始内存量(以字节为单位)
usedmemorydataset 7677882 数据集的大小(以字节为单位,usedmemory - usedmemory_overhead)
usedmemorydataset_perc 43.07% usedmemorydataset在净内存(usedmemory-usedmemory_startup)使用量中所占的百分比
allocator_allocated 18780336 分配器分配的内存
allocator_active 1907712 分配器活跃的内存
allocator_resident 1907712 分配器常驻的内存
totalsystemmemory 34359738368 主机拥有的内存总量
totalsystemmemory_human 32.00G 主机拥有的内存总量
usedmemorylua 37888 Lua引擎使用的字节数
usedmemorylua_human 37.00K 以可读的格式返回Lua引擎使用内存
usedmemoryscripts 0
usedmemoryscripts_human 0B
numberofcached_scripts 0
maxmemory 0 配置设置的最大可使用内存值,默认0,不限制
maxmemory_human 0B 以可读的格式返回最大可使用内存值
maxmemory_policy noeviction 内存容量超过maxmemory后的处理策略,noeviction当内存使用达到阈值的时候,所有引起申请内存的命令会报错
allocatorfragratio 0.10 分配器的碎片率
allocatorfragbytes 18446744073692678992 分配器的碎片大小(以字节为单位)
allocatorrssratio 1.00 分配器常驻内存比例
allocatorrssbytes 0 分配器的常驻内存大小(以字节为单位)
rssoverheadratio 1.02 常驻内存开销比例
rssoverheadbytes 37888 常驻内存开销大小(以字节为单位)
memfragmentationratio 0.10 内存碎片率,usedmemoryrss 和 used_memory 之间的比率
memfragmentationbytes -16834736 内存碎片的大小(以字节为单位)
memnotcountedforevict 112 被驱逐的大小
memreplicationbacklog 0 repl_backlog
memclientsslaves 0 clients_slaves
memclientsnormal 49694 clients_normal
memaofbuffer 112 aof时,占用的缓冲
mem_allocator libc 内存分配器(在编译时选择)
activedefragrunning 0 碎片整理是否处于活动状态
lazyfreependingobjects 0 等待释放的对象数(由于使用ASYNC选项调用UNLINK或FLUSHDB和FLUSHALL)

mem_fragmentation_ratio>1 说明多出来的部分名没有用于数据存储,而是被内存碎片所消耗,相差越大,说明内存碎片率越严重。mem_fragmentation_ratio<1 一般出现在Redis内存交换(Swap)到硬盘导致( used_memory>可用最大内存时,Redis会把旧的和不适用的数据写入到硬盘,这块空间就叫Swap空间),出现这种情况需要格外关注,硬盘速度远远慢于内存,Redis性能就会变得很差,甚至僵死。在理想情况下 mem_fragmentation_ratio 只会比 1 稍微大一点点,也就是 usedmemoryrss 的值应该只比 used_memory 稍微高一些。

A.内存消耗划分

Redis 的内存主要包括:对象内存 + 缓冲内存 + 自身内存 + 内存碎片。
image.png

对象内存

对象内存是 Redis 内存中占用最大的一块,存储着所有的用户数据。Redis 是一个 key-value 的内存数据库,所有的数据都采用 key-value 型数据类型,每次在创建 key-value 键值对对象的时候都要创建两个对象:key 对象和value 对象。其中 key 对象是字符串,value 对象有五中数据类型-String、Hash、List、Set、Zset,每种数据类型在使用的时候占用的内存不同。

缓冲内存

主要包括:客户端缓冲、AOF 缓冲区、复制积压缓冲区。

  • 客户端缓冲:普通的客户端连接
  • AOF 缓冲区:Redis 持久化分为两种:RDB 和 AOF,其中 RDB 是内存快照,AOF 是将 Redis 的命令 append 在文件中,不过在写入文件之前会先写入到缓冲区,然后根据不同的持久化策略向磁盘进行同步。在进行 AOF 重写时也有一个AOF 重写缓冲区。一般 AOF 缓冲区都会比较小。
  • 复制积压缓冲区:主要用于主从同步。在进行主从同步时,Redis 会将最新的命令写入到复制积压缓冲区,在进行复制的时候,会校验复制偏移量是否在复制积压缓冲区中,如果是则进行部分复制,否则进行全量复制。它默认情况下是 1MB,需要根据实际请求适当调整他的大小,毕竟设置太小的话,可能会使部分复制退化为全量复制。

自身内存
自身内存主要指 AOF/RDB 的时候 Redis 创建子进程内存的消耗,一般这部分的消耗会比较小。
内存碎片
目前可选的分配器有 jemalloc、glibc、tcmalloc,默认 jemalloc。
出现高内存碎片问题的情况:大量的更新操作,比如 append、setrange;大量的过期键删除,释放的空间无法得到有效利用。
解决办法:数据对齐,安全重启(高可用/主从切换)。

B.内存管理

设置 maxmemory

如果不设置 maxmemory ,Redis 则默认使用无限内存,所以为了 Redis 不系统的内存耗尽,在使用 Redis 的时候尽量去配置 maxmemory,给 Redis 设置内存使用上限。maxmemory 配置的是 Redis 的实际使用内存,即 usedmemory,但是由于有内存碎片的存在,所以 Redis 实际使用的内存会比 usedmemory 要大,在合理情况下一般只会大一点点。

配置内存回收策略

Redis 回收内存大致有两种机制:

  1. 删除达到过期时间的对象
  2. 当内存达到 maxmemory 时触发内存溢出控制策略,强制删除选择出来的对象

Redis 删除过期键值对对象一般有两种策略:惰性删除和主动定时任务删除。
惰性删除:这种删除策略,Redis 不会主动去删除已经过期的键值对,而是等待客户端去读取带有超时属性的键时,如果已经超时了则删除该键值对对象,然后返回空。这样有一个好处就是节省了 CPU ,因为 Redis 不需要单独去维护 TTL 链表来处理过期键的删除,但是有一个坏处就是如果过期的键一直都没有被访问,则永远不会被删除了。那么怎么解决呢?Redis 提供了一个定时任务的删除机制来补救。
定时任务删除:Redis 内部维护一个定时任务,默认是每秒运行 10 次,删除逻辑如下图:
image.png
内存溢出控制策略
当 Redis 所用内存达到 maxmemory 上限时会触发相应的溢出控制策略。Redis支持6种策略,如下所示:

策略 说明
noeviction 默认策略,不会删除任何数据,拒绝所有写入操作并返 回客户端错误信息(error)OOM command not allowed when used memory,此 时Redis只响应读操作。
volatile-lru 根据LRU算法删除设置了超时属性(expire)的键,直 到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
allkeys-lru 根据LRU算法删除键,不管数据有没有设置超时属性, 直到腾出足够空间为止。
allkeys-random 随机删除所有键,直到腾出足够空间为止。
volatile-random 随机删除过期键,直到腾出足够空间为止。
volatile-ttl 根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。

内存溢出控制策略可以使用 configsetmaxmemory-policy{policy} 语句进行动态配置。
当 Redis 因为内存溢出删除键时,可以通过执行 info stats 命令查看 evicted_keys 指标找出当前 Redis 服务器已剔除的键数量。

4、Persistence

获取 server 的持久化配置信息

属性名 属性值 说明
loading 0 记录服务器是否正在载入持久化文件
rdbchangessincelastsave 0 最近一次成功创建持久化文件之后,经过了多少秒
rdbbgsavein_progress 0 记录了服务器是否正在创建 RDB 文件
rdblastsave_time 1582508875 最近一次成功创建 RDB 文件的 UNIX 时间戳
rdblastbgsave_status ok 记录最近一次创建 RDB 文件的状态,是成功还是失败
rdblastbgsavetimesec 1 记录了最近一次创建 RDB 文件耗费的秒数
rdbcurrentbgsavetimesec -1 如果正在创建 RDB 文件,记录当前的创建操作已经耗费的秒数
rdblastcow_size 0 上一次RBD保存操作期间写时复制的大小(以字节为单位)
aof_enabled 1 AOF是否开启
aofrewritein_progress 0 记录了是否正在创建 AOF 文件
aofrewritescheduled 0 记录了 RDB 文件创建完毕之后,是否需要执行 AOF 重写操作
aoflastrewritetimesec -1 最近一次创建 AOF 文件耗费的秒数
aofcurrentrewritetimesec -1 如果正在创建 AOF 文件,那么记录当前的创建操作耗费的秒数
aoflastbgrewrite_status ok 记录了最近一次创建 AOF 文件的状态,是成功还是失败
aoflastwrite_status ok AOF的最后写入操作的状态,是成功还是失败
aoflastcow_size 0 上一次AOF保存操作期间写时复制的大小(以字节为单位)
aofcurrentsize 4747340 AOF 文件当前的大小
aofbasesize 4746996 最近一次启动或重写时的AOF文件大小
aofpendingrewrite 0 记录了是否有 AOF 重写操作在等待 RDB 文件创建完毕之后执行
aofbufferlength 0 AOF缓冲区的大小
aofrewritebuffer_length 0 AOF 重写缓冲区的大小
aofpendingbio_fsync 0 后台 I/O 队列里面,等待执行的 fsync 数量
aofdelayedfsync 0 被延迟的 fsync 调用数量,如果该值比较大,可以开启参数:no-appendfsync-on-rewrite=yes

5、stats

获取 server 的一些基本统计信息,如处理过的连接数量等

属性名 属性值 说明
totalconnectionsreceived 11 服务器接受的连接总数
totalcommandsprocessed 48 服务器已执行的命令数量
instantaneousopsper_sec 0 服务器每秒钟执行的命令数量
totalnetinput_bytes 1312 启动以来,流入的字节总数
totalnetoutput_bytes 114800 启动以来,流出的字节总数
instantaneousinputkbps 0.00 接收输入的速率(每秒)
instantaneousoutputkbps 0.00 输出的速率(每秒)
rejected_connections 0 由于maxclients限制而被拒绝的连接数
sync_full 0 与slave full sync的次数
syncpartialok 0 接受的部分重新同步(psync)请求的数量
syncpartialerr 0 被拒绝的部分重新同步(psync)请求的数量
expired_keys 0 key过期事件总数
expiredstaleperc 0.00 过期的比率
expiredtimecapreachedcount 0 过期计数
evicted_keys 0 由于最大内存限制而被驱逐的key数量
keyspace_hits 6 key命中次数
keyspace_misses 0 key未命中次数
pubsub_channels 0 发布/订阅频道的数量
pubsub_patterns 0 发布/订阅的模式数量
latestforkusec 803 最近一次 fork() 操作耗费的毫秒数(以微秒为单位)
migratecachedsockets 0 为迁移而打开的套接字数
slaveexpirestracked_keys 0 跟踪过期key数量(仅适用于可写从)
activedefraghits 0 活跃碎片执行的值重新分配的数量
activedefragmisses 0 活跃碎片执行的中止值重新分配的数量
activedefragkey_hits 0 活跃碎片整理的key数
activedefragkey_misses 0 活跃碎片整理过程跳过的key数

6、replication

获取 server 的主从配置信息

属性名 属性值 说明
role master 角色(master、slave),一个从服务器也可能是另一个服务器的主服务器
connected_slaves 1 连接slave实例的个数
slave0 ip=127.0.0.1,port=6380,state=online,offset=14,lag=1 连接的slave的信息
master_replid 899b9814f2e841ca194dcc2620c83aa5df0abc10 服务器的复制ID
master_replid2 0000000000000000000000000000000000000000 第二服务器复制ID,用于故障转移后的PSYNC,用于集群等高可用之后主从节点的互换
masterreploffset 14 复制偏移量1
secondreploffset -1 第二服务器复制偏移量2
replbacklogactive 1 复制缓冲区状态
replbacklogsize 1048576 复制缓冲区的大小(以字节为单位)
replbacklogfirstbyteoffset 1 复制缓冲区的偏移量,标识当前缓冲区可用范围
replbackloghistlen 14 复制缓冲区中数据的大小(以字节为单位)

如果是从节点会有如下信息:

属性名 属性值 说明
master_host 127.0.0.1 Master IP
master_port 6379 Master Port
masterlinkstatus up Master的连接状态(up/down)
masterlastiosecondsago 2 最近一次主从交互之后的秒数
mastersyncin_progress 0 表示从服务器是否一直在与主服务器进行同步
slavereploffset 14 复制偏移量
slave_priority 100 从服务器的优先级
slavereadonly 1 从服务是否只读

7、CPU

获取 server 的 CPU 使用信息

属性名 属性值 说明
usedcpusys 2.559564 消耗的系统CPU
usedcpuuser 0.878593 消耗的用户CPU
usedcpusys_children 0.001414 后台进程占用的系统CPU
usedcpuuser_children 0.000510 后台进程占用的用户CPU

8、keyspace

获取 server 中各个 DB 的 key 的数量

属性名 属性值 说明
db0 keys=4,expires=0,avg_ttl=0 db0 数据库的基本信息