Redis `INFO` 命令:全面诊断 Redis 实例状态

Redis INFO 命令:打开潘多拉的魔盒,窥探 Redis 的灵魂! (或者,如何成为 Redis 侦探)

大家好,我是你们的老朋友,一个沉迷于代码海洋的老水手。今天,我们要一起扬帆起航,探索 Redis 这片广袤大陆上一个极其重要的工具——INFO 命令。

别看 INFO 命令只有短短几个字母,它可是 Redis 世界里的“瑞士军刀”,是诊断 Redis 实例健康状况的“听诊器”,是深入了解 Redis 内部运作机制的“X光片”。毫不夸张地说,掌握 INFO 命令,就等于拥有了洞察 Redis 灵魂的能力!

想象一下,你是一位经验丰富的侦探,面对一个神秘的案件——Redis 性能突然下降,连接时断时续,数据神秘失踪…… 你需要什么?当然不是靠瞎猜!你需要线索,需要证据,需要真相! 而 INFO 命令,就是你手中的放大镜,帮你从蛛丝马迹中找到真凶。

准备好了吗? 让我们一起打开这个“潘多拉的魔盒”,看看里面藏着什么秘密!

一、 INFO 命令: 简单的命令,强大的力量

INFO 命令的语法非常简单:

INFO [section]

其中 section 是可选参数,用于指定要查询的信息类别。如果不指定 section,则返回所有信息。

敲黑板!重点来了! 这些 section 可不是随便写的,它们代表了 Redis 实例的不同方面,就像人体的各个器官,每个都承载着重要的功能。 常见的 section 包括:

  • server: 关于 Redis 服务器的一般信息,比如版本号、操作系统、运行时间等等。
  • clients: 关于客户端连接的信息,比如连接数、阻塞客户端数等等。
  • memory: 关于内存使用情况的信息,比如已用内存、峰值内存等等。
  • persistence: 关于持久化配置和状态的信息,比如 RDB 和 AOF 的配置、最近一次保存时间等等。
  • stats: 关于服务器的统计信息,比如查询次数、命中率等等。
  • replication: 关于主从复制的信息,比如角色、主节点地址等等。
  • cpu: 关于 CPU 使用情况的信息。
  • commandstats: 关于命令执行统计的信息,比如每个命令的调用次数、平均执行时间等等。
  • cluster: 关于 Redis 集群的信息。
  • keyspace: 关于数据库的信息,比如每个数据库的键的数量、过期键的数量等等。
  • errorstats: 关于错误命令统计的信息。
  • modules: 关于已加载模块的信息。
  • all: 返回所有信息 (默认选项)。
  • default: 返回默认信息,与不指定section相同。

看到这么多 section,你是不是有点眼花缭乱了? 别担心,我们接下来会逐一分析,让你对每个 section 的作用了如指掌。

二、 深入剖析 INFO 命令的各个 section

好了,现在让我们开始解剖 Redis,看看每个 section 里面都藏着什么宝贝。

1. server section: Redis 的“身份证”

server section 包含了 Redis 服务器的基本信息,就像一个人的身份证一样,可以让你快速了解 Redis 的身份。

字段名 含义 例子
redis_version Redis 服务器版本 7.0.5
redis_git_sha1 Redis Git SHA1 提交哈希值 00000000
redis_git_dirty Redis Git dirty flag,如果 Redis 是从一个未提交状态构建的,则为 1,否则为 0 0
redis_build_id Redis 构建 ID 0000000000000000
redis_mode Redis 运行模式,可以是 standalonecluster standalone
os 运行 Redis 服务器的操作系统 Linux 5.15.0-69-generic x86_64
arch_bits 架构(32 或 64 位) 64
multiplexing_api Redis 使用的事件循环机制 epoll
atomicvar_api Redis 使用的原子变量 API atomic-builtin
gcc_version 用于编译 Redis 的 GCC 版本 11.3.0
process_id Redis 服务器进程 ID 1234
process_supervision 进程管理程序,例如 systemd 或 supervisord no-supervision
tcp_port Redis 监听的 TCP 端口 6379
server_time_usec 服务器当前时间,以 Unix 时间戳(微秒)表示 1678886400000000
uptime_in_seconds Redis 服务器运行的总秒数 3600
uptime_in_days Redis 服务器运行的总天数 1
hz Redis 服务器每秒执行的任务数 10
configured_hz Redis 配置的每秒执行的任务数 10
lru_clock Redis LRU 时钟,用于 LRU 淘汰算法 12345678
executable Redis 服务器可执行文件的路径 /usr/local/bin/redis-server
config_file Redis 配置文件路径 /etc/redis/redis.conf
io_threads_active 当前活跃的 IO 线程数 1

通过 server section,你可以快速了解 Redis 的版本、操作系统、运行时间等信息,这些信息对于诊断问题和进行版本升级都非常重要。

2. clients section: 了解客户端连接情况

clients section 提供了关于客户端连接的信息,比如连接数、阻塞客户端数等等。

字段名 含义 例子
connected_clients 已连接客户端的数量(不包括通过复制连接的客户端) 10
cluster_connections 已连接到集群的客户端的数量 0
maxclients Redis 服务器可以处理的最大客户端连接数 10000
client_recent_max_input_buffer 最近连接客户端的最大输入缓冲区 2048
client_recent_max_output_buffer 最近连接客户端的最大输出缓冲区 0
blocked_clients 正在等待阻塞命令(例如 BLPOP)的客户端数量 0
tracking_clients 正在跟踪服务器端缓存的客户端数量 0
clients_in_timeout_table 在超时表中注册的客户端数量 0

如果 connected_clients 数量过高,可能意味着 Redis 服务器压力过大,需要进行优化。 如果 blocked_clients 数量过高,可能意味着有大量的客户端在等待阻塞命令,需要检查阻塞命令的执行情况。

3. memory section: 关注内存健康

memory section 提供了关于内存使用情况的信息,这是 Redis 性能的关键指标之一。

字段名 含义 例子
used_memory Redis 分配器分配的总内存(以字节为单位) 1048576
used_memory_human used_memory 的人类可读格式 1.00M
used_memory_rss 操作系统分配给 Redis 进程的内存(常驻集大小,以字节为单位) 2097152
used_memory_rss_human used_memory_rss 的人类可读格式 2.00M
used_memory_peak Redis 峰值内存使用量(以字节为单位) 1572864
used_memory_peak_human used_memory_peak 的人类可读格式 1.50M
used_memory_peak_perc 峰值内存使用量占总内存的百分比 150.00%
used_memory_overhead Redis 为了维护数据结构而使用的内存开销(以字节为单位),包括客户端缓冲、查询缓冲、复制积压缓冲区等 209715
used_memory_startup Redis 启动时使用的内存(以字节为单位) 524288
used_memory_dataset Redis 数据集大小(以字节为单位),不包括开销 838861
used_memory_dataset_perc 数据集大小占总内存的百分比 80.00%
allocator_allocated 分配器分配的内存(以字节为单位) 1048576
allocator_active 分配器当前活跃的内存(以字节为单位) 1572864
allocator_resident 分配器常驻内存(以字节为单位) 2097152
total_system_memory 系统总内存(以字节为单位) 8589934592
total_system_memory_human total_system_memory 的人类可读格式 8.00G
used_memory_lua Lua 脚本引擎使用的内存(以字节为单位) 0
used_memory_vm_eval VM 评估器使用的内存(以字节为单位) 0
used_memory_scripts_eval 脚本评估器使用的内存(以字节为单位) 0
number_of_cached_scripts 缓存的脚本数量 0
maxmemory Redis 配置的最大内存限制(以字节为单位) 0
maxmemory_human maxmemory 的人类可读格式 0B
maxmemory_policy Redis 使用的内存淘汰策略 noeviction
allocator_frag_ratio 分配器碎片率(allocator_active / allocator_allocated 1.50
allocator_frag_bytes 分配器碎片字节数(allocator_active - allocator_allocated 524288
allocator_rss_ratio 分配器 RSS 比率(allocator_resident / allocator_active 1.33
allocator_rss_bytes 分配器 RSS 字节数(allocator_resident - allocator_active 524288
rss_overhead_ratio RSS 开销比率(used_memory_rss / used_memory 2.00
rss_overhead_bytes RSS 开销字节数(used_memory_rss - used_memory 1048576
mem_fragmentation_ratio 内存碎片率(used_memory_rss / used_memory 2.00
mem_fragmentation_bytes 内存碎片字节数(used_memory_rss - used_memory 1048576
mem_not_counted_for_replication 未计入复制的内存(以字节为单位) 0
active_defrag_running 是否正在运行活跃的碎片整理 0
lazyfree_pending_objects 等待 lazyfree 释放的对象数量 0
lazyfreed_objects 已经 lazyfree 释放的对象数量 0

如果 used_memory 超过了 maxmemory,Redis 会根据配置的 maxmemory_policy 进行内存淘汰,这可能会影响性能。 mem_fragmentation_ratio 越高,说明内存碎片越严重,也可能会影响性能。

4. persistence section: 守护数据的安全

persistence section 提供了关于持久化配置和状态的信息,确保你的数据不会因为服务器宕机而丢失。

字段名 含义 例子
loading Redis 是否正在加载 RDB 文件 0
rdb_changes_since_last_save 自上次成功保存 RDB 文件以来的更改次数 100
rdb_bgsave_in_progress 是否正在进行 RDB 后台保存 0
rdb_last_save_time 上次成功保存 RDB 文件的时间戳(Unix 时间戳) 1678886400
rdb_last_bgsave_status 上次 RDB 后台保存的状态(okerr ok
rdb_last_bgsave_time_sec 上次 RDB 后台保存所用的时间(秒) 1
rdb_current_bgsave_time_sec 当前 RDB 后台保存所用的时间(秒),如果正在进行 0
rdb_last_cow_size 上次 RDB 保存期间的写时复制大小(以字节为单位) 0
aof_enabled AOF 是否启用 1
aof_rewrite_in_progress 是否正在进行 AOF 重写 0
aof_rewrite_scheduled 是否安排了 AOF 重写 0
aof_appendonly_buffer_bytes AOF 追加缓冲区的大小(以字节为单位) 0
aof_appendonly_buffer_free AOF 追加缓冲区可用的字节数 0
aof_current_size AOF 文件当前大小(以字节为单位) 1048576
aof_base_size AOF 重写后的基准大小(以字节为单位) 1048576
aof_pending_rewrite 是否有挂起的 AOF 重写操作 0
aof_fd AOF 文件的文件描述符 5
aof_last_rewrite_time_sec 上次 AOF 重写所用的时间(秒) 1
aof_current_rewrite_time_sec 当前 AOF 重写所用的时间(秒),如果正在进行 0
aof_last_bgrewrite_status 上次 AOF 重写的状态(okerr ok
aof_last_write_status 上次 AOF 写入的状态(okerr ok
aof_last_cow_size 上次 AOF 重写期间的写时复制大小(以字节为单位) 0
module_fork_in_progress 是否有模块正在进行 fork 操作 0
module_fork_pid 模块 fork 操作的 PID 0
module_fork_last_cow_size 上次模块 fork 操作期间的写时复制大小(以字节为单位) 0

如果 rdb_bgsave_in_progressaof_rewrite_in_progress 为 1,说明 Redis 正在进行持久化操作,这可能会影响性能。 你可以通过 rdb_last_save_timeaof_last_rewrite_time_sec 了解上次持久化操作的时间和耗时,从而评估持久化策略是否合理。

5. stats section: 追踪服务器的脉搏

stats section 提供了关于服务器的统计信息,比如查询次数、命中率等等,可以帮助你了解 Redis 的运行状态。

字段名 含义 例子
total_connections_received Redis 服务器接受的总连接数 1000
total_commands_processed Redis 服务器处理的总命令数 10000
instantaneous_ops_per_sec Redis 服务器每秒处理的命令数(最近 1 秒) 100
instantaneous_input_kbps Redis 服务器每秒接收的输入流量(千字节) 10
instantaneous_output_kbps Redis 服务器每秒发送的输出流量(千字节) 20
rejected_connections 由于达到 maxclients 限制而被拒绝的连接数 0
sync_full 主从同步期间执行的完全同步次数 1
sync_partial_ok 主从同步期间执行的部分同步成功次数 10
sync_partial_err 主从同步期间执行的部分同步失败次数 0
expired_keys 过期键的总数 100
evicted_keys 由于达到内存限制而被淘汰的键的总数 10
keyspace_hits 成功的查找键的总数 1000
keyspace_misses 未成功的查找键的总数 100
pubsub_channels 当前活动发布订阅频道数 10
pubsub_patterns 当前活动发布订阅模式数 5
latest_fork_usec 最近一次 fork 操作的耗时(微秒) 10000
migrate_cached_sockets 迁移缓存的套接字数 10
slave_expires_tracked_keys 从节点跟踪的过期键数 100
active_defrag_hits 活跃碎片整理成功移动的对象数 100
active_defrag_misses 活跃碎片整理未能移动的对象数 10
active_defrag_key_hits 活跃碎片整理期间键查找的命中数 1000
active_defrag_key_misses 活跃碎片整理期间键查找的未命中数 100

keyspace_hitskeyspace_misses 可以用来计算缓存命中率,命中率越高,说明 Redis 的性能越好。 expired_keysevicted_keys 可以用来了解键的过期和淘汰情况,如果数量过多,可能意味着需要调整键的过期策略或增加 Redis 的内存。

6. replication section: 监控主从复制

replication section 提供了关于主从复制的信息,确保你的数据能够安全可靠地复制到多个节点。

字段名 含义 例子
role Redis 实例的角色(masterslave master
connected_slaves 连接到主节点的从节点数量 2
slave0:ip 从节点 0 的 IP 地址 192.168.1.100
slave0:port 从节点 0 的端口 6379
slave0:state 从节点 0 的状态(onlineoffline online
slave0:offset 从节点 0 的复制偏移量 12345678
slave0:lag 从节点 0 的延迟(秒) 0
master_replid 主节点的复制 ID abcdef1234567890abcdef1234567890
master_replid2 主节点的第二个复制 ID(用于部分同步) 00000000000000000000000000000000
master_repl_offset 主节点的复制偏移量 12345678
second_repl_offset 第二个复制偏移量 -1
repl_backlog_active 复制积压缓冲区是否激活 1
repl_backlog_size 复制积压缓冲区的大小(字节) 1048576
repl_backlog_first_byte_offset 复制积压缓冲区的起始偏移量 1234567
repl_backlog_histlen 复制积压缓冲区中已存储的数据量(字节) 1000000

如果 roleslave,你可以通过 master_hostmaster_port 了解主节点的地址和端口。 你可以通过 slaveX:stateslaveX:lag 了解从节点的状态和延迟,如果延迟过高,可能意味着主从复制存在问题。

7. cpu section: 诊断 CPU 瓶颈

cpu section 提供了关于 CPU 使用情况的信息,可以帮助你诊断 CPU 瓶颈。

字段名 含义 例子
used_cpu_sys Redis 服务器使用的系统 CPU 时间(秒) 10.00
used_cpu_user Redis 服务器使用的用户 CPU 时间(秒) 20.00
used_cpu_sys_children Redis 子进程使用的系统 CPU 时间(秒) 0.00
used_cpu_user_children Redis 子进程使用的用户 CPU 时间(秒) 0.00

如果 used_cpu_sysused_cpu_user 较高,可能意味着 Redis 服务器存在 CPU 瓶颈,需要进行优化。

8. commandstats section: 分析命令执行情况

commandstats section 提供了关于命令执行统计的信息,可以帮助你了解每个命令的调用次数、平均执行时间等等。

字段名 含义 例子
cmdstat_get:calls GET 命令的调用次数 10000
cmdstat_get:usec GET 命令的总执行时间(微秒) 1000000
cmdstat_get:usec_per_call GET 命令的平均执行时间(微秒) 100
cmdstat_set:calls SET 命令的调用次数 5000
cmdstat_set:usec SET 命令的总执行时间(微秒) 500000
cmdstat_set:usec_per_call SET 命令的平均执行时间(微秒) 100

通过分析 commandstats section,你可以找到执行时间较长的命令,并进行优化。

9. cluster section: 探索集群的奥秘

cluster section 提供了关于 Redis 集群的信息,只有在 Redis 运行在集群模式下才会显示。

字段名 含义 例子
cluster_enabled 集群模式是否启用 (1: 是, 0: 否) 1
cluster_state 集群状态 (ok: 正常, fail: 失败) ok
cluster_slots_assigned 已分配的槽数量 16384
cluster_slots_ok 状态为 OK 的槽数量 16384
cluster_slots_pfail 状态为 PFAIL (疑似失败) 的槽数量 0
cluster_slots_fail 状态为 FAIL (失败) 的槽数量 0
cluster_known_nodes 集群已知节点数量 3
cluster_size 集群中至少有一个槽的节点数量 3
cluster_current_epoch 集群当前纪元 5
cluster_my_epoch 节点当前纪元 5
cluster_stats_messages_sent 节点发送的消息统计 (可以使用cluster_stats_messages_sent_ping, cluster_stats_messages_sent_meet 等查看具体消息类型) cluster_stats_messages_sent_ping=123,cluster_stats_messages_sent_meet=456
cluster_stats_messages_received 节点接收的消息统计 (可以使用cluster_stats_messages_received_ping, cluster_stats_messages_received_meet 等查看具体消息类型) cluster_stats_messages_received_ping=789,cluster_stats_messages_received_meet=012

通过 cluster section,你可以了解集群的状态、节点数量、槽分配情况等等,从而监控集群的健康状况。

10. keyspace section: 观察数据库的健康

keyspace section 提供了关于数据库的信息,比如每个数据库的键的数量、过期键的数量等等。

字段名 含义 例子
db0:keys 数据库 0 中的键的数量 1000
db0:expires 数据库 0 中设置了过期时间的键的数量 100
db0:avg_ttl 数据库 0 中键的平均生存时间(毫秒) 10000
db1:keys 数据库 1 中的键的数量 500
db1:expires 数据库 1 中设置了过期时间的键的数量 50
db1:avg_ttl 数据库 1 中键的平均生存时间(毫秒) 5000

通过 keyspace section,你可以了解每个数据库的键的数量和过期情况,从而监控数据库的健康状况。

11. errorstats section: 错误命令统计

errorstats section 提供了关于错误命令统计的信息,方便排查客户端的错误。

字段名 含义 例子
errorstat_WRONGTYPE:count WRONGTYPE 错误的计数 100
errorstat_NOSCRIPT:count NOSCRIPT 错误的计数 50

12. modules section: 已加载模块信息

modules section 提供了关于已加载模块的信息,如果使用了 Redis 模块,可以通过这个 section 查看。

字段名 含义 例子
module:name 模块名称 my_module
module:ver 模块版本 1.0

三、 INFO 命令的实际应用: 案例分析

光说不练假把式,让我们来看几个 INFO 命令的实际应用案例。

案例 1: 诊断 Redis 内存溢出

有一天,你的 Redis 服务器突然变得非常缓慢,甚至开始拒绝连接。 你怀疑是内存溢出导致的。 你可以使用以下命令来查看内存使用情况:

INFO memory

如果 used_memory 接近或超过了 maxmemory,并且 evicted_keys 数量很高,那么可以确定是内存溢出导致了性能问题。 你可以采取以下措施来解决问题:

  • 增加 Redis 的内存
  • 调整 maxmemory_policy,选择更合适的内存淘汰策略
  • 优化你的数据结构,减少内存占用
  • 分析哪些键占用了大量的内存,并进行优化

案例 2: 诊断 Redis 主从复制延迟

你的 Redis 主从复制环境出现了延迟,从节点的数据更新不及时。 你可以使用以下命令来查看主从复制状态:

INFO replication

如果 slaveX:lag 很高,说明从节点的延迟很高。 你可以采取以下措施来解决问题:

  • 检查主从节点之间的网络连接是否正常
  • 检查主节点的 CPU 和内存负载是否过高
  • 调整复制缓冲区的大小
  • 考虑使用 Redis 集群来提高数据复制的性能

案例 3: 优化 Redis 命令执行效率

你的 Redis 服务器处理的命令数量很多,但是吞吐量却很低。 你可以使用以下命令来查看命令执行统计信息:

INFO commandstats

通过分析 commandstats section,你可以找到执行时间较长的命令,并进行优化。 例如,你可以使用 Redis Pipeline 来批量执行命令,减少网络延迟。 还可以优化你的 Lua 脚本,提高执行效率。

四、 INFO 命令的注意事项

  • INFO 命令会返回大量的信息,可能会对服务器性能产生一定的影响,所以不要频繁地执行 INFO 命令。
  • INFO 命令返回的信息是动态变化的,所以每次执行 INFO 命令的结果可能都不一样。
  • 不同的 Redis 版本,INFO 命令返回的信息可能略有不同。

五、 总结: 掌握 INFO 命令,成为 Redis 大师

INFO 命令是 Redis 世界里的一把万能钥匙,它可以帮助你了解 Redis 的内部运作机制,诊断 Redis 的性能问题,优化 Redis 的配置。 掌握 INFO 命令,你就可以像一位经验丰富的医生一样,通过观察 Redis 的“体征”,判断 Redis 的“健康状况”,并开出“药方”,让你的 Redis 服务器始终保持最佳状态。

所以,下次当你遇到 Redis 问题时,不要慌张,不要盲目猜测,拿起你的 INFO 命令,打开这个“潘多拉的魔盒”,让真相浮出水面! 相信你一定能成为一位真正的 Redis 大师! 💪

希望这篇文章对你有所帮助。 谢谢大家! 🙏

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注