Redis教程(七)info命令与服务状态分析

Tanglu NoSQL 2019-10-15 5906 0

一、Redis info命令介绍

Redis info命令是Redis客户端工具所支持的查看服务状态的工具,该命令包含了Redis的主要性能指标,对Redis性能问题进行排查与故障解决起到了很好的帮助作用。info命令支持全局信息输出和指定模块信息输出,指定模块的分类见下表最右列

redis_info.png


二、Redis info命令语法

redis > info  #查看所有模块信息
redis > info keyspace  #查看keyspace模块的信息



三、Redis info命令执行结果说明

# Server 服务端信息
redis_version:3.2.12                        #redis版本号
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:de5f1daa3afe8b6a
redis_mode:standalone
os:Linux 3.10.0-862.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:42421
run_id:3bfe4f5404c9259beee035f89bb57dc0f1708d5b
tcp_port:6379                              #redis监听端口
uptime_in_seconds:76959                    #redis服务运行了多少秒
uptime_in_days:0
hz:10
lru_clock:9055374
executable:/usr/local/redis/redis-server   #执行的启动脚本
config_file:/usr/local/redis/redis.conf    #配置文件路径

# Clients  客户端信息
connected_clients:1                        #有几个客户端连接
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0                          #因为BLPOP、BRPOP、BRPOPLPUSH命令被阻塞的客户端

# Memory  内存使用情况
used_memory:1947112
used_memory_human:1.86M                    #Redis为了保存数据实际申请使用的空间,不包含碎片占用的内存
used_memory_rss:2211840
used_memory_rss_human:2.11M                #操作系统实际分配给 Redis 的物理内存空间,里面就包含了碎片
used_memory_peak:1947112
used_memory_peak_human:1.86M
total_system_memory:1021906944
total_system_memory_human:974.57M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.14               #内存碎片化,如果碎片化的值达到了2,最好重启redis服务,计算方式是实际内存除以理论内存
mem_allocator:libc                         #redis使用的内存分配器,新版本中使用的是jemalloc,碎片化更少

# Persistence  持久化存储信息
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1535705992
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0  #0代表没有开启
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats  状态信息
total_connections_received:6               #redis从启动到现在接受到的连接总数
total_commands_processed:76141             #redis从启动到现在接受到的命令总数,当客户端响应过慢时可通过监控每秒命令执行数来判断服务是否响应延迟
instantaneous_ops_per_sec:1                #每秒执行命令数
total_net_input_bytes:2890573              #入站流量
total_net_output_bytes:113930              #出站流量
instantaneous_input_kbps:0.05
instantaneous_output_kbps:0.00
rejected_connections:0                     #由于达到maxclient的限制而被拒绝的客户端数
sync_full:1
sync_partial_ok:0
sync_partial_err:0
expired_keys:0                             #过期的key数量
evicted_keys:0                             #因为达到max_memory而被淘汰的key数量
keyspace_hits:0                            #缓存命中数
keyspace_misses:0                          #缓存未命中数,结合缓存命中数可以算出命中率
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:615
migrate_cached_sockets:0

# Replication 主从信息
role:master                                 #当前节点的角色,master是主,slave是从
connected_slaves:1                          #有几个从节点
slave0:ip=192.168.145.69,port=6379,state=online,offset=106797,lag=0  #从节点的信息
master_repl_offset:106797                   #主库接收写命令的进度信息,可以计算主从复制差值,配合监控进行告警,让业务代码不走延迟过多的从库
slave_repl_offset:105121                   #从库复制写命令的进度信息,可以计算主从复制差值,配合监控进行告警,让业务代码不走延迟过多的从库
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:106796

# CPU
used_cpu_sys:94.37
used_cpu_user:41.88
used_cpu_sys_children:0.01
used_cpu_user_children:0.00

# Cluster 集群信息
cluster_enabled:0                          #0代表没有开启集群

# Keyspace
db3:keys=2,expires=2,avg_ttl=99950282       #db3中有2个key,有2个key设置了过期时间,平均过期时间是99950282秒(0为不过期)


四、Redis info命令主要关注信息

1、memory模块:该模块输出了内存相关信息,可用于分析内存与碎片问题,比如Redis占用了多少内存、最大可用内存以及内存碎片率等信息

redis_info1.png

· used_memory_human:把Redis使用的内存总量进行了统计,包含了实际缓存占用的内存和Redis自身运行所占用的内存(如元数据、lua),但是不包含内存碎片

· used_memory_rss_human:这一项在上一项的基础上包含了内存碎片的统计。如果该值的统计数据大于了maxmemory所设置的值,说明Redis当前有使用swap虚拟内存,效率必然很低。为了避免Redis使用到swap交换内存,建议设置好Key的过期淘汰策略。如果key都有设置TTL过期时间,使用volatile-ttl回收策略最合适;如果没有设置过期时间,使用allkeys-lru比较合适,它会从所有key中挑选最近最少使用的key进行删除(LRU淘汰算法)。

· mem_fragmentation_ratio: 内存碎片率由use_memory_rss除以user_memory所得到,内存碎片率越高,说明未回收的内存越多,意味着浪费的内存空间也就越大。通常来说内存碎片率稍大于1是合理的,如果超过1.5表Redis消耗了实际需要物理内存的150%,有50%都是碎片。若是内存碎片率低于1的话,说明Redis能申请的内存已经达不到期望值,有可能是系统内存不够用了使用了SWAP分区。Redis 4之后可以使用动态碎片整理,而之前的版本中如果要清理碎片只能进行重启操作,这样会导致数据丢失(通过RDB进行数据恢复的话也有额外的时间成本)。除了上面提到的方法,修改redis内存分配器也能带来一定的优化效果。Redis支持glibc、jemalloc、tcmalloc几种不同的内存分配器,每个分配器在内存分配和碎片上都有不同的实现。通常使用redis默认的jemalloc内存分配器即可。

· mem_allocator:Redis使用的内存分配器,可以是libc、jemalloc、tcmalloc。libc的性能最次。

· maxmemory_human:Redis最大可使用的内存限制。虽然used_memory_human的值会受到它的限制(比如配置了maxmemory_human为2G,used_memory_human会限制在2G内),但是因为碎片问题used_memory_rss_human会突破限制。带来的直接问题就是如果maxmemory_human配置的和系统最大内存接近容易发生OOM


2、stats模块:排查复杂度过高的命令带来的慢查询问题

· total_commands_processed参数对Redis服务处理命令的数量进行统计,这是排查延迟问题的关键值,因为Redis是在单线程模型下工作,会把接收到的客户端命令按顺序执行,如果执行命令过多或者存在很多慢命令就会让整个队列阻塞而导致延迟。由于total_commands_processed的值是递增的,所以要使用Zabbix做监控的话需要统计的是每秒的差值,这样才能知道每秒处理总数是上升还是下降,以便排查。


评论