外观
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
ENDstats 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
...
ENDstats 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_statsslab命令族
功能描述:控制和查询slab分配器的状态。
使用方法:
bash
# 启用slab自动重新分配
telnet <host> <port>
slab reassign all
# 查看slab重新分配状态
telnet <host> <port>
stats slab_reassign
# 启用slab自动移动
telnet <host> <port>
slab automove 1display命令
功能描述:通过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 0dump命令
功能描述:导出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: 0memcached-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输出示例:
OKversion命令
功能描述:查看Memcached服务器的版本信息。
使用方法:
bash
telnet <host> <port>
version输出示例:
VERSION 1.6.12verbosity命令
功能描述:调整Memcached的日志级别。
使用方法:
bash
telnet <host> <port>
verbosity 1输出示例:
OKshutdown命令
功能描述:关闭Memcached服务器,用于维护或升级。
使用方法:
bash
telnet <host> <port>
shutdown输出示例:
OK调试命令最佳实践
1. 定期监控
- 定期使用stats命令检查Memcached的基本状态
- 使用memcached-top进行实时监控
- 结合监控系统(如Prometheus+Grafana)进行长期监控
2. 故障排查流程
- 使用
stats命令查看基本状态和命中率 - 使用
stats items查看item分布 - 使用
stats slabs查看内存使用情况 - 使用
stats settings查看配置设置 - 启用详细日志模式
-vv查看具体命令 - 使用
memcached-tool display查看slab使用详情 - 使用
dump命令导出数据进行分析
3. 性能优化
- 根据
stats slabs结果调整slab配置 - 根据
stats items结果优化缓存过期策略 - 根据
stats settings结果调整工作线程数和连接数 - 根据
stats结果优化内存配置
4. 安全注意事项
- 限制调试命令的访问权限:只允许信任的IP访问
- 避免在生产环境中使用
flush_all和shutdown命令 - 定期检查
stats中的rejected_connections指标 - 监控
stats中的auth_errors指标
常见调试场景
场景1:命中率低
问题:Memcached的get_hits / (get_hits + get_misses) 比率低于预期。
排查步骤:
- 使用
stats命令查看命中率 - 使用
stats items查看item的过期情况 - 使用
stats slabs查看内存使用情况 - 使用
stats sizes查看item大小分布 - 分析应用程序的缓存使用模式
解决方案:
- 调整缓存过期时间
- 优化缓存键设计
- 增加Memcached内存容量
- 实现缓存预热机制
- 实施布隆过滤器防止缓存穿透
场景2:响应时间长
问题:Memcached的响应时间超过10ms。
排查步骤:
- 检查服务器CPU使用率:
top或mpstat - 检查服务器内存使用率:
free -m - 检查网络带宽:
iftop或nload - 使用
stats命令查看连接数和线程数 - 启用详细日志模式
-vv查看慢查询
解决方案:
- 增加工作线程数
- 优化网络配置
- 增加服务器资源
- 优化应用程序的缓存使用
- 实现连接池优化
场景3:内存使用率高
问题:Memcached的内存使用率超过90%。
排查步骤:
- 使用
memcached-tool display查看slab使用情况 - 使用
stats slabs查看内存分配 - 使用
stats items查看item数量 - 使用
dump命令分析缓存数据
解决方案:
- 增加Memcached内存容量
- 优化缓存过期策略
- 移除不必要的大对象
- 实施LRU优化
- 考虑分片部署
场景4:连接数高
问题:Memcached的curr_connections接近max_connections。
排查步骤:
- 使用
stats命令查看连接数 - 检查应用程序的连接池配置
- 查看
rejected_connections指标 - 分析客户端连接模式
解决方案:
- 增加max_connections设置
- 优化应用程序连接池
- 实现连接复用
- 考虑分片部署
- 实施连接限流
调试工具比较
| 工具 | 功能 | 易用性 | 扩展性 | 适用场景 |
|---|---|---|---|---|
| stats命令 | 基本统计信息 | 高 | 中 | 日常监控和调试 |
| memcached-tool | 综合管理工具 | 高 | 中 | 详细调试和分析 |
| memcached-top | 实时监控 | 高 | 低 | 实时性能监控 |
| memstat | 详细状态查看 | 中 | 中 | 深入调试 |
| 详细日志模式 | 命令级调试 | 中 | 高 | 命令级调试 |
| dump命令 | 数据导出 | 中 | 高 | 数据分析 |
常见问题(FAQ)
Q1: 一致性哈希算法的虚拟节点数量如何确定?
A1: 虚拟节点数量的确定因素:
- 物理节点数量:节点越少,虚拟节点数量应越多
- 性能要求:虚拟节点数量越多,哈希环维护成本越高
- 数据分布均匀性:虚拟节点数量越多,数据分布越均匀
推荐:每个物理节点设置100-200个虚拟节点。
Q2: 如何处理Memcached分片环境中的热点键?
A2: 热点键处理方法:
- 键拆分:将热点键拆分为多个子键,分散到不同实例
- 数据复制:将热点数据复制到多个实例
- 本地缓存:客户端本地缓存热点数据
- 限流:对热点键请求进行限流
- 预加载:提前加载热点数据到缓存
Q3: 代理分片和客户端分片哪个性能更好?
A3: 性能比较:
- 客户端分片:性能更高,无中间层开销,延迟低
- 代理分片:性能略低,增加了网络跳转,但客户端实现简单
选择建议:
- 对性能要求极高的场景,选择客户端分片
- 对管理便利性要求高的场景,选择代理分片
Q4: 如何实现Memcached分片环境的高可用性?
A4: 高可用性实现:
- 部署多个Memcached实例,避免单点故障
- 使用一致性哈希,单个实例故障影响最小
- 实现节点故障自动检测和恢复
- 部署跨可用区或跨区域的实例
- 定期备份数据,支持快速恢复
Q5: 如何扩展Memcached分片集群?
A5: 扩展步骤:
- 准备新的Memcached实例
- 将新实例添加到分片列表
- 等待数据自动迁移(基于一致性哈希)
- 监控新实例的负载和性能
- 调整其他实例的资源配置(可选)
Q6: 如何处理Memcached分片环境中的数据不一致问题?
A6: 数据不一致处理:
- 接受最终一致性,依赖数据过期机制
- 实现数据版本控制,解决冲突
- 定期同步数据,修复不一致
- 使用写扩散,将写操作发送到多个实例
- 实现读修复,读取时检测并修复不一致
Q7: 分片策略对Memcached的命中率有什么影响?
A7: 影响因素:
- 数据分布均匀性:分布越均匀,整体命中率越高
- 节点数量:适当增加节点数量可以提高命中率
- 热点键处理:有效的热点键处理可以提高命中率
- 分片算法:好的分片算法可以减少数据迁移,保持高命中率
最佳实践:
- 选择合适的分片算法
- 优化数据分布
- 有效处理热点键
- 定期监控和调整
Q8: 如何监控Memcached分片环境的数据分布?
A8: 监控方法:
- 使用memcached-tool查看每个实例的item数量和内存使用情况
- 实现自定义监控脚本,收集每个实例的统计信息
- 使用Prometheus+Grafana监控数据分布指标
- 定期生成数据分布报告,分析不均衡情况
- 设置数据分布不均衡告警
