Redis info
Redis 提供了一个非常有用的查看状态信息的命令:info。它以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。使用方法有如下三种:
info
:部分Redis系统状态统计信息。info all
:全部Redis系统状态统计信息。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 的内存主要包括:对象内存 + 缓冲内存 + 自身内存 + 内存碎片。
对象内存
对象内存是 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 回收内存大致有两种机制:
- 删除达到过期时间的对象
- 当内存达到 maxmemory 时触发内存溢出控制策略,强制删除选择出来的对象
Redis 删除过期键值对对象一般有两种策略:惰性删除和主动定时任务删除。
惰性删除:这种删除策略,Redis 不会主动去删除已经过期的键值对,而是等待客户端去读取带有超时属性的键时,如果已经超时了则删除该键值对对象,然后返回空。这样有一个好处就是节省了 CPU ,因为 Redis 不需要单独去维护 TTL 链表来处理过期键的删除,但是有一个坏处就是如果过期的键一直都没有被访问,则永远不会被删除了。那么怎么解决呢?Redis 提供了一个定时任务的删除机制来补救。
定时任务删除:Redis 内部维护一个定时任务,默认是每秒运行 10 次,删除逻辑如下图:
内存溢出控制策略
当 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 数据库的基本信息 |