外观
Memcached 内存监控
内存监控核心指标
内存使用率
监控方式:
- 通过
stats命令查看bytes和limit_maxbytes指标 - 计算公式:
内存使用率 = (bytes / limit_maxbytes) × 100%
监控工具:
bash
# 使用 telnet 查看
$ telnet localhost 11211
stats
# 使用 memcached-tool 查看
$ memcached-tool localhost:11211 stats空闲内存
监控内容:
bytes_free:剩余可用内存字节数curr_items:当前存储的键值对数量total_items:累计存储的键值对数量
监控脚本示例:
python
#!/usr/bin/env python3
import telnetlib
def get_memcached_stats(host, port):
tn = telnetlib.Telnet(host, port)
tn.write(b"stats\r\n")
tn.write(b"quit\r\n")
response = tn.read_all().decode('utf-8')
stats = {}
for line in response.split('\n'):
if line.startswith('STAT '):
parts = line.split()
stats[parts[1]] = parts[2]
return stats
stats = get_memcached_stats('localhost', 11211)
bytes_used = int(stats['bytes'])
bytes_max = int(stats['limit_maxbytes'])
mem_usage = (bytes_used / bytes_max) * 100
print(f"内存使用率: {mem_usage:.2f}%")
print(f"空闲内存: {bytes_max - bytes_used} 字节")内存分配效率
关键指标:
malloc_fails:内存分配失败次数cmd_flush:清空缓存命令执行次数evictions:LRU 驱逐键值对数量
监控逻辑:
- 若
malloc_fails> 0,表明内存分配存在问题 - 高
evictions率可能意味着内存不足或缓存策略不合理
内存监控工具
内置监控命令
stats 命令:
bash
$ telnet localhost 11211
stats
STAT bytes 104857600
STAT limit_maxbytes 1073741824
STAT curr_items 10000
STAT total_items 50000
STAT bytes_free 968884224
STAT evictions 100
STAT malloc_fails 0
ENDstats items 命令:
bash
$ telnet localhost 11211
stats items
STAT items:1:number 1000
STAT items:1:age 3600
STAT items:1:evicted 50
STAT items:1:evicted_nonzero 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
END第三方监控工具
Prometheus + Grafana:
- 使用
memcached_exporter采集指标 - 配置
prometheus.yml:yamlscrape_configs: - job_name: 'memcached' static_configs: - targets: ['localhost:9150'] - Grafana 模板:推荐使用 ID 2553 的 Memcached 监控模板
Nagios 监控:
- 使用
check_memcached插件 - 配置示例:
define service { service_description Memcached Memory Usage check_command check_memcached!11211!-w 80 -c 90 host_name memcached-server }
内存监控策略
实时监控
监控频率:
- 生产环境建议 10-30 秒采集一次
- 非生产环境可降低至 1-5 分钟
监控告警阈值:
- 内存使用率 > 80%:警告
- 内存使用率 > 90%:严重
malloc_fails> 0:严重evictions突增:警告
历史数据分析
数据保留策略:
- 核心指标保留 30 天以上
- 详细指标保留 7 天
趋势分析:
- 分析内存使用趋势,预测未来需求
- 识别内存泄漏和异常增长
容量规划:
- 根据历史数据增长趋势,提前规划内存扩容
- 建议预留 20% 以上的空闲内存
内存异常检测
内存泄漏检测
检测方法:
- 观察
bytes指标持续增长,即使curr_items稳定 - 使用
memcached-tool查看 slab 分配情况bash$ memcached-tool localhost:11211 display # 查看各 slab 类别的内存使用情况
处理步骤:
- 确认是否存在内存泄漏
- 检查应用程序是否存在未释放的连接
- 分析键值对的生命周期
- 考虑重启 Memcached 实例
内存碎片检测
检测指标:
bytes与limit_maxbytes的差值curr_items与理论最大容量的差距
碎片率计算公式:
碎片率 = 1 - (实际存储数据大小 / (limit_maxbytes - bytes_free))处理方法:
- 定期重启 Memcached 实例(如每周一次)
- 调整
slab_chunk_max参数 - 优化键值对大小分布
常见问题(FAQ)
Q1: 如何判断 Memcached 内存是否充足?
A1: 主要通过以下指标判断:
- 内存使用率低于 80%
evictions率较低(每分钟少于 100 次)malloc_fails为 0- 应用程序缓存命中率稳定
Q2: 为什么 Memcached 显示内存使用率很高,但实际存储的数据量不大?
A2: 可能原因包括:
- 内存碎片较多
- 大量小键值对导致 slab 分配效率低下
- 某些键值对占用了大量内存但未被使用
- 可通过
memcached-tool查看 slab 分配情况进行分析
Q3: 如何优化 Memcached 内存使用?
A3: 优化建议:
- 调整
slab_page_size参数 - 合理设置键的过期时间
- 避免存储过大的键值对
- 定期清理无效键
- 考虑使用多实例分片存储
Q4: 内存监控数据应该保留多久?
A4: 建议:
- 核心指标(内存使用率、evictions、malloc_fails)保留 30 天以上
- 详细指标(每秒操作数、命中率)保留 7 天
- 用于容量规划的历史数据可保留 6 个月以上
Q5: 如何设置合理的内存告警阈值?
A5: 建议根据业务场景调整:
- 高可用场景:警告阈值 70%,严重阈值 85%
- 一般场景:警告阈值 80%,严重阈值 90%
- 资源紧张场景:警告阈值 85%,严重阈值 95%
- 同时结合
evictions和malloc_fails指标设置告警
