ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Redis INFO命令详解:核心指标与生产环境实战

Redis INFO命令详解:核心指标与生产环境实战

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:

  1. 快速健康检查:INFO memory+INFO stats
  2. 连接数问题:INFO clients+INFO stats
  3. 持久化问题:INFO persistence
  4. 主从同步延迟:INFO replication
  5. 命令热点分析: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

内存相关的重要指标:

  1. used_memory vs used_memory_rss:

    • used_memory:Redis分配器申请的内存总量
    • used_memory_rss:操作系统看到的内存占用
    • 两者比值(mem_fragmentation_ratio)大于1.5时可能存在内存碎片
  2. 内存使用趋势:

    # 计算内存增长速率 redis-cli --latency-history -i 60 \ | awk '/used_memory:/{print $2}' \ | paste -sd- \ | bc
  3. 内存淘汰策略:

    • 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)

连接数突增的常见原因:

  1. 客户端连接池配置不当(未设置最大连接数)
  2. 客户端未正确释放连接
  3. 遭受连接型攻击

检查连接来源的命令:

redis-cli client list | awk '{print $2}' | cut -d= -f2 | sort | uniq -c | sort -nr

3.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

关键状态解读:

  1. RDB相关:

    • rdb_bgsave_in_progress:是否正在执行BGSAVE
    • rdb_last_bgsave_status:上次BGSAVE状态(ok/err)
    • rdb_last_save_time:上次成功保存的Unix时间戳
  2. 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

主从复制关键指标:

  1. 角色识别:

    • role:master或role:slave
    • 从节点还会显示master_host和master_port
  2. 复制延迟:

    • offset差值反映主从数据差异
    • lag表示从节点最后一次ping的秒数
  3. 复制积压缓冲区:

    • 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 commandstats

4.2 内存优化分析

通过INFO memory和INFO keyspace可以分析内存使用模式:

# 获取各数据库键数量 redis-cli info keyspace # 获取大键列表 redis-cli --bigkeys # 获取内存分析报告 redis-cli --memkeys

4.3 监控集成方案

将INFO命令集成到监控系统中的常用方法:

  1. Telegraf采集:

    [[inputs.redis]] servers = ["tcp://localhost:6379"] password = "yourpassword"
  2. Prometheus监控:

    - job_name: 'redis' static_configs: - targets: ['localhost:9121'] metrics_path: /scrape params: target: ['redis://localhost:6379']
  3. 自定义采集脚本:

    #!/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'

排查步骤:

  1. 检查INFO memory中的used_memory和maxmemory
  2. 确认maxmemory_policy设置
  3. 分析INFO keyspace中的键数量分布
  4. 使用redis-cli --bigkeys找出大键

5.2 连接数耗尽

现象:max number of clients reached

解决方案:

  1. 临时增加连接数限制:
    redis-cli config set maxclients 20000
  2. 检查INFO clients中的连接来源:
    redis-cli client list | awk '{print $2}' | cut -d= -f2 | sort | uniq -c
  3. 优化客户端连接池配置

5.3 主从同步延迟

现象:从节点数据落后主节点

诊断方法:

  1. 主节点执行:
    redis-cli info replication | grep master_repl_offset
  2. 从节点执行:
    redis-cli info replication | grep slave_repl_offset
  3. 计算偏移量差值

优化建议:

  1. 增大repl-backlog-size
  2. 提升从节点性能
  3. 考虑使用更快的网络连接

5.4 AOF写入阻塞

现象:Redis响应变慢,aof_delayed_fsync增加

解决方案:

  1. 检查磁盘IO性能:
    iostat -x 1
  2. 调整AOF策略:
    # 将everysec改为no(牺牲部分持久性换取性能) redis-cli config set appendfsync no
  3. 升级硬件或使用更快的存储设备

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.txt

6.2 关键指标监控告警

建议对以下指标设置告警阈值:

指标名称警告阈值严重阈值检查命令
内存使用率70%90%used_memory/maxmemory
内存碎片率1.31.8mem_fragmentation_ratio
连接数使用率70%90%connected_clients/maxclients
持久化最后一次成功状态-!=okrdb_last_bgsave_status
主从复制延迟(字节)10MB100MBmaster_repl_offset-slave_repl_offset

6.3 性能优化建议

  1. 内存优化:

    • 使用Hash类型代替多个String键
    • 启用压缩选项(list-max-ziplist-entries等)
    • 定期执行MEMORY PURGE(使用jemalloc时)
  2. 持久化调优:

    • 对于大内存实例,增加rdb-save-incremental-fsync
    • 调整AOF重写触发条件(auto-aof-rewrite-percentage/min-size)
  3. 网络优化:

    • 适当增加tcp-backlog
    • 考虑启用repl-disable-tcp-nodelay(高延迟网络)

6.4 安全加固建议

  1. 定期检查INFO clients中的异常连接
  2. 监控INFO commandstats中的命令调用频率
  3. 限制危险命令的使用:
    # 重命名危险命令 rename-command FLUSHDB "FLUSHDB_MUST_AUTH" rename-command CONFIG "CONFIG_MUST_AUTH"
  4. 检查INFO persistence确保持久化正常工作

7. 版本差异与兼容性

不同Redis版本的INFO输出有所差异,以下是主要变化:

版本新增字段移除字段
6.0io_threads_active, total_system_memory-
6.2mem_allocator, active_defrag_running-
7.0aof_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 fi

8. 第三方工具推荐

  1. RedisInsight:官方可视化工具,提供INFO数据的图形化展示
  2. redis-stat:命令行监控工具,实时显示关键指标
  3. Prometheus Redis Exporter:将Redis指标导出为Prometheus格式
  4. Grafana Redis Dashboard:基于INFO数据的可视化面板

安装RedisInsight的简单方法:

docker run -d --name redisinsight -p 8001:8001 redislabs/redisinsight:latest

9. 生产环境实战案例

9.1 内存泄漏排查

现象:Redis内存使用持续增长,但键数量没有明显增加

排查过程:

  1. 检查INFO memory发现used_memory_rss增长快于used_memory
  2. 观察mem_fragmentation_ratio持续高于1.7
  3. 使用MEMORY MALLOC-STATS查看内存分配详情
  4. 发现大量小对象分配导致内存碎片

解决方案:

  1. 升级到Redis 4.0+启用主动碎片整理
    config set activedefrag yes
  2. 调整jemalloc参数减少碎片
  3. 优化客户端代码,减少小对象存储

9.2 性能抖动分析

现象:Redis偶尔出现响应延迟

排查过程:

  1. 检查INFO commandstats发现某些命令执行时间异常
  2. 分析INFO persistence发现AOF重写期间出现延迟
  3. 检查INFO cpu发现sys CPU使用率偏高
  4. 最终定位到磁盘IO瓶颈

解决方案:

  1. 将AOF文件放在单独的高性能磁盘上
  2. 调整AOF重写触发条件
  3. 升级服务器使用SSD存储

10. 总结与进阶建议

掌握INFO命令的完整解读是Redis运维的基础技能,但真正的专业级应用还需要:

  1. 结合SLOWLOG分析性能瓶颈
  2. 使用MONITOR命令实时观察请求模式(谨慎使用,影响性能)
  3. 定期分析INFO commandstats识别热点命令
  4. 建立完整的监控体系,包括:
    • 基础资源监控(CPU、内存、网络)
    • Redis内部指标监控
    • 业务层面监控(如缓存命中率)

最后分享一个实用技巧:在分析生产环境问题时,可以先用redis-cli --stat获取实时统计信息,快速判断系统负载情况。这个命令实际上是基于INFO命令的持续输出,但提供了更直观的交互式界面。

返回列表