9. 统计 OSD 上 PG 的数量


我们可以通过一个 Python 脚本,统计出每个 OSD 上分布了多少个 PG ,以此判断集群的数据分布是否均衡。

  1. #!/usr/bin/env python
  2. import sys
  3. import os
  4. import json
  5. cmd = '''
  6. ceph pg dump | awk ' /^pg_stat/ { col=1; while($col!="up") {col++}; col++ } /^[0-9a-f]+\.[0-9a-f]+/ {print $1,$col}'
  7. '''
  8. body = os.popen(cmd).read()
  9. SUM = {}
  10. for line in body.split('\n'):
  11. if not line.strip():
  12. continue
  13. SUM[line.split()[0]] = json.loads(line.split()[1])
  14. pool = set()
  15. for key in SUM:
  16. pool.add(key.split('.')[0])
  17. mapping = {}
  18. for number in pool:
  19. for k,v in SUM.items():
  20. if k.split('.')[0] == number:
  21. if number in mapping:
  22. mapping[number] += v
  23. else:
  24. mapping[number] = v
  25. MSG = """%(pool)-6s: %(pools)s | SUM
  26. %(line)s
  27. %(dy)s
  28. %(line)s
  29. %(sun)-6s: %(end)s |"""
  30. pools = " ".join(['%(a)-6s' % {"a": x} for x in sorted(list(mapping))])
  31. line = len(pools) + 20
  32. MA = {}
  33. OSD = []
  34. for p in mapping:
  35. osd = sorted(list(set(mapping[p])))
  36. OSD += osd
  37. count = sum([mapping[p].count(x) for x in osd])
  38. osds = {}
  39. for x in osd:
  40. osds[x] = mapping[p].count(x)
  41. MA[p] = {"osd": osds, "count": count}
  42. MA = sorted(MA.items(), key=lambda x:x[0])
  43. OSD = sorted(list(set(OSD)))
  44. DY = ""
  45. for osd in OSD:
  46. count = sum([x[1]["osd"].get(osd,0) for x in MA])
  47. w = ["%(x)-6s" % {"x": x[1]["osd"].get(osd,0)} for x in MA]
  48. #print w
  49. w.append("| %(x)-6s" % {"x": count})
  50. DY += 'osd.%(osd)-3s %(osds)s\n' % {"osd": osd, "osds": " ".join(w)}
  51. SUM = " ".join(["%(x)-6s" % {"x": x[1]["count"]} for x in MA])
  52. msg = {"pool": "pool", "pools": pools, "line": "-" * line, "dy": DY, "end": SUM, "sun": "SUM"}
  53. print MSG % msg

执行效果如下:

  1. root@OPS-ceph1:~# ./cal_pg_per_osd.py
  2. dumped all in format plain
  3. pool : 0 1 2 3 4 5 7 | SUM
  4. --------------------------------------------------------------------
  5. osd.0 2 9 11 10 5 6 1 | 44
  6. osd.1 1 7 8 10 8 9 3 | 46
  7. osd.2 2 11 7 6 6 8 4 | 44
  8. osd.3 1 11 7 9 7 4 1 | 40
  9. osd.4 2 12 12 12 11 13 0 | 62
  10. osd.5 2 10 10 5 9 11 0 | 47
  11. osd.6 3 56 47 49 38 43 16 | 252
  12. osd.7 6 36 48 45 55 42 10 | 242
  13. osd.8 4 41 42 37 35 49 15 | 223
  14. osd.9 6 42 52 41 55 36 12 | 244
  15. osd.10 10 36 47 51 39 43 15 | 241
  16. osd.11 6 56 47 44 41 46 12 | 252
  17. osd.12 6 40 45 45 51 46 11 | 244
  18. osd.13 6 42 40 56 46 44 9 | 243
  19. osd.14 5 44 41 49 48 52 7 | 246
  20. osd.15 4 50 42 38 49 38 12 | 233
  21. osd.16 3 9 5 11 8 8 2 | 46
  22. osd.17 2 10 13 4 7 10 2 | 48
  23. osd.18 0 12 10 10 10 9 6 | 57
  24. osd.19 0 13 8 4 9 15 2 | 51
  25. osd.20 1 11 7 9 9 15 2 | 54
  26. osd.21 0 7 12 10 6 12 1 | 48
  27. osd.22 4 39 45 30 43 46 12 | 219
  28. osd.23 6 44 38 44 38 41 6 | 217
  29. osd.24 7 37 50 49 49 36 8 | 236
  30. osd.25 10 28 38 44 40 32 11 | 203
  31. osd.26 1 44 33 47 47 37 13 | 222
  32. osd.27 3 47 38 42 44 55 14 | 243
  33. osd.28 4 47 47 34 33 48 11 | 224
  34. osd.29 3 40 32 34 40 51 10 | 210
  35. osd.30 8 39 46 47 55 35 10 | 240
  36. osd.31 5 48 48 45 41 36 11 | 234
  37. osd.32 5 46 48 53 42 48 7 | 249
  38. --------------------------------------------------------------------
  39. SUM : 128 1024 1024 1024 1024 1024 256 |