memcached 的 stats sizes 命令 已被官方废弃(deprecated),在新版本中 不再支持,执行会返回:
ERROR
为什么被废弃?
- 性能开销大:需要遍历 所有 item 并统计其大小分布,内存越大、item 越多,耗时越长,可能导致服务卡顿。
- 替代方案更优:通过
stats slabs+stats items组合即可推断大小分布。 - 安全风险:暴露所有 item 大小可能泄露业务信息。
官方说明(GitHub):
https://github.com/memcached/memcached/commit/8c8e7e9
“stats sizeshas 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-admin | Web 界面查看 slabs | GitHub |
历史 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 |
| 估算 payload | chunk_size - 48 字节 |
| 推荐做法 | 写脚本合并输出,定期监控 |
需要我帮你写一个完整监控脚本?
可以输出:
- 每个大小区间的 item 数
- 内存占用
- 热点 slab 预警
- JSON 格式供 Prometheus 采集
贴一下你的 stats slabs 和 stats items 输出,我立刻生成!