ceph的cache tier缓冲池对象分析

从您提供的对象列表来看,这些是 Ceph RBD 镜像的存储对象,格式为:

rbd_data.{image_id}.{object_offset}
rbd_header.{image_id}
rbd_id.{image_name}

要找出哪个镜像 (image) 一直在使用缓存池,我们需要提取 image_id 并映射到可读的镜像名称。以下是完整的排查步骤:

📊 分析方法

1. ​​提取所有 image_id​

rbd_data对象中提取唯一的 image_id:

rados -p your_cache_pool ls | grep '^rbd_data\.' | cut -d. -f2 | sort | uniq

这会得到类似的结果:

2b7cbc50dcae37
2b3e06af5ee757
4a7b39fa12d9d7
...

2. ​​获取镜像名称与 image_id 的映射​

将 image_id 映射到可读的镜像名称:

# 获取所有镜像的完整信息(含 image_id)
rbd ls -p your_base_pool -l --format json | jq -r '.[] | .image + " " + .id'

示例输出:

vm-1016-disk-0 28fb6b6a633f21
vm-1765-disk-0 7cc5b3f0562375
vm-730-disk-0 4bf6e31eea14bb
...

3. ​​交叉分析活跃镜像​

将缓存池中的 image_id 与镜像清单对比:

# 找出缓存池中的活跃image_id
CACHE_IDS=$(rados -p your_cache_pool ls | grep '^rbd_data\.' | cut -d. -f2 | sort | uniq)

# 与所有镜像对比
rbd ls -p your_base_pool -l --format json | jq -r '.[] | .image + " " + .id' | while read -r name id; do
  if grep -q "$id" <<< "$CACHE_IDS"; then
    echo "活跃镜像: $name (ID: $id)"
  fi
done

4. ​​检查具体镜像的缓存对象数​

计算每个镜像在缓存池中的对象数:

rados -p your_cache_pool ls | awk -F. '
  /^rbd_data\./ {
    count[$2]++
  } 
  END {
    for (id in count) print "ID:" id, "对象数:" count[id]
  }' | sort -k4 -n -r

🔍 从您的对象列表快速分析

从您提供的对象片段中,我们可以直接提取出以下活跃的 image_id:

2b7cbc50dcae37
2b3e06af5ee757
4a7b39fa12d9d7
5734b7f3c75fa4
3aef62ae3cf97
7cc791a36f5475
7bd5299b8bffd
65508f2a990ddd
7cc5b3f0562375
765ab93ed8928a
4cbd67d07ad6f3
72d934d157396a
63c8396412a091
7c759dbdf9a3b1
3ff71922dae3c1
4bf6e31eea14bb
745554d7e54b05
3d0b9ee6729a68
4bcc0541e20cce

📌 下一步操作建议

  1. ​执行映射命令​​:

    rbd ls -p your_base_pool -l --format json | jq '.[] | {image, id}'
  2. ​交叉匹配​​:

    将上述ID列表与映射结果对比,例如:

    7cc5b3f0562375  ➔ 可能是 vm-1765-disk-0 (从您的 rbd_id.vm-1765-disk-0 推断)
    28fb6b6a633f21  ➔ 可能是 vm-1016-disk-0
    4bf6e31eea14bb  ➔ 可能是 vm-730-disk-0
  3. ​检查镜像访问模式​​:

    # 检查特定镜像的I/O统计
    rbd -p your_base_pool perf image iotop

⚡ 快速诊断脚本

#!/bin/bash
CACHE_POOL="your_cache_pool"
BASE_POOL="your_base_pool"

echo "正在分析缓存池中的活跃镜像..."
echo "--------------------------------"

# 获取缓存池中的image_id及其对象数
rados -p $CACHE_POOL ls | awk -F. '
  /^rbd_data\./ { count[$2]++ } 
  END {
    for (id in count) 
      printf "%s %s\n", id, count[id]
  }' > /tmp/cache_ids.tmp

# 获取所有镜像ID映射
rbd -p $BASE_POOL ls -l --format json | jq -r '.[] | .id + " " + .image' > /tmp/all_images.tmp

# 关联数据
echo "Image_ID        对象数  镜像名称"
echo "-------------------------------"
while read id count; do
  name=$(grep "^$id " /tmp/all_images.tmp | cut -d' ' -f2)
  [ -z "$name" ] && name="(未命名)"
  printf "%-16s %-8s %s\n" "$id" "$count" "$name"
done < /tmp/cache_ids.tmp | sort -k2 -n -r

# 清理
rm /tmp/cache_ids.tmp /tmp/all_images.tmp

将此脚本保存为 find_hot_images.sh,赋予执行权限后运行即可直接看到按缓存对象数排序的热点镜像。

执行后将显示类似结果:

Image_ID        对象数  镜像名称
--------------------------------
7cc5b3f0562375  45      vm-1765-disk-0
4bf6e31eea14bb  38      vm-730-disk-0
28fb6b6a633f21  32      vm-1016-disk-0
...
posted @ 2025-08-19 18:19  mofy  阅读(12)  评论(0)    收藏  举报