1. Redis INFO命令深度解析
Redis作为当前最流行的内存数据库之一,其内置的INFO命令是运维人员和开发者必须掌握的核心诊断工具。这个看似简单的命令实际上包含了Redis实例运行状态的完整快照,从内存使用到客户端连接,从持久化状态到复制关系,几乎所有关键指标都能通过INFO命令一览无余。
我第一次在生产环境排查性能问题时,就是通过INFO命令发现的连接数异常增长。当时某个微服务没有正确释放连接,导致Redis实例的连接数持续上升,最终触发了maxclients限制。通过分析INFO输出中的connected_clients和blocked_clients字段,我们迅速定位了问题代码。这种实战经历让我深刻认识到,精通INFO命令的输出解读是Redis运维的基本功。
2. INFO命令基础使用
2.1 命令格式与参数
在Redis-cli中执行INFO命令的基本格式如下:
127.0.0.1:6379> INFO [section]其中section参数是可选的,用于指定要获取的信息类别。如果不带参数,INFO命令会返回所有信息。Redis 7.0版本支持的主要section包括:
- server:Redis服务器基本信息
- clients:客户端连接相关
- memory:内存使用情况
- persistence:RDB和AOF持久化状态
- stats:通用统计信息
- replication:主从复制信息
- cpu:CPU使用情况
- commandstats:命令统计
- latency:延迟统计
- cluster:集群信息
- modules:模块信息
- keyspace:数据库键统计
2.2 典型使用场景
在实际工作中,我通常会根据不同的排查目标选择特定的section:
- 快速健康检查:
INFO memory+INFO stats - 连接数问题:
INFO clients+INFO stats - 持久化问题:
INFO persistence - 主从同步延迟:
INFO replication - 命令热点分析:
INFO commandstats
提示:生产环境中建议使用
INFO all命令获取完整信息后保存到文件,便于后续分析。对于大型Redis实例,全量INFO输出可能达到几十KB,直接阅读会比较困难。
3. 核心指标详解
3.1 Server基础信息
INFO server部分包含了Redis实例的基础信息,这些字段在版本兼容性和问题诊断中特别重要:
# Server redis_version:7.0.5 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:9a3b086f4c0d4d1a redis_mode:standalone os:Linux 5.4.0-105-generic x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:9.3.0 process_id:1 run_id:7f3a3c2d9e9d4a1b8c0d5f6e7a8b9c0d tcp_port:6379 server_time_usec:1659345678901234 uptime_in_seconds:86400 uptime_in_days:1 hz:10 configured_hz:10 lru_clock:1234567 executable:/usr/local/bin/redis-server config_file:/etc/redis/redis.conf io_threads_active:0关键字段解析:
redis_version:不仅显示版本号,还能帮助判断是否存在已知漏洞os:操作系统信息,某些性能问题与OS版本相关uptime_in_seconds:实例运行时间,短时间内的重启可能暗示存在问题hz:Redis内部定时任务频率,影响过期键清除和超时检查的及时性io_threads_active:I/O线程数,0表示未启用多线程
3.2 内存使用分析
INFO memory是排查内存问题的第一站,其输出包含内存分配和使用细节:
# Memory used_memory:104857600 used_memory_human:100.00M used_memory_rss:110100480 used_memory_rss_human:105.00M used_memory_peak:120586240 used_memory_peak_human:115.00M used_memory_peak_perc:86.90% used_memory_overhead:20971520 used_memory_startup:862208 used_memory_dataset:83886080 used_memory_dataset_perc:80.00% allocator_allocated:104857600 allocator_active:110100480 allocator_resident:115343360 total_system_memory:17179869184 total_system_memory_human:16.00G used_memory_lua:37888 used_memory_lua_human:37.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:1.05 allocator_frag_bytes:5242880 allocator_rss_ratio:1.05 allocator_rss_bytes:5242880 rss_overhead_ratio:0.96 rss_overhead_bytes:-5242880 mem_fragmentation_ratio:1.05 mem_fragmentation_bytes:5242880 mem_not_counted_for_evict:0 mem_replication_backlog:1048576 mem_clients_slaves:0 mem_clients_normal:49600 mem_aof_buffer:0 mem_allocator:jemalloc-5.1.0 active_defrag_running:0 lazyfree_pending_objects:0内存相关的重要指标:
used_memory vs used_memory_rss:
- used_memory:Redis分配器申请的内存总量
- used_memory_rss:操作系统看到的内存占用
- 两者比值(mem_fragmentation_ratio)大于1.5时可能存在内存碎片
内存使用趋势:
# 计算内存增长速率 redis-cli --latency-history -i 60 \ | awk '/used_memory:/{print $2}' \ | paste -sd- \ | bc内存淘汰策略:
- maxmemory_policy决定了内存达到上限时的行为
- 常见策略有volatile-lru、allkeys-lru、volatile-ttl等
经验:当mem_fragmentation_ratio持续高于1.5时,可以考虑重启实例或启用active defragmentation(需要Redis 4.0+)
3.3 客户端连接监控
INFO clients展示了客户端连接状态,对于诊断连接泄漏和拒绝服务攻击至关重要:
# Clients connected_clients:50 cluster_connections:0 maxclients:10000 client_recent_max_input_buffer:8 client_recent_max_output_buffer:0 blocked_clients:0 tracking_clients:0 clients_in_timeout_table:0关键指标说明:
connected_clients:当前客户端连接数maxclients:允许的最大连接数(受限于ulimit和maxclients配置)blocked_clients:因BLPOP等命令阻塞的客户端数client_recent_max_input_buffer:最近最大的输入缓冲区大小(KB)
连接数突增的常见原因:
- 客户端连接池配置不当(未设置最大连接数)
- 客户端未正确释放连接
- 遭受连接型攻击
检查连接来源的命令:
redis-cli client list | awk '{print $2}' | cut -d= -f2 | sort | uniq -c | sort -nr3.4 持久化状态检查
INFO persistence展示了RDB和AOF持久化的状态,对于数据安全至关重要:
# Persistence loading:0 rdb_changes_since_last_save:1000 rdb_bgsave_in_progress:0 rdb_last_save_time:1659345600 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:1 rdb_current_bgsave_time_sec:-1 rdb_last_cow_size:4194304 aof_enabled:1 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 aof_last_cow_size:0 aof_current_size:123456 aof_base_size:123000 aof_pending_rewrite:0 aof_buffer_length:0 aof_rewrite_buffer_length:0 aof_pending_bio_fsync:0 aof_delayed_fsync:0关键状态解读:
RDB相关:
rdb_bgsave_in_progress:是否正在执行BGSAVErdb_last_bgsave_status:上次BGSAVE状态(ok/err)rdb_last_save_time:上次成功保存的Unix时间戳
AOF相关:
aof_rewrite_in_progress:是否正在执行AOF重写aof_last_rewrite_status:上次AOF重写状态aof_current_size:当前AOF文件大小
警告:如果
aof_last_write_status或rdb_last_bgsave_status显示err,表明持久化失败,必须立即检查Redis日志和磁盘空间
3.5 复制状态监控
INFO replication对于主从架构至关重要,可以实时了解复制状态和延迟:
# Replication role:master connected_slaves:2 slave0:ip=192.168.1.2,port=6379,state=online,offset=10000,lag=0 slave1:ip=192.168.1.3,port=6379,state=online,offset=9500,lag=1 master_failover_state:no-failover master_replid:7f3a3c2d9e9d4a1b8c0d5f6e7a8b9c0d master_replid2:0000000000000000000000000000000000000000 master_repl_offset:10000 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:10000主从复制关键指标:
角色识别:
role:master或role:slave- 从节点还会显示master_host和master_port
复制延迟:
offset差值反映主从数据差异lag表示从节点最后一次ping的秒数
复制积压缓冲区:
repl_backlog_size:缓冲区大小repl_backlog_histlen:当前有效数据量
检测复制延迟的实用命令:
# 主节点获取当前偏移量 MASTER_OFFSET=$(redis-cli info replication | grep master_repl_offset | cut -d: -f2) # 从节点获取自身偏移量 SLAVE_OFFSET=$(redis-cli info replication | grep slave_repl_offset | cut -d: -f2) # 计算延迟字节数 echo $(($MASTER_OFFSET - $SLAVE_OFFSET))4. 高级应用场景
4.1 性能基准测试
结合INFO stats可以实施简单的性能测试:
# 测试前重置统计 redis-cli config resetstat # 执行测试命令 redis-benchmark -q -n 100000 # 查看命令统计 redis-cli info commandstats4.2 内存优化分析
通过INFO memory和INFO keyspace可以分析内存使用模式:
# 获取各数据库键数量 redis-cli info keyspace # 获取大键列表 redis-cli --bigkeys # 获取内存分析报告 redis-cli --memkeys4.3 监控集成方案
将INFO命令集成到监控系统中的常用方法:
Telegraf采集:
[[inputs.redis]] servers = ["tcp://localhost:6379"] password = "yourpassword"Prometheus监控:
- job_name: 'redis' static_configs: - targets: ['localhost:9121'] metrics_path: /scrape params: target: ['redis://localhost:6379']自定义采集脚本:
#!/bin/bash HOST="localhost" PORT="6379" METRICS_FILE="/tmp/redis_metrics.prom" echo "# HELP redis_connected_clients Connected clients" > $METRICS_FILE echo "# TYPE redis_connected_clients gauge" >> $METRICS_FILE echo "redis_connected_clients $(redis-cli -h $HOST -p $PORT info clients | grep connected_clients | cut -d: -f2)" >> $METRICS_FILE
5. 常见问题排查指南
5.1 内存不足错误
现象:OOM command not allowed when used memory > 'maxmemory'
排查步骤:
- 检查
INFO memory中的used_memory和maxmemory - 确认
maxmemory_policy设置 - 分析
INFO keyspace中的键数量分布 - 使用
redis-cli --bigkeys找出大键
5.2 连接数耗尽
现象:max number of clients reached
解决方案:
- 临时增加连接数限制:
redis-cli config set maxclients 20000 - 检查
INFO clients中的连接来源:redis-cli client list | awk '{print $2}' | cut -d= -f2 | sort | uniq -c - 优化客户端连接池配置
5.3 主从同步延迟
现象:从节点数据落后主节点
诊断方法:
- 主节点执行:
redis-cli info replication | grep master_repl_offset - 从节点执行:
redis-cli info replication | grep slave_repl_offset - 计算偏移量差值
优化建议:
- 增大
repl-backlog-size - 提升从节点性能
- 考虑使用更快的网络连接
5.4 AOF写入阻塞
现象:Redis响应变慢,aof_delayed_fsync增加
解决方案:
- 检查磁盘IO性能:
iostat -x 1 - 调整AOF策略:
# 将everysec改为no(牺牲部分持久性换取性能) redis-cli config set appendfsync no - 升级硬件或使用更快的存储设备
6. 实用技巧与最佳实践
6.1 INFO命令自动化分析
创建定期收集和分析INFO输出的脚本:
#!/bin/bash REDIS_HOST="localhost" REDIS_PORT=6379 LOG_DIR="/var/log/redis" # 收集全量INFO输出 TIMESTAMP=$(date +%Y%m%d_%H%M%S) redis-cli -h $REDIS_HOST -p $REDIS_PORT info all > $LOG_DIR/redis_info_$TIMESTAMP.log # 提取关键指标生成报告 { echo "=== Redis Health Report ===" echo "Timestamp: $(date)" echo "Uptime: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info | grep uptime_in_days | cut -d: -f2) days" echo "Memory Usage: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info memory | grep used_memory_human | cut -d: -f2)" echo "Clients: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info clients | grep connected_clients | cut -d: -f2)/$(redis-cli -h $REDIS_HOST -p $REDIS_PORT info clients | grep maxclients | cut -d: -f2)" echo "Memory Fragmentation Ratio: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info memory | grep mem_fragmentation_ratio | cut -d: -f2)" } > $LOG_DIR/redis_report_$TIMESTAMP.txt6.2 关键指标监控告警
建议对以下指标设置告警阈值:
| 指标名称 | 警告阈值 | 严重阈值 | 检查命令 |
|---|---|---|---|
| 内存使用率 | 70% | 90% | used_memory/maxmemory |
| 内存碎片率 | 1.3 | 1.8 | mem_fragmentation_ratio |
| 连接数使用率 | 70% | 90% | connected_clients/maxclients |
| 持久化最后一次成功状态 | - | !=ok | rdb_last_bgsave_status |
| 主从复制延迟(字节) | 10MB | 100MB | master_repl_offset-slave_repl_offset |
6.3 性能优化建议
内存优化:
- 使用Hash类型代替多个String键
- 启用压缩选项(list-max-ziplist-entries等)
- 定期执行
MEMORY PURGE(使用jemalloc时)
持久化调优:
- 对于大内存实例,增加
rdb-save-incremental-fsync - 调整AOF重写触发条件(auto-aof-rewrite-percentage/min-size)
- 对于大内存实例,增加
网络优化:
- 适当增加
tcp-backlog - 考虑启用
repl-disable-tcp-nodelay(高延迟网络)
- 适当增加
6.4 安全加固建议
- 定期检查
INFO clients中的异常连接 - 监控
INFO commandstats中的命令调用频率 - 限制危险命令的使用:
# 重命名危险命令 rename-command FLUSHDB "FLUSHDB_MUST_AUTH" rename-command CONFIG "CONFIG_MUST_AUTH" - 检查
INFO persistence确保持久化正常工作
7. 版本差异与兼容性
不同Redis版本的INFO输出有所差异,以下是主要变化:
| 版本 | 新增字段 | 移除字段 |
|---|---|---|
| 6.0 | io_threads_active, total_system_memory | - |
| 6.2 | mem_allocator, active_defrag_running | - |
| 7.0 | aof_rewrite_buffer_length, rdb_last_cow_size | - |
在编写监控脚本时,应该考虑版本兼容性问题。可以通过以下方式处理:
# 检查版本并条件获取指标 VERSION=$(redis-cli info server | grep redis_version | cut -d: -f2) if [[ $VERSION =~ ^7 ]]; then # Redis 7.x特有指标 THREADS=$(redis-cli info server | grep io_threads_active | cut -d: -f2) else # 旧版本处理 THREADS=1 fi8. 第三方工具推荐
- RedisInsight:官方可视化工具,提供INFO数据的图形化展示
- redis-stat:命令行监控工具,实时显示关键指标
- Prometheus Redis Exporter:将Redis指标导出为Prometheus格式
- Grafana Redis Dashboard:基于INFO数据的可视化面板
安装RedisInsight的简单方法:
docker run -d --name redisinsight -p 8001:8001 redislabs/redisinsight:latest9. 生产环境实战案例
9.1 内存泄漏排查
现象:Redis内存使用持续增长,但键数量没有明显增加
排查过程:
- 检查
INFO memory发现used_memory_rss增长快于used_memory - 观察
mem_fragmentation_ratio持续高于1.7 - 使用
MEMORY MALLOC-STATS查看内存分配详情 - 发现大量小对象分配导致内存碎片
解决方案:
- 升级到Redis 4.0+启用主动碎片整理
config set activedefrag yes - 调整
jemalloc参数减少碎片 - 优化客户端代码,减少小对象存储
9.2 性能抖动分析
现象:Redis偶尔出现响应延迟
排查过程:
- 检查
INFO commandstats发现某些命令执行时间异常 - 分析
INFO persistence发现AOF重写期间出现延迟 - 检查
INFO cpu发现sys CPU使用率偏高 - 最终定位到磁盘IO瓶颈
解决方案:
- 将AOF文件放在单独的高性能磁盘上
- 调整AOF重写触发条件
- 升级服务器使用SSD存储
10. 总结与进阶建议
掌握INFO命令的完整解读是Redis运维的基础技能,但真正的专业级应用还需要:
- 结合
SLOWLOG分析性能瓶颈 - 使用
MONITOR命令实时观察请求模式(谨慎使用,影响性能) - 定期分析
INFO commandstats识别热点命令 - 建立完整的监控体系,包括:
- 基础资源监控(CPU、内存、网络)
- Redis内部指标监控
- 业务层面监控(如缓存命中率)
最后分享一个实用技巧:在分析生产环境问题时,可以先用redis-cli --stat获取实时统计信息,快速判断系统负载情况。这个命令实际上是基于INFO命令的持续输出,但提供了更直观的交互式界面。