外观
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 进程 IDuptime:服务器运行时间(秒)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: 可以通过以下步骤计算命中率:
- 使用
stats命令获取get_hits和get_misses值 - 计算总请求数:
total_get = get_hits + get_misses - 计算命中率:
hit_rate = (get_hits / total_get) * 100%
或者使用监控工具自动计算和展示命中率。
Q2: 如何监控 Memcached 的内存使用情况?
A2: 可以通过以下方式监控内存使用:
- 使用
stats命令获取bytes和limit_maxbytes值 - 计算内存使用率:
memory_usage = (bytes / limit_maxbytes) * 100% - 通过监控系统设置内存使用率告警
- 结合
stats slabs命令分析各个 slab 的内存使用情况
Q3: 如何查看 Memcached 中的所有键?
A3: 可以使用以下方法:
- 使用
stats items获取所有 slab 编号 - 对每个 slab 使用
stats cachedump {slab_id} 0获取该 slab 中的所有键 - 注意:此方法仅用于调试,生产环境中谨慎使用,可能影响性能
- 建议在测试环境中使用,或通过客户端日志记录键名
Q4: 如何识别 Memcached 的性能瓶颈?
A4: 可以通过以下统计指标识别性能瓶颈:
- 高延迟:检查网络连接和服务器负载
- 低命中率:优化缓存策略和键设计
- 高驱逐率:增加内存或优化缓存过期策略
- 高连接数:调整最大连接数或使用连接池
- CPU 使用率高:调整线程数或优化查询
Q5: 如何使用统计命令调试缓存问题?
A5: 可以使用以下步骤调试缓存问题:
- 检查命中率,确认是否存在缓存穿透或缓存雪崩
- 查看驱逐情况,确认是否内存不足
- 检查连接数,确认是否存在连接泄漏
- 使用
stats cachedump查看具体的键和过期时间 - 结合
stats slabs分析 slab 使用情况 - 开启
stats detail获取详细的键级统计信息(仅调试使用)
Q6: 统计命令会影响 Memcached 的性能吗?
A6: 是的,统计命令会消耗服务器资源,尤其是以下命令:
stats cachedump:遍历 slab 中的所有 item,可能导致性能下降stats detail on:开启详细统计会增加内存消耗和 CPU 使用率stats reset:重置统计信息,可能影响监控数据
建议在生产环境中谨慎使用这些命令,优先通过监控系统采集统计信息。
