Skip to content

Memcached调试命令

基础调试命令

stats命令

功能描述:查看Memcached服务器的基本统计信息,是最常用的调试命令之一。

使用方法

bash
# 通过telnet使用
telnet <host> <port>
stats

# 通过memcached-tool使用
memcached-tool <host>:<port> stats

输出示例

STAT pid 12345
STAT uptime 3600
STAT time 1633046400
STAT version 1.6.12
STAT libevent 2.1.12-stable
STAT pointer_size 64
STAT rusage_user 0.123456
STAT rusage_system 0.654321
STAT max_connections 1024
STAT curr_connections 10
STAT total_connections 100
STAT rejected_connections 0
STAT connection_structures 12
STAT reserved_fds 20
STAT cmd_get 1000
STAT cmd_set 500
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 800
STAT get_misses 200
STAT delete_misses 10
STAT delete_hits 40
STAT incr_misses 0
STAT incr_hits 50
STAT decr_misses 0
STAT decr_hits 30
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 100000
STAT bytes_written 200000
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 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 10
STAT lru_maintainer_juggles 100
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 10000
STAT curr_items 50
STAT total_items 500
STAT slab_global_page_pool 0
STAT expired_unfetched 100
STAT evicted_unfetched 50
STAT evicted_active 0
STAT evictions 150
STAT reclaimed 200
STAT crawler_reclaimed 0
STAT crawler_items_checked 1000
STAT lrutail_reflocked 0
STAT moves_to_cold 200
STAT moves_to_warm 100
STAT moves_within_lru 50
STAT direct_reclaims 0
STAT lru_bumps_dropped 0
END

关键指标解析

  • uptime:服务器运行时间(秒)
  • version:Memcached版本
  • curr_connections:当前连接数
  • total_connections:总连接数
  • cmd_get/cmd_set:get/set命令执行次数
  • get_hits/get_misses:命中率统计
  • bytes:当前存储的数据大小(字节)
  • curr_items:当前存储的item数量
  • total_items:总存储的item数量
  • evictions:被驱逐的item数量
  • threads:工作线程数

stats settings命令

功能描述:查看Memcached服务器的配置设置。

使用方法

bash
telnet <host> <port>
stats settings

# 通过memcached-tool使用
memcached-tool <host>:<port> stats settings

输出示例

STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter 0.0.0.0
STAT verbosity 0
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT shutdown_command no
STAT auth_enabled_sasl no
STAT item_size_max 1048576
STAT maxconns_fast no
STAT hashpower_init 0
STAT slab_reassign no
STAT slab_automove 0
STAT slab_autotune no
STAT hot_lru_pct 32
STAT warm_lru_pct 32
STAT hot_max_factor 0.25
STAT warm_max_factor 2
STAT temp_lru no
STAT temporary_ttl 604800
STAT idle_timeout 0
STAT watcher_logbuf_size 262144
STAT worker_logbuf_size 65536
STAT read_buf_mem_limit 0
STAT track_sizes no
STAT inline_ascii_response no
STAT ext_item_size 512
STAT ext_item_age 4294967295
STAT ext_low_ttl 0
STAT ext_high_ttl 0
STAT ext_recache_rate 2000
STAT ext_wbuf_size 4194304
STAT ext_compact_ttl 0
STAT ext_drop_unread no
STAT hash_algorithm murmur3
STAT lru_crawler no
STAT lru_crawler_sleep 100
STAT lru_crawler_tocrawl 0
STAT tail_repair_time 0
STAT flush_enabled yes
STAT dump_enabled yes
STAT hashpower 16
STAT lru_maintainer_thread yes
STAT lru_segmented yes
STAT hot_lru_size 0
STAT warm_lru_size 0
STAT cold_lru_size 0
STAT hot_max_age 0
STAT warm_max_age 0
STAT cold_max_age 0
STAT wbuf_size 16384
STAT wbuf_max_size 2097152
STAT wbuf_max_num 4
STAT lru_segmented_stripes 1
STAT slab_automove_ratio 0.80
STAT slab_automove_window 30
STAT slab_chunk_max 1048576
END

stats items命令

功能描述:查看Memcached中各个slab类别的item统计信息。

使用方法

bash
telnet <host> <port>
stats items

# 通过memcached-tool使用
memcached-tool <host>:<port> stats items

输出示例

STAT items:1:number 10
STAT items:1:age 3600
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 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 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
STAT items:2:number 20
STAT items:2:age 1800
...
END

stats slabs命令

功能描述:查看Memcached中各个slab的使用情况,包括内存分配、使用和碎片情况。

使用方法

bash
telnet <host> <port>
stats slabs

# 通过memcached-tool使用
memcached-tool <host>:<port> stats slabs

输出示例

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 10
STAT 1:free_chunks 10912
STAT 1:free_chunks_end 0
STAT 1:mem_requested 760
STAT 1:get_hits 0
STAT 1:cmd_set 0
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT 1:used_bytes 960
STAT 1:requested_bytes 760
STAT 2:chunk_size 120
STAT 2:chunks_per_page 8738
STAT 2:total_pages 1
STAT 2:total_chunks 8738
STAT 2:used_chunks 20
STAT 2:free_chunks 8718
STAT 2:free_chunks_end 0
STAT 2:mem_requested 1920
...
STAT active_slabs 3
STAT total_malloced 3145728
END

关键指标解析

  • chunk_size:每个chunk的大小(字节)
  • chunks_per_page:每页包含的chunk数量
  • total_pages:总页数
  • used_chunks:已使用的chunk数量
  • free_chunks:空闲的chunk数量
  • mem_requested:请求的内存大小
  • used_bytes:已使用的字节数

stats sizes命令

功能描述:查看Memcached中不同大小item的分布情况。

使用方法

bash
telnet <host> <port>
stats sizes

# 通过memcached-tool使用
memcached-tool <host>:<port> stats sizes

输出示例

STAT 96 10
STAT 120 20
STAT 152 15
END

高级调试命令

lru_crawler命令族

功能描述:控制和查询LRU crawler的状态,用于主动清理过期item。

使用方法

bash
# 启动LRU crawler
telnet <host> <port>
lru_crawler crawl all 1000

# 查看LRU crawler状态
telnet <host> <port>
stats lru_crawler

# 查看LRU crawler统计
telnet <host> <port>
stats lru_crawler_stats

slab命令族

功能描述:控制和查询slab分配器的状态。

使用方法

bash
# 启用slab自动重新分配
telnet <host> <port>
slab reassign all

# 查看slab重新分配状态
telnet <host> <port>
stats slab_reassign

# 启用slab自动移动
telnet <host> <port>
slab automove 1

display命令

功能描述:通过memcached-tool查看slab的详细使用情况,包括内存分配、使用率和碎片情况。

使用方法

bash
memcached-tool <host>:<port> display

输出示例

  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      96B       100s       1       5      no        0        0    0
  2     120B        80s       1      10      no        0        0    0
  3     152B        60s       1      15      no        0        0    0

dump命令

功能描述:导出Memcached中的所有键值对数据。

使用方法

bash
# 导出到终端
memcached-tool <host>:<port> dump

# 导出到文件
memcached-tool <host>:<port> dump > memcached_dump.txt

输出示例

add key1 0 3600 5
value1
add key2 0 3600 5
value2

性能调试命令

memstat命令

功能描述:libmemcached-tools提供的工具,用于查看Memcached服务器的详细状态信息。

使用方法

bash
# 安装libmemcached-tools
sudo apt-get install libmemcached-tools

# 使用memstat
memstat --servers=<host>:<port>

输出示例

Server: 127.0.0.1 (11211)
         pid: 12345
     uptime: 3600
     version: 1.6.12
     libevent: 2.1.12-stable
   pointer_size: 64
   rusage_user: 0.123456
 rusage_system: 0.654321
       curr_connections: 10
   total_connections: 100
rejected_connections: 0
       connection_structures: 12
         reserved_fds: 20
              cmd_get: 1000
              cmd_set: 500
           cmd_flush: 0
           cmd_touch: 0
              get_hits: 800
            get_misses: 200
          delete_misses: 10
            delete_hits: 40
             incr_misses: 0
               incr_hits: 50
             decr_misses: 0
               decr_hits: 30
              cas_misses: 0
                cas_hits: 0
              cas_badval: 0
             touch_hits: 0
           touch_misses: 0
          auth_cmds: 0
        auth_errors: 0
              bytes_read: 100000
           bytes_written: 200000
      limit_maxbytes: 67108864
     accepting_conns: 1
    listen_disabled_num: 0
  time_in_listen_disabled_us: 0
              threads: 4
          conn_yields: 0
       hash_power_level: 16
            hash_bytes: 524288
         hash_is_expanding: 0
       slab_reassign_rescues: 0
slab_reassign_chunk_rescues: 0
slab_reassign_evictions_nomem: 0
slab_reassign_inline_reclaim: 0
slab_reassign_busy_items: 0
slab_reassign_busy_deletes: 0
slab_reassign_running: 0
              slabs_moved: 0
       lru_crawler_running: 0
      lru_crawler_starts: 10
  lru_maintainer_juggles: 100
           malloc_fails: 0
      log_worker_dropped: 0
     log_worker_written: 0
     log_watcher_skipped: 0
       log_watcher_sent: 0
                  bytes: 10000
             curr_items: 50
            total_items: 500
     slab_global_page_pool: 0
      expired_unfetched: 100
       evicted_unfetched: 50
           evicted_active: 0
                evictions: 150
                reclaimed: 200
          crawler_reclaimed: 0
       crawler_items_checked: 1000
          lrutail_reflocked: 0
            moves_to_cold: 200
            moves_to_warm: 100
         moves_within_lru: 50
             direct_reclaims: 0
          lru_bumps_dropped: 0

memcached-top命令

功能描述:实时监控Memcached服务器的性能指标,类似于top命令。

使用方法

bash
# 安装memcached-top
gem install memcache-top

# 使用memcached-top
memcache-top --servers=<host>:<port>

输出示例

memcache-top v0.6       (default port: 11211, color: on, refresh: 3 seconds)

INSTANCE                USAGE   HIT %   CONN    TIME    EVICT/s READ/s  WRITE/s
127.0.0.1:11211         10.0%    80.0%      5    0.1ms        0     10k      5k

ITEM  SIZE   USED   USE%   REQUESTS  HIT%   EVS
1      96B      5    0.1%       100   90%    0
2     120B     10    0.1%       200   85%    0
3     152B     15    0.2%       300   75%    0

调试模式命令

详细日志模式

功能描述:通过启动Memcached时添加-v选项,可以启用不同级别的详细日志模式,用于调试。

使用方法

bash
# 基本日志模式:记录客户端命令
memcached -v

# 详细日志模式:记录客户端命令和响应
memcached -vv

# 最详细日志模式:记录所有客户端命令、响应和内部状态
memcached -vvv

输出示例(-vv模式):

<7 server listening
<7 new auto-negotiating client connection
7: Client using the binary protocol
<7 Read binary protocol data: 
<7    0x80 0x01 0x00 0x00 0x00 0x01 0x00 0x00
<7    0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
<7    0x00 0x00 0x00 0x00
<7 get key1
>7 Writing bin response: 
>7    0x81 0x01 0x00 0x00 0x00 0x01 0x00 0x00
>7    0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x00
>7    0x00 0x00 0x00 0x00
>7 value1

内存调试

功能描述:使用libmemcached的内存调试工具,查看Memcached的内存使用情况。

使用方法

bash
# 安装libmemcached-tools
sudo apt-get install libmemcached-tools

# 使用memstat查看内存使用情况
memstat --servers=<host>:<port> --items

故障排查命令

flush_all命令

功能描述:清空Memcached中的所有数据,用于故障排查或维护。

使用方法

bash
telnet <host> <port>
flush_all

# 带过期时间的清空(延迟清空)
flush_all 3600

输出示例

OK

version命令

功能描述:查看Memcached服务器的版本信息。

使用方法

bash
telnet <host> <port>
version

输出示例

VERSION 1.6.12

verbosity命令

功能描述:调整Memcached的日志级别。

使用方法

bash
telnet <host> <port>
verbosity 1

输出示例

OK

shutdown命令

功能描述:关闭Memcached服务器,用于维护或升级。

使用方法

bash
telnet <host> <port>
shutdown

输出示例

OK

调试命令最佳实践

1. 定期监控

  • 定期使用stats命令检查Memcached的基本状态
  • 使用memcached-top进行实时监控
  • 结合监控系统(如Prometheus+Grafana)进行长期监控

2. 故障排查流程

  1. 使用stats命令查看基本状态和命中率
  2. 使用stats items查看item分布
  3. 使用stats slabs查看内存使用情况
  4. 使用stats settings查看配置设置
  5. 启用详细日志模式-vv查看具体命令
  6. 使用memcached-tool display查看slab使用详情
  7. 使用dump命令导出数据进行分析

3. 性能优化

  • 根据stats slabs结果调整slab配置
  • 根据stats items结果优化缓存过期策略
  • 根据stats settings结果调整工作线程数和连接数
  • 根据stats结果优化内存配置

4. 安全注意事项

  • 限制调试命令的访问权限:只允许信任的IP访问
  • 避免在生产环境中使用flush_allshutdown命令
  • 定期检查stats中的rejected_connections指标
  • 监控stats中的auth_errors指标

常见调试场景

场景1:命中率低

问题:Memcached的get_hits / (get_hits + get_misses) 比率低于预期。

排查步骤

  1. 使用stats命令查看命中率
  2. 使用stats items查看item的过期情况
  3. 使用stats slabs查看内存使用情况
  4. 使用stats sizes查看item大小分布
  5. 分析应用程序的缓存使用模式

解决方案

  • 调整缓存过期时间
  • 优化缓存键设计
  • 增加Memcached内存容量
  • 实现缓存预热机制
  • 实施布隆过滤器防止缓存穿透

场景2:响应时间长

问题:Memcached的响应时间超过10ms。

排查步骤

  1. 检查服务器CPU使用率:topmpstat
  2. 检查服务器内存使用率:free -m
  3. 检查网络带宽:iftopnload
  4. 使用stats命令查看连接数和线程数
  5. 启用详细日志模式-vv查看慢查询

解决方案

  • 增加工作线程数
  • 优化网络配置
  • 增加服务器资源
  • 优化应用程序的缓存使用
  • 实现连接池优化

场景3:内存使用率高

问题:Memcached的内存使用率超过90%。

排查步骤

  1. 使用memcached-tool display查看slab使用情况
  2. 使用stats slabs查看内存分配
  3. 使用stats items查看item数量
  4. 使用dump命令分析缓存数据

解决方案

  • 增加Memcached内存容量
  • 优化缓存过期策略
  • 移除不必要的大对象
  • 实施LRU优化
  • 考虑分片部署

场景4:连接数高

问题:Memcached的curr_connections接近max_connections。

排查步骤

  1. 使用stats命令查看连接数
  2. 检查应用程序的连接池配置
  3. 查看rejected_connections指标
  4. 分析客户端连接模式

解决方案

  • 增加max_connections设置
  • 优化应用程序连接池
  • 实现连接复用
  • 考虑分片部署
  • 实施连接限流

调试工具比较

工具功能易用性扩展性适用场景
stats命令基本统计信息日常监控和调试
memcached-tool综合管理工具详细调试和分析
memcached-top实时监控实时性能监控
memstat详细状态查看深入调试
详细日志模式命令级调试命令级调试
dump命令数据导出数据分析

常见问题(FAQ)

Q1: 一致性哈希算法的虚拟节点数量如何确定?

A1: 虚拟节点数量的确定因素:

  • 物理节点数量:节点越少,虚拟节点数量应越多
  • 性能要求:虚拟节点数量越多,哈希环维护成本越高
  • 数据分布均匀性:虚拟节点数量越多,数据分布越均匀

推荐:每个物理节点设置100-200个虚拟节点。

Q2: 如何处理Memcached分片环境中的热点键?

A2: 热点键处理方法:

  1. 键拆分:将热点键拆分为多个子键,分散到不同实例
  2. 数据复制:将热点数据复制到多个实例
  3. 本地缓存:客户端本地缓存热点数据
  4. 限流:对热点键请求进行限流
  5. 预加载:提前加载热点数据到缓存

Q3: 代理分片和客户端分片哪个性能更好?

A3: 性能比较:

  • 客户端分片:性能更高,无中间层开销,延迟低
  • 代理分片:性能略低,增加了网络跳转,但客户端实现简单

选择建议:

  • 对性能要求极高的场景,选择客户端分片
  • 对管理便利性要求高的场景,选择代理分片

Q4: 如何实现Memcached分片环境的高可用性?

A4: 高可用性实现:

  1. 部署多个Memcached实例,避免单点故障
  2. 使用一致性哈希,单个实例故障影响最小
  3. 实现节点故障自动检测和恢复
  4. 部署跨可用区或跨区域的实例
  5. 定期备份数据,支持快速恢复

Q5: 如何扩展Memcached分片集群?

A5: 扩展步骤:

  1. 准备新的Memcached实例
  2. 将新实例添加到分片列表
  3. 等待数据自动迁移(基于一致性哈希)
  4. 监控新实例的负载和性能
  5. 调整其他实例的资源配置(可选)

Q6: 如何处理Memcached分片环境中的数据不一致问题?

A6: 数据不一致处理:

  1. 接受最终一致性,依赖数据过期机制
  2. 实现数据版本控制,解决冲突
  3. 定期同步数据,修复不一致
  4. 使用写扩散,将写操作发送到多个实例
  5. 实现读修复,读取时检测并修复不一致

Q7: 分片策略对Memcached的命中率有什么影响?

A7: 影响因素:

  • 数据分布均匀性:分布越均匀,整体命中率越高
  • 节点数量:适当增加节点数量可以提高命中率
  • 热点键处理:有效的热点键处理可以提高命中率
  • 分片算法:好的分片算法可以减少数据迁移,保持高命中率

最佳实践:

  • 选择合适的分片算法
  • 优化数据分布
  • 有效处理热点键
  • 定期监控和调整

Q8: 如何监控Memcached分片环境的数据分布?

A8: 监控方法:

  1. 使用memcached-tool查看每个实例的item数量和内存使用情况
  2. 实现自定义监控脚本,收集每个实例的统计信息
  3. 使用Prometheus+Grafana监控数据分布指标
  4. 定期生成数据分布报告,分析不均衡情况
  5. 设置数据分布不均衡告警