Skip to content

Memcached 内存监控

内存监控核心指标

内存使用率

监控方式

  • 通过 stats 命令查看 byteslimit_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
END

stats 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
    yaml
    scrape_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 类别的内存使用情况

处理步骤

  1. 确认是否存在内存泄漏
  2. 检查应用程序是否存在未释放的连接
  3. 分析键值对的生命周期
  4. 考虑重启 Memcached 实例

内存碎片检测

检测指标

  • byteslimit_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%
  • 同时结合 evictionsmalloc_fails 指标设置告警