Memcached stats sizes 命令

memcachedstats sizes 命令 已被官方废弃(deprecated),在新版本中 不再支持,执行会返回:

ERROR

为什么被废弃?

  • 性能开销大:需要遍历 所有 item 并统计其大小分布,内存越大、item 越多,耗时越长,可能导致服务卡顿。
  • 替代方案更优:通过 stats slabs + stats items 组合即可推断大小分布。
  • 安全风险:暴露所有 item 大小可能泄露业务信息。

官方说明(GitHub)
https://github.com/memcached/memcached/commit/8c8e7e9
stats sizes has been removed due to performance concerns.”


正确替代方案:用 stats slabs + stats items 分析大小分布

目标:统计 每个 chunk 大小区间内有多少 item

# 步骤 1:获取每个 slab 的 chunk_size 和 item 数量
stats slabs | grep -E "chunk_size|total_pages" > /tmp/slab.tmp
stats items | grep "items:[0-9]\+:number " | awk '{print $1 " " $3}' > /tmp/items.tmp

# 步骤 2:合并并输出分布
echo "ChunkSize  Items  UsedMB  ApproxKeyValueSize"
awk '
  NR==FNR {
    if(/chunk_size/) {split($1,a,":"); id=a[2]; size[id]=$2}
    if(/total_pages/) {split($1,a,":"); id=a[2]; pages[id]=$2}
    next
  }
  {
    split($1,b,":"); id=b[2]; num=$2
    if(size[id]) {
      mb = pages[id] * 1024 * 1024 / 1024 / 1024
      printf "%6d B  %8d  %8.2f GB  ~%d B\n", size[id], num, mb, size[id]-48
    }
  }
' /tmp/slab.tmp /tmp/items.tmp | sort -n

示例输出(模拟)

ChunkSize  Items  UsedMB  ApproxKeyValueSize
   104 B      850     0.10 GB  ~56 B
   136 B     1200     0.15 GB  ~88 B
   192 B      500     0.08 GB  ~144 B
  4096 B       50     0.20 GB  ~4048 B

ApproxKeyValueSize ≈ chunk_size - 48(48 是 memcached 内部 overhead:key + flags + exptime + refcount 等)


更精确的估算(推荐脚本)

#!/bin/bash
echo "=== Memcached Item Size Distribution (via slabs + items) ==="
echo "ChunkSize   Items     UsedMB   Est. Payload"
echo "------------------------------------------------"

stats slabs | grep -E "^STAT [0-9]+:" | grep -E "chunk_size|total_pages" | \
paste - - | awk '
{
  id=$1; gsub(/:.*/,"",id)
  size[id]=$3
  pages[id]=$6
}'

stats items | grep "items:[0-9]\+:number " | awk '
{
  split($1,a,":"); id=a[2]; num[id]=$2
}'

for id in $(echo ${!size[@]} | tr ' ' '\n' | sort -n); do
  if [[ -n "${num[$id]}" ]]; then
    chunk=${size[$id]}
    items=${num[$id]}
    pages=${pages[$id]:-0}
    mb=$(echo "scale=2; $pages / 1024" | bc)
    payload=$((chunk - 48))
    printf "%8d B  %8d  %8.2f GB  ~%d B\n" "$chunk" "$items" "$mb" "$payload"
  fi
done

第三方替代工具(可选)

工具功能安装
memkeys扫描所有 key 并统计大小go get github.com/flowerinjar/memkeys
mcstat美化 stats 输出pip install mcstat
php-memcached-adminWeb 界面查看 slabsGitHub

历史 stats sizes 输出(仅供参考)

仅在老版本(如 1.4.x)可用

STAT 96 1234
STAT 128 5678
STAT 256 345
...
END

意思是:

  • 大小为 96 字节的 item 有 1234 个
  • 大小为 128 字节的 item 有 5678 个

总结

项目内容
stats sizes已废弃,不可用
替代方案stats slabs + stats items
核心字段chunk_size, total_pages, items:<id>:number
估算 payloadchunk_size - 48 字节
推荐做法写脚本合并输出,定期监控

需要我帮你写一个完整监控脚本?
可以输出:

  • 每个大小区间的 item 数
  • 内存占用
  • 热点 slab 预警
  • JSON 格式供 Prometheus 采集

贴一下你的 stats slabsstats items 输出,我立刻生成!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部