Skip to content

Memcached 统计命令

基础统计命令

1. stats

  • 命令格式stats

  • 功能:获取 Memcached 服务器的基本统计信息

  • 输出示例

    STAT pid 12345
    STAT uptime 3600
    STAT time 1620000000
    STAT version 1.6.12
    STAT libevent 2.1.12-stable
    STAT pointer_size 64
    STAT rusage_user 0.100000
    STAT rusage_system 0.200000
    STAT max_connections 1024
    STAT curr_connections 50
    STAT total_connections 1000
    STAT rejected_connections 0
    STAT connection_structures 55
    STAT reserved_fds 20
    STAT cmd_get 10000
    STAT cmd_set 5000
    STAT cmd_flush 0
    STAT cmd_touch 0
    STAT get_hits 8000
    STAT get_misses 2000
    STAT delete_misses 100
    STAT delete_hits 400
    STAT incr_misses 0
    STAT incr_hits 100
    STAT decr_misses 0
    STAT decr_hits 50
    STAT cas_misses 0
    STAT cas_hits 0
    STAT cas_badval 0
    STAT touch_hits 0
    STAT touch_misses 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 1048576
    STAT bytes_written 2097152
    STAT limit_maxbytes 67108864
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT threads 4
    STAT conn_yields 0
    STAT hash_power_level 16
    STAT hash_bytes 524288
    STAT hash_is_expanding 0
    STAT slab_reassign_rescues 0
    STAT slab_reassign_chunk_rescues 0
    STAT slab_reassign_evictions_nomem 0
    STAT slab_reassign_inline_reclaim 0
    STAT slab_reassign_busy_items 0
    STAT slab_reassign_busy_deletes 0
    STAT slab_reassign_running 0
    STAT slabs_moved 0
    STAT lru_crawler_running 0
    STAT lru_crawler_starts 0
    STAT lru_maintainer_juggles 0
    STAT malloc_fails 0
    STAT log_worker_dropped 0
    STAT log_worker_written 0
    STAT log_watcher_skipped 0
    STAT log_watcher_sent 0
    STAT bytes 33554432
    STAT curr_items 4000
    STAT total_items 5000
    STAT slab_global_page_pool 0
    STAT expired_unfetched 100
    STAT evicted_unfetched 0
    STAT evicted_active 0
    STAT evictions 0
    STAT reclaimed 100
    STAT crawler_reclaimed 0
    STAT crawler_items_checked 0
    STAT lrutail_reflocked 0
    STAT moves_to_cold 0
    STAT moves_to_warm 0
    STAT moves_within_lru 0
    STAT direct_reclaims 0
    STAT lru_bumps_dropped 0
    END
  • 关键指标解释

    • pid:Memcached 进程 ID
    • uptime:服务器运行时间(秒)
    • version:Memcached 版本
    • curr_connections:当前连接数
    • total_connections:总连接数
    • rejected_connections:拒绝的连接数(通常因为连接数达到上限)
    • cmd_get:GET 命令总数
    • cmd_set:SET 命令总数
    • get_hits:GET 命中数
    • get_misses:GET 未命中数
    • bytes:当前存储的字节数
    • limit_maxbytes:最大内存限制(字节)
    • curr_items:当前存储的 item 数量
    • total_items:总存储的 item 数量
    • evictions:因内存不足而驱逐的 item 数量

2. stats items

  • 命令格式stats items

  • 功能:获取每个 slab 中 item 的统计信息

  • 输出示例

    STAT items:1:number 1000
    STAT items:1:age 300
    STAT items:1:evicted 0
    STAT items:1:evicted_nonzero 0
    STAT items:1:evicted_time 0
    STAT items:1:outofmemory 0
    STAT items:1:tailrepairs 0
    STAT items:1:reclaimed 50
    STAT items:1:expired_unfetched 20
    STAT items:1:evicted_unfetched 0
    STAT items:1:evicted_active 0
    STAT items:1:crawler_reclaimed 0
    STAT items:1:crawler_items_checked 0
    STAT items:1:lrutail_reflocked 0
    STAT items:1:moves_to_cold 0
    STAT items:1:moves_to_warm 0
    STAT items:1:moves_within_lru 0
    STAT items:1:direct_reclaims 0
    STAT items:1:hits_to_hot 0
    STAT items:1:hits_to_warm 0
    STAT items:1:hits_to_cold 0
    STAT items:1:hits_to_temp 0
    END
  • 关键指标解释

    • items:{slab_id}:number:该 slab 中的 item 数量
    • items:{slab_id}:age:该 slab 中最老 item 的存活时间(秒)
    • items:{slab_id}:evicted:该 slab 中驱逐的 item 数量
    • items:{slab_id}:expired_unfetched:该 slab 中过期但未被获取的 item 数量
    • items:{slab_id}:reclaimed:该 slab 中回收的 item 数量

3. stats slabs

  • 命令格式stats slabs

  • 功能:获取每个 slab 的统计信息,包括内存使用情况

  • 输出示例

    STAT 1:chunk_size 96
    STAT 1:chunks_per_page 10922
    STAT 1:total_pages 1
    STAT 1:total_chunks 10922
    STAT 1:used_chunks 1000
    STAT 1:free_chunks 9922
    STAT 1:free_chunks_end 0
    STAT 1:mem_requested 80000
    STAT 1:get_hits 7000
    STAT 1:cmd_set 4000
    STAT 1:delete_hits 300
    STAT 1:incr_hits 80
    STAT 1:decr_hits 40
    STAT 1:cas_hits 0
    STAT 1:cas_badval 0
    STAT 1:touch_hits 0
    STAT 1:used_bytes 96000
    STAT 1:requested_bytes 80000
    STAT 1:expired_unfetched 15
    STAT 1:evicted_unfetched 0
    STAT 1:evicted_active 0
    STAT 1:crawler_reclaimed 0
    STAT 1:crawler_items_checked 0
    STAT 1:lrutail_reflocked 0
    STAT 1:moves_to_cold 0
    STAT 1:moves_to_warm 0
    STAT 1:moves_within_lru 0
    STAT 1:direct_reclaims 0
    STAT active_slabs 1
    STAT total_malloced 1048576
    END
  • 关键指标解释

    • {slab_id}:chunk_size:该 slab 中每个 chunk 的大小(字节)
    • {slab_id}:total_pages:该 slab 分配的页数
    • {slab_id}:used_chunks:该 slab 中已使用的 chunk 数量
    • {slab_id}:free_chunks:该 slab 中空闲的 chunk 数量
    • {slab_id}:mem_requested:该 slab 中请求的内存大小(字节)
    • {slab_id}:used_bytes:该 slab 中已使用的内存大小(字节)
    • active_slabs:活跃的 slab 数量
    • total_malloced:总共分配的内存大小(字节)

高级统计命令

1. stats sizes

  • 命令格式stats sizes

  • 功能:获取不同大小 item 的分布情况

  • 输出示例

    STAT 96 1000
    STAT 192 500
    STAT 384 200
    END
  • 解释

    • 第一列是 item 的大小范围(字节)
    • 第二列是该大小范围内的 item 数量
    • 用于分析缓存数据的大小分布,优化 slab 配置

2. stats reset

  • 命令格式stats reset
  • 功能:重置统计信息(不包括 uptime、version 等基本信息)
  • 注意事项
    • 仅重置当前连接看到的统计信息
    • 其他连接的统计信息不受影响
    • 用于测试和调试场景

3. stats cachedump

  • 命令格式stats cachedump {slab_id} {limit}

  • 功能:列出指定 slab 中的 item 键名和过期时间

  • 参数

    • slab_id:slab 编号
    • limit:返回的最大 item 数量,0 表示返回所有
  • 输出示例

    ITEM key1 [8 b; 1620003600 s]
    ITEM key2 [16 b; 1620003600 s]
    END
  • 解释

    • key1:item 键名
    • 8 b:item 大小(字节)
    • 1620003600 s:过期时间戳
    • 仅用于调试,生产环境中谨慎使用,可能影响性能

4. stats detail

  • 命令格式stats detail {on|off|dump}

  • 功能:控制和查看详细统计信息

  • 参数

    • on:开启详细统计
    • off:关闭详细统计
    • dump:查看详细统计信息
  • 输出示例

    DETAIL on 1
    ITEM key1 [10 b; 1620003600 s]
    get_hits 100 get_misses 10 cmd_set 50
    ITEM key2 [20 b; 1620003600 s]
    get_hits 200 get_misses 20 cmd_set 100
    END
  • 注意事项

    • 开启详细统计会增加内存消耗和 CPU 使用率
    • 仅用于调试和性能分析
    • 生产环境中建议关闭

5. stats threads

  • 命令格式stats threads

  • 功能:查看线程相关统计信息

  • 输出示例

    STAT thread_id:1:sycalls 1000
    STAT thread_id:1:conn_yields 0
    STAT thread_id:2:sycalls 1200
    STAT thread_id:2:conn_yields 0
    STAT thread_id:3:sycalls 900
    STAT thread_id:3:conn_yields 0
    STAT thread_id:4:sycalls 1100
    STAT thread_id:4:conn_yields 0
    END
  • 关键指标解释

    • thread_id:{id}:sycalls:线程系统调用次数
    • thread_id:{id}:conn_yields:线程连接让出次数
    • 用于分析线程负载分布和性能

监控和应用场景

1. 性能监控

  • 命中率计算
    命中率 = get_hits / (get_hits + get_misses) * 100%
  • 正常范围:一般来说,命中率应保持在 80% 以上
  • 应用场景
    • 实时监控缓存性能
    • 分析缓存使用效率
    • 调整缓存策略和容量

2. 内存使用监控

  • 内存使用率计算
    内存使用率 = bytes / limit_maxbytes * 100%
  • 正常范围:建议保持在 70-80% 之间,预留空间给新数据
  • 应用场景
    • 监控内存使用情况
    • 预测内存不足风险
    • 调整内存分配大小

3. 连接监控

  • 关键指标
    • curr_connections:当前连接数
    • total_connections:总连接数
    • rejected_connections:拒绝的连接数
  • 应用场景
    • 监控连接使用情况
    • 检测连接泄漏
    • 调整最大连接数配置

4. 驱逐监控

  • 关键指标
    • evictions:因内存不足而驱逐的 item 数量
    • evicted_unfetched:驱逐的未获取 item 数量
    • expired_unfetched:过期的未获取 item 数量
  • 应用场景
    • 监控缓存驱逐情况
    • 分析驱逐原因
    • 优化缓存过期策略

5. 线程监控

  • 关键指标
    • threads:线程数量
    • thread_id:{id}:sycalls:线程系统调用次数
    • conn_yields:连接让出次数
  • 应用场景
    • 监控线程负载分布
    • 分析线程性能瓶颈
    • 调整线程数量配置

统计命令的自动化使用

1. 使用脚本定期采集统计信息

  • Shell 脚本示例
    bash
    #!/bin/bash
    
    HOST="localhost"
    PORT="11211"
    TIMESTAMP=$(date +%s)
    
    # 获取基础统计信息
    STATS=$(echo -e "stats\nquit" | nc $HOST $PORT)
    
    # 提取关键指标
    GET_HITS=$(echo "$STATS" | grep "STAT get_hits" | awk '{print $3}')
    GET_MISSES=$(echo "$STATS" | grep "STAT get_misses" | awk '{print $3}')
    BYTES=$(echo "$STATS" | grep "STAT bytes" | awk '{print $3}')
    LIMIT_MAXBYTES=$(echo "$STATS" | grep "STAT limit_maxbytes" | awk '{print $3}')
    CURR_CONNECTIONS=$(echo "$STATS" | grep "STAT curr_connections" | awk '{print $3}')
    EVICTIONS=$(echo "$STATS" | grep "STAT evictions" | awk '{print $3}')
    
    # 计算命中率和内存使用率
    TOTAL_GET=$((GET_HITS + GET_MISSES))
    HIT_RATE=0
    if [ $TOTAL_GET -gt 0 ]; then
      HIT_RATE=$(echo "scale=2; $GET_HITS / $TOTAL_GET * 100" | bc)
    fi
    
    MEMORY_USAGE=0
    if [ $LIMIT_MAXBYTES -gt 0 ]; then
      MEMORY_USAGE=$(echo "scale=2; $BYTES / $LIMIT_MAXBYTES * 100" | bc)
    fi
    
    # 输出到日志或监控系统
    echo "$TIMESTAMP $GET_HITS $GET_MISSES $HIT_RATE $BYTES $LIMIT_MAXBYTES $MEMORY_USAGE $CURR_CONNECTIONS $EVICTIONS" >> memcached_stats.log

2. 集成到监控系统

  • Prometheus + Grafana

    • 使用 Prometheus 监控 Memcached 指标
    • 通过 Grafana 可视化监控数据
    • 设置告警规则
  • Nagios/Zabbix

    • 使用插件监控 Memcached 状态
    • 设置监控项和告警阈值
    • 生成监控报告

3. 使用第三方监控工具

  • Memcached Exporter:Prometheus 官方提供的 Memcached 指标导出器
  • Telegraf:支持采集 Memcached 指标并发送到多种监控系统
  • Datadog:提供 Memcached 监控集成

最佳实践

1. 合理使用统计命令

  • 避免频繁调用:统计命令会消耗服务器资源,建议定期(如每分钟)调用
  • 生产环境谨慎使用:某些命令(如 stats cachedump、stats detail)会影响性能
  • 优先使用自动化工具:通过监控系统自动采集统计信息,减少手动干预

2. 建立基线和告警

  • 建立性能基线:记录正常状态下的统计指标,作为参考基准
  • 设置合理的告警阈值
    • 命中率低于 80%
    • 内存使用率高于 90%
    • 拒绝连接数持续增加
    • 驱逐率突然升高
  • 多维度监控:结合多个指标进行分析,避免单一指标误判

3. 定期分析和优化

  • 定期分析统计数据:识别性能瓶颈和优化机会
  • 调整配置参数:根据统计数据调整内存大小、线程数、连接数等参数
  • 优化缓存策略:根据命中率和驱逐情况调整缓存过期时间和键设计
  • 容量规划:根据内存使用趋势进行容量规划和扩展

4. 结合日志分析

  • 关联统计信息和日志:将统计信息与访问日志结合分析
  • 定位问题根源:通过统计信息发现异常,结合日志定位具体问题
  • 分析用户行为:通过统计信息分析用户访问模式和缓存使用情况

常见问题(FAQ)

Q1: 如何获取 Memcached 的命中率?

A1: 可以通过以下步骤计算命中率:

  1. 使用 stats 命令获取 get_hitsget_misses
  2. 计算总请求数:total_get = get_hits + get_misses
  3. 计算命中率:hit_rate = (get_hits / total_get) * 100%

或者使用监控工具自动计算和展示命中率。

Q2: 如何监控 Memcached 的内存使用情况?

A2: 可以通过以下方式监控内存使用:

  1. 使用 stats 命令获取 byteslimit_maxbytes
  2. 计算内存使用率:memory_usage = (bytes / limit_maxbytes) * 100%
  3. 通过监控系统设置内存使用率告警
  4. 结合 stats slabs 命令分析各个 slab 的内存使用情况

Q3: 如何查看 Memcached 中的所有键?

A3: 可以使用以下方法:

  1. 使用 stats items 获取所有 slab 编号
  2. 对每个 slab 使用 stats cachedump {slab_id} 0 获取该 slab 中的所有键
  3. 注意:此方法仅用于调试,生产环境中谨慎使用,可能影响性能
  4. 建议在测试环境中使用,或通过客户端日志记录键名

Q4: 如何识别 Memcached 的性能瓶颈?

A4: 可以通过以下统计指标识别性能瓶颈:

  1. 高延迟:检查网络连接和服务器负载
  2. 低命中率:优化缓存策略和键设计
  3. 高驱逐率:增加内存或优化缓存过期策略
  4. 高连接数:调整最大连接数或使用连接池
  5. CPU 使用率高:调整线程数或优化查询

Q5: 如何使用统计命令调试缓存问题?

A5: 可以使用以下步骤调试缓存问题:

  1. 检查命中率,确认是否存在缓存穿透或缓存雪崩
  2. 查看驱逐情况,确认是否内存不足
  3. 检查连接数,确认是否存在连接泄漏
  4. 使用 stats cachedump 查看具体的键和过期时间
  5. 结合 stats slabs 分析 slab 使用情况
  6. 开启 stats detail 获取详细的键级统计信息(仅调试使用)

Q6: 统计命令会影响 Memcached 的性能吗?

A6: 是的,统计命令会消耗服务器资源,尤其是以下命令:

  • stats cachedump:遍历 slab 中的所有 item,可能导致性能下降
  • stats detail on:开启详细统计会增加内存消耗和 CPU 使用率
  • stats reset:重置统计信息,可能影响监控数据

建议在生产环境中谨慎使用这些命令,优先通过监控系统采集统计信息。