各位好,今天咱们来聊聊 Redis 里的“情报中心”—— INFO
命令。这个命令就像是 Redis 实例的健康报告,或者说是它的体检报告,能告诉你 Redis 现在身体怎么样,有没有什么潜在的健康问题。掌握了 INFO
命令,你就相当于拥有了透视 Redis 内部状态的能力,调优、排错、监控,都离不开它。
咱们先来一睹 INFO
命令的芳容。
INFO
命令:一窥 Redis 全貌
最简单的用法就是直接输入 INFO
,它会返回一大坨信息,包含各种各样的指标,简直是信息爆炸。
INFO
输出结果类似下面这样 (省略了部分内容,毕竟全贴出来太长了):
# Server
redis_version:7.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:d865b798d3f94a88
redis_mode:standalone
os:Linux 5.4.0-150-generic x86_64
arch_bits:64
monotonic_clock:POSIX clock_gettime
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:9.4.0
process_id:1
process_supervised:no
run_id:1234567890abcdef1234567890abcdef12345678
tcp_port:6379
server_time_usec:1678886400000000
uptime_in_seconds:86400
uptime_in_days:1
hz:10
lru_clock:1680000
executable:/usr/local/bin/redis-server
config_file:/etc/redis/redis.conf
io_threads_mode:off
...
# Clients
connected_clients:10
client_recent_max_input_buffer:2048
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0
# Memory
used_memory:1048576
used_memory_human:1MB
used_memory_rss:2097152
used_memory_rss_human:2MB
used_memory_peak:1048576
used_memory_peak_human:1MB
used_memory_peak_perc:100.00%
used_memory_overhead:524288
used_memory_startup:524288
used_memory_dataset:524288
used_memory_dataset_perc:50.00%
allocator_allocated:1048576
allocator_active:2097152
allocator_resident:2097152
total_system_memory:16777216
total_system_memory_human:16MB
used_memory_lua:32768
used_memory_lua_human:32K
used_memory_scripts:0
used_memory_scripts_human:0B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:2.00
allocator_frag_bytes:1048576
allocator_rss_ratio:2.00
allocator_rss_bytes:1048576
rss_overhead_ratio:1.00
rss_overhead_bytes:0
mem_fragmentation_ratio:2.00
mem_fragmentation_bytes:1048576
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_total_replication_buffers:0
mem_clients_slaves:0
mem_clients_normal:0
mem_aof_buffer:0
mem_allocator:jemalloc-5.2.1
active_defrag_running:0
lazyfree_pending_objects:0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1678800000
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_append_only_fsync:everysec
aof_current_size:0
aof_base_size:0
aof_pending_rewrite:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_pending_fsync:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_cow_size:0
module_fork_in_progress:0
module_fork_last_cow_size:0
# Stats
total_connections_received:100
total_commands_processed:1000
instantaneous_ops_per_sec:10
instantaneous_input_kbps:1.00
instantaneous_output_kbps:2.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:10
evicted_keys:0
keyspace_hits:100
keyspace_misses:10
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1000
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# Replication
role:master
connected_slaves:0
master_replid:1234567890abcdef1234567890abcdef12345678
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:1.00
used_cpu_user:2.00
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Keyspace
db0:keys=100,expires=10,avg_ttl=1000
# Cluster
cluster_enabled:0
# Modules
化繁为简:Sections 的妙用
面对如此海量的信息,是不是有点晕? 别慌,Redis 早就为我们考虑到了,它提供了 INFO
命令的 Sections 功能,可以让你只查看特定部分的信息。
INFO [section]
其中 section
可以是以下值:
server
: 关于 Redis 服务器的一般信息。clients
: 关于客户端连接的信息。memory
: 关于内存使用的信息。persistence
: 关于持久化的信息(RDB 和 AOF)。stats
: 关于一般统计的信息。replication
: 关于复制的信息。cpu
: 关于 CPU 使用的信息。keyspace
: 关于数据库的信息。cluster
: 关于集群的信息。modules
: 关于模块的信息。all
: 返回所有信息。 (默认)default
: 返回默认信息 (server, clients, memory, persistence, stats, replication, cpu, keyspace)
例如,只想查看内存信息,可以这样:
INFO memory
这样输出的结果就只包含 Memory
Section 的内容了,是不是清爽多了?
深入解读:各个 Section 的关键指标
接下来,咱们逐个 Section 详细解读,看看每个 Section 里都有哪些重要的指标,以及它们代表的含义。
1. Server Section
这个 Section 包含了 Redis 服务器的基本信息。
指标 | 含义 | 重要性 |
---|---|---|
redis_version |
Redis 服务器的版本号。 | 高 |
redis_mode |
Redis 服务器的运行模式,可以是 standalone (单机模式) 或 cluster (集群模式)。 |
高 |
os |
操作系统。 | 中 |
arch_bits |
操作系统架构位数。 | 低 |
process_id |
Redis 服务器的进程 ID。 | 中 |
uptime_in_seconds |
Redis 服务器的运行时间,以秒为单位。 | 高 |
uptime_in_days |
Redis 服务器的运行时间,以天为单位。 | 高 |
hz |
Redis 服务器每秒执行的操作数。这个值越高,表示 Redis 服务器的响应速度越快。 | 高 |
lru_clock |
LRU 时钟,用于近似 LRU 算法。 | 中 |
executable |
Redis 服务器可执行文件的路径。 | 低 |
config_file |
Redis 服务器配置文件的路径。 | 低 |
tcp_port |
Redis 服务器监听的 TCP 端口。 | 高 |
2. Clients Section
这个 Section 包含了客户端连接的信息。
指标 | 含义 | 重要性 |
---|---|---|
connected_clients |
当前连接到 Redis 服务器的客户端数量。 | 高 |
client_recent_max_input_buffer |
客户端最近一次输入缓冲区的最大值。 | 中 |
client_recent_max_output_buffer |
客户端最近一次输出缓冲区的最大值。 | 中 |
blocked_clients |
因为 BLPOP 、BRPOP 等阻塞命令而阻塞的客户端数量。 |
高 |
tracking_clients |
使用客户端跟踪功能的客户端数量。 | 中 |
clients_in_timeout_table |
由于空闲超时而等待关闭的客户端数量。 | 低 |
connected_clients
太高可能意味着你的 Redis 连接数达到了瓶颈,需要考虑优化连接池配置或者客户端连接方式。blocked_clients
较高则可能意味着你的阻塞操作过多,影响了 Redis 的响应速度。
3. Memory Section
这个 Section 包含了 Redis 服务器的内存使用信息。这是最重要的 Section 之一,直接关系到 Redis 的性能和稳定性。
| 指标 | 含义 0
`used_memory` 是 Redis 实际使用的内存量,`used_memory_peak` 是 Redis 使用的内存峰值。 `maxmemory` 是 Redis 配置的最大内存限制。如果 `used_memory` 接近 `maxmemory`,就意味着 Redis 内存即将耗尽,可能会触发 OOM (Out Of Memory) 错误,或者触发配置的淘汰策略(比如LRU)。
`mem_fragmentation_ratio` 是内存碎片率,这个值越高,表示内存碎片越多。正常情况下,这个值应该接近 1。如果这个值远大于 1 (比如大于 1.5),就意味着 Redis 存在严重的内存碎片问题,可能会导致性能下降。
`used_memory_overhead`: Redis 为了维护自身数据结构,比如哈希表、链表等,所消耗的内存。这个值越小越好。
`used_memory_dataset`: 存储实际数据的内存大小。
**内存优化建议:**
* **合理设置 `maxmemory`:** 根据服务器的实际内存情况,设置一个合理的 `maxmemory` 值,防止 Redis 占用过多内存,影响其他应用程序的运行。
* **选择合适的淘汰策略:** 如果 Redis 内存不足,需要配置淘汰策略,选择合适的淘汰策略可以保证 Redis 的性能和数据的完整性。常见的淘汰策略有 LRU (Least Recently Used)、LFU (Least Frequently Used)、Random 等。
* **避免键值对过大:** 尽量避免存储过大的键值对,可以将大的键值对拆分成多个小的键值对。
* **定期清理过期数据:** 定期清理过期数据可以释放内存空间。
* **使用 Redis 4.0+ 的 `lazyfree` 机制:** 对于删除操作,使用异步释放内存的 `lazyfree` 机制可以减少阻塞,提高 Redis 的响应速度。
**4. Persistence Section**
这个 Section 包含了 Redis 持久化的信息,包括 RDB (Redis Database) 和 AOF (Append Only File)。
| 指标 | 含义 | 重要性 |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---- |
| `loading` | Redis 是否正在加载持久化文件。 | 高 |
| `rdb_changes_since_last_save` | 自上次 RDB 持久化以来,数据发生变化的次数。 | 中 |
| `rdb_bgsave_in_progress` | 是否正在进行 RDB 后台持久化。 | 高 |
| `rdb_last_save_time` | 上次 RDB 持久化的时间戳。 | 中 |
| `rdb_last_bgsave_status` | 上次 RDB 后台持久化的状态,`ok` 表示成功,`err` 表示失败。 | 高 |
| `aof_enabled` | AOF 是否启用。 | 高 |
| `aof_rewrite_in_progress` | 是否正在进行 AOF 重写。 | 高 |
| `aof_rewrite_scheduled` | AOF 重写是否被调度。 | 中 |
| `aof_append_only_fsync` | AOF 的 `fsync` 策略,可以是 `always`(每次写命令都同步到磁盘)、`everysec`(每秒同步一次到磁盘) 或 `no`(由操作系统决定何时同步到磁盘)。 | 高 |
如果 `rdb_bgsave_in_progress` 或 `aof_rewrite_in_progress` 持续为 1,意味着 Redis 正在进行大量的持久化操作,可能会影响 Redis 的性能。 应该关注 `rdb_last_bgsave_status` 和 `aof_last_bgrewrite_status`,确保持久化操作是成功的。
**5. Stats Section**
这个 Section 包含了 Redis 服务器的统计信息。
| 指标 | 含义