Redis - Info指令
在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状态,通过强大的 Info 指令,可以清晰地知道 Redis 内部一系列运行参数。
Info 指令显示的信息非常繁多,
- Server: 服务器运行的环境参数
- Clients: 客户端相关信息
- Memory: 服务器运行内存统计数据
- Persistence: 持久化信息
- State: 通用数据统计
- Replication: 主从复制相关信息
- CPU: CPU使用情况
- commandstats: Redis 命令统计
- modules: 模块部分
- Cluster: 集群相关
- KeySpace: 键值dui统计数量信息
- errorstats: Redis 错误统计
Info 可以一次性获取所有的信息,也可以按块取信息。
获取所有参数
Redis 版本:6.2.3 操作系统:MACOS
127.0.0.1:6379> info
# Server
redis_version:6.2.6 # 版本
redis_git_sha1:00000000 # Git SHA1
redis_git_dirty:0 # Git 脏标志
redis_build_id:c6f3693d1aced7d9 # 构建 ID
redis_mode:standalone #服务器模式(“独立”、“哨兵”或“集群”)
os:Darwin 20.4.0 arm64 # 操作系统
arch_bits:64 # 64位
multiplexing_api:kqueue # Redis使用的事件循环机制
atomicvar_api:c11-builtin #Redis 使用的 Atomicvar API
gcc_version:4.2.1 # GCC编译版本
process_id:1233 # 服务器进程PID
process_supervised:no # 受监督的系统
run_id:4d6d9f6b06516a846a77b3f2fd33aff11a2f5f63 # 标识Redis服务器随机值
tcp_port:6379 # 监听端口
server_time_usec:1637731129615807 # 系统时间
uptime_in_seconds:510815 # 服务器启动后的秒数
uptime_in_days:5 # 以天表示的相同值
hz:10 # 服务器的当前频率设置
configured_hz:10 # 服务器的配置频率设置
lru_clock:10341177 # 时钟每分钟递增一次,用于 LRU 管理
executable:/Users/redis-server # 服务器可执行文件的路径
config_file:/opt/homebrew/etc/redis.conf # 配置文件路径
io_threads_active:0 # IO 线程活动个数(注:只有6.0才有)
# Clients
connected_clients:1 # 客户端连接数
cluster_connections:0 # 集群总线使用的socket数量的近似值
maxclients:10000 # 最大客户端连接数
client_recent_max_input_buffer:32 # 客户端连接中最大的输入缓冲区
client_recent_max_output_buffer:0 # 客户端连接中最大的输出缓冲区
blocked_clients:0 # 等待阻塞调用的客户端数量
tracking_clients:0 # 被跟踪的客户数量
clients_in_timeout_table:0 # 客户端超时表中的客户端数量
# Memory
used_memory:1119760 # 使用内存
used_memory_human:1.07M # 可读表示
used_memory_rss:4177920 # 操作系统看到的Redis分配的字节数
used_memory_rss_human:3.98M #可读表示
used_memory_peak:1178256 # Redis 消耗的峰值内存
used_memory_peak_human:1.12M # 可读表示
used_memory_peak_perc:95.04% # 百分比used_memory_peak出来的used_memory
used_memory_overhead:1046296 # 服务器分配用于管理其内部数据结构的所有开销的总和
used_memory_startup:1028288 # 在启动时消耗的初始内存量
used_memory_dataset:73464 # 数据集的字节大小
used_memory_dataset_perc:80.31% # used_memory_dataset净内存使用百分比
allocator_allocated:1052160 # 从分配器分配的总字节数,包括内部碎片。通常与used_memory.
allocator_active:4140032 # 分配器活动页面中的总字节数,这包括外部碎片。
allocator_resident:4140032 # 分配器中的总字节数 (RSS),这包括可以释放到操作系统的页面
total_system_memory:17179869184 # Redis主机拥有的总内存量
total_system_memory_human:16.00G # 可读表示
used_memory_lua:37888 # Lua引擎使用的字节数
used_memory_lua_human:37.00K # 可读表示
used_memory_scripts:0 # 缓存的 Lua 脚本使用的字节数
used_memory_scripts_human:0B # 可读表示
number_of_cached_scripts:0 # 缓存的脚本数
maxmemory:0 # 最大内存配置
maxmemory_human:0B # 可读表示
maxmemory_policy:noeviction # 当达到maxmemory淘汰策略
allocator_frag_ratio:3.93 # 碎片指标
allocator_frag_bytes:3087872 # 分配器_与活动分配器_之间的增量
allocator_rss_ratio:1.00 #allocator_resident 和allocator_active之间的比率。这通常表示分配器可以并且可能很快将释放回操作系统的页面。 (used_memory_rss过程RSS)和allocator_resident.之间的比率。这包括与分配器或堆无关的 RSS 开销。
allocator_rss_bytes:0 # 分配器和分配器活动之间的增量
rss_overhead_ratio:1.01 # (used_memory_rss过程RSS)和allocator_resident.之间的比率。这包括与分配器或堆无关的 RSS 开销。
rss_overhead_bytes:37888 # used_memory_rss进程RSS)和之间的差值allocator_resident
mem_fragmentation_ratio:3.97 # used_memory_rss和used_memory之间的比率。请注意,这不仅包括碎片,还包括其他进程开销(参见allocator_*指标),以及代码、共享库、堆栈等开销。
mem_fragmentation_bytes:3125760 # sed_memory_rss和used_memory之间的差值。请注意,当总碎片字节数较低(几兆字节)时,较高的比率(例如 1.5 及以上)并不表示存在问题。
mem_not_counted_for_evict:0 # 不计入密钥驱逐的已用内存。这基本上是瞬态副本和 AOF 缓冲区。
mem_replication_backlog:0 # 复制积压使用的内存
mem_clients_slaves:0 # 副本客户端使用的内存 - 从 Redis 7.0 开始,副本缓冲区与复制积压共享内存,因此当副本不会触发内存使用量增加时,此字段可以显示为 0。
mem_clients_normal:17440 # 普通客户端使用的内存
mem_aof_buffer:0 # 用于 AOF 和 AOF 重写缓冲区的瞬态内存
mem_allocator:libc # 内存分配器,在编译时选择
active_defrag_running:0 # activedefrag启用时,这表示碎片整理当前是否处于活动状态,以及它打算使用的 CPU 百分比。
lazyfree_pending_objects:0 # 等待要被释放(作为调用的结果的对象数UNLINK,或FLUSHDB和FLUSHALL与ASYNC 选项)
lazyfreed_objects:0
# Persistence
loading:0 # 指示转储文件的加载是否正在进行的标志(持久化文件)
current_cow_size:0 # 运行子fork时,写时复制内存的峰值大小
current_cow_size_age:0 # 运行子fork时,写时复制内存的大小
current_fork_perc:0.00 # 当前fork进程的进度百分比。对于 AOF 和 RDB 分叉,它是current_save_keys_processedout of的百分比current_save_keys_total。
current_save_keys_processed:0 # 当前保存操作处理的键数
current_save_keys_total:0 # 前保存操作开始时的键数
rdb_changes_since_last_save:0 # 自上次转储以来的更改次数
rdb_bgsave_in_progress:0 # 指示 RDB 保存正在进行的标志
rdb_last_save_time:1637725802 # 上次成功 RDB 保存的基于纪元的时间戳
rdb_last_bgsave_status:ok # 上次 RDB 保存操作的状态
rdb_last_bgsave_time_sec:0 # 上次 RDB 保存操作的持续时间
rdb_current_bgsave_time_sec:-1 # 正在进行的 RDB 保存操作的持续时间
rdb_last_cow_size:0 # 上次 RDB 保存操作期间写时复制内存的大小
aof_enabled:0 # 表示 AOF 日志记录被激活的标志
aof_rewrite_in_progress:0 # 指示 AOF 重写操作正在进行的标志
aof_rewrite_scheduled:0 # 标志指示 AOF 重写操作将在正在进行的 RDB 保存完成后被安排。
aof_last_rewrite_time_sec:-1 # 上次 AOF 重写操作的持续时间
aof_current_rewrite_time_sec:-1 # 正在进行的 AOF 重写操作的持续时间
aof_last_bgrewrite_status:ok # 上次 AOF 重写操作的状态
aof_last_write_status:ok # AOF 上一次写操作的状态
aof_last_cow_size:0 # 上次 AOF 重写操作期间写时复制内存的大小
module_fork_in_progress:0 # 指示模块分叉正在进行的标志
module_fork_last_cow_size:0 # 上次模块 fork 操作期间写时复制内存的大小
# 开启aof后增加的一些info信息
-----------------------------
aof_current_size:0 # aof当前大小
aof_base_size:0 # aof上次启动或rewrite的大小
aof_pending_rewrite:0 # 同上面的aof_rewrite_scheduled
aof_buffer_length:0 # aof buffer的大小
aof_rewrite_buffer_length:0 # aof rewrite buffer的大小
aof_pending_bio_fsync:0 # 后台IO队列中等待fsync任务的个数
aof_delayed_fsync:0 # 延迟的fsync计数器
-----------------------------
# Stats
total_connections_received:13 # 服务器接受的连接总数
total_commands_processed:102 # 服务器处理的命令总数
instantaneous_ops_per_sec:0 # 每秒处理的命令数
total_net_input_bytes:3701 # 从网络读取的总字节数
total_net_output_bytes:91814 # 写入网络的总字节数
instantaneous_input_kbps:0.00 # 网络每秒的读取速率,以 KB/sec 为单位
instantaneous_output_kbps:0.00 # 网络每秒的写入速率,以 KB/sec 为单位
rejected_connections:0 # 由于maxclients限制而拒绝的连接数
sync_full:0 # 与副本完全重新同步的次数
sync_partial_ok:0 # 接受的部分重新同步请求的数量
sync_partial_err:0 # 被拒绝的部分重新同步请求的数量
expired_keys:0 # 密钥过期事件总数
expired_stale_perc:0.00 # 可能已过期的密钥百分比
expired_time_cap_reached_count:0 # 有效到期周期提前停止的次数
expire_cycle_cpu_milliseconds:7729 # 有效到期周期上花费的累积时间
evicted_keys:0 # 由于maxmemory限制被驱逐的密钥数量
keyspace_hits:38 # 主字典中键的成功查找次数
keyspace_misses:4 # 主字典中键的失败查找次数
pubsub_channels:0 # 具有客户端订阅的发布/订阅频道的全部数量
pubsub_patterns:0 # 具有客户端订阅的发布/订阅模式的全部数量
latest_fork_usec:2539 # 以微秒为单位的最新分叉操作的持续时间
total_forks:8 # 自服务器启动以来分叉操作的总数
migrate_cached_sockets:0 # 为MIGRATE目的打开的套接字数
slave_expires_tracked_keys:0 # 为到期目的跟踪的密钥数量
active_defrag_hits:0 # 激活碎片整理过程执行的值重新分配的数量
active_defrag_misses:0 # 由活动碎片整理过程启动的中止值重新分配的数量
active_defrag_key_hits:0 # 主动碎片整理的键数
active_defrag_key_misses: # 活动碎片整理过程跳过的键数
tracking_total_keys:0 # 服务器正在跟踪的键数
tracking_total_items:0 # 正在跟踪的项目数,即每个键的客户端数量的总和
tracking_total_prefixes:0 # 务器前缀表中跟踪的前缀数(仅适用于广播模式)
unexpected_error_replies:0 # 意外错误回复的数量,即来自 AOF 加载或复制的错误类型
total_error_replies:8 # 发出的错误回复总数,即被拒绝的命令
dump_payload_sanitizations:0 # dump
total_reads_processed:126 # 处理的读取事件总数
total_writes_processed:108 # 处理的写入事件总数
io_threaded_reads_processed:0 # 主线程和 I/O 线程处理的读事件数
io_threaded_writes_processed:0 # 主线程和 I/O 线程处理的写事件数
# Replication
role:master # 如果实例不是任何人的副本,则值为“master”,如果实例是某个主实例的副本,则值为“slave”
connected_slaves:0 # 连接的副本数
master_failover_state:no-failover # 正在进行的故障转移的状态
master_replid:72a0ae830966a96f14a4ab705ae9e00c4354e4d4 # Redis 服务器的复制 ID
master_replid2:0000000000000000000000000000000000000000 # 辅助复制 ID,用于故障转移后的 PSYNC
master_repl_offset:0 # 服务器当前的复制偏移量
second_repl_offset:-1 # 接受复制 ID 的偏移量
repl_backlog_active:0 # 表示复制积压处于活动状态的标志
repl_backlog_size:1048576 # 复制积压缓冲区的总大小
repl_backlog_first_byte_offset:0 # 复制积压缓冲区的主偏移量
repl_backlog_histlen:0 # 复制积压缓冲区中数据的大小
# CPU
used_cpu_sys:293.565962 # Redis服务器消耗的系统CPU,即服务器进程所有线程(主线程和后台线程)消耗的系统CPU之和
used_cpu_user:127.168482 # Redis服务器消耗的用户CPU,即服务器进程所有线程(主线程和后台线程)消耗的用户CPU之和
used_cpu_sys_children:0.040046 # 后台进程消耗的系统CPU
used_cpu_user_children:0.003554 # 后台进程消耗的用户CPU
# Modules # 模块部分
# Errorstats # Redis 错误统计
errorstat_ERR:count=6
errorstat_WRONGTYPE:count=2
# Cluster # 集群信息
cluster_enabled:0
# Keyspace # 数据库相关统计
db0:keys=11,expires=0,avg_ttl=0
127.0.0.1:6379>
可以使用单独的指令 :
info clients
127.0.0.1:6379> info clients
# Clients
connected_clients:1
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:32
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0
扩展:Redis 每秒执行多少次指令?
这个信息在 Stats 块里,可以通过 info stats 看到。
instantaneous_ops_per_sec:789 # 每秒处理的命令数
表示 ops 是 789,就是所有客户端每秒会发送 789 条指令到服务器执行。极限情况下,Redis 可以每秒执行 10w 次指令,CPU 几乎完全榨干。如果 qps 过高,可以考虑通过 monitor 指令快速观察一下究竟是哪些 key 访问比较频繁,从而在相应的业务上进行优化,以减少 IO 次数。monitor 指令会瞬间吐出来巨量的指令文本,所以一般在执行 monitor 后立即 ctrl+c中断输出。
127.0.0.1:6379> monitor
扩展:Redis 连接了多少客户端?
这个信息在 Clients 块里,可以通过 info clients 看到。
connected_clients:1 # 客户端连接数
这个信息也是比较有用的,通过观察这个数量可以确定是否存在意料之外的连接。如果发现这个数量不对劲,接着就可以使用client list指令列出所有的客户端链接地址来确定源头。
关于客户端的数量还有个重要的参数需要观察,那就是rejected_connections,它表示因为超出最大连接数限制而被拒绝的客户端连接次数,如果这个数字很大,意味着服务器的最大连接数设置的过低需要调整 maxclients 参数。
扩展:Redis 内存占用多大?
这个信息在 Memory 块里,可以通过 info memory 看到。
used_memory:1119760 # 使用内存
used_memory_human:1.07M # 可读表示
如果单个 Redis 内存占用过大,并且在业务上没有太多压缩的空间的话,可以考虑集群化了。
复制积压缓冲区多大??
这个信息在 Replication 块里,可以通过 info replication 看到。
repl_backlog_active:0 # 表示复制积压处于活动状态的标志
repl_backlog_size:1048576 # 复制积压缓冲区的总大小
repl_backlog_first_byte_offset:0 # 复制积压缓冲区的主偏移量
repl_backlog_histlen:0 # 复制积压缓冲区中数据的大小
复制积压缓冲区大小非常重要,它严重影响到主从复制的效率。当从库因为网络原因临时断开了主库的复制,然后网络恢复了,又重新连上的时候,这段断开的时间内发生在 master 上的修改操作指令都会放在积压缓冲区中,这样从库可以通过积压缓冲区恢复中断的主从同步过程
积压缓冲区是环形的,后来的指令会覆盖掉前面的内容。如果从库断开的时间过长,或者缓冲区的大小设置的太小,都会导致从库无法快速恢复中断的主从同步过程,因为中间的修改指令被覆盖掉了。这时候从库就会进行全量同步模式,非常耗费 CPU 和网络资源。
如果有多个从库复制,积压缓冲区是共享的,它不会因为从库过多而线性增长。如果实例的修改指令请求很频繁,那就把积压缓冲区调大一些,几十个 M 大小差不多了,如果很闲,那就设置为几个 M。
|