0. ceph是如何查看集群性能数据的
- 通过ceph -s显示本次查看的集群性能数据
-
通过ceph -w实时更新集群性能数据
如下图:
image.png
那这里client io是怎么得到的呢,接下来介绍下ceph性能统计的实现
1. 性能收集总体框架
image.png
- osd端负责收集性能数据并上报给mon
- mon端负责汇总性能数据并同步给其他mon,之所以要同步是了保证不同客户端访问不同的mon得到的性能数据是一致的
- osd内部是以pg为粒度进行性能收集的
- mon性能数据需要持久化到pgmap里
2. osd端性能收集实现
image.png
如上图所示
- pg中info.stats.stats成员变量记录pg从osd开始运行到现在累计的性能数据
- pg中的unstable_stats记录的两次写time interval内的性能数据,包括读写iops以及时延等,可以认为是增量的性能数据
- pg统计好性能数据放到pg_stats_publish,然后将pg加入osd的pg_stat_queue队列
- osd tick线程定时扫描pg_stat_queue队列去上报pg stats给mon
3. mon端性能统计汇总
image.png
当pgmap数据在所有mon节点同步完成后,需要更新本地内存的数据,此时会将新增的数据apply到pgmap中
image.png
从上图的过程可以看出:
- pg_sum是记录整个集群的所有的pg性能数据
- pg_sum更新pg的stats是先删除旧的,然后更新为本次修改的,因为pg上报的是全量的性能数据
- 更新pg_sum的最近的增量delta数据,包括data和time,用来进行性能统计
- 更新每个pool下的最近的增量delta数据,包括data和time,用来进行性能统计
- 无论是pg_sum的delta数据还是每个pool下的,最多只保留mon_stat_smooth_intervals=2个统计周期的数据
上面说到的delta到底是干什么用的呢?还记得开头我们提出的ceph -s下的client io是如何得到的吗,这里就用到了delta数据了
当你调用ceph -s查看pg性能统计结果时,到mon的流程如下:
image.png
从上图可以看出client io是通过pg_sum_delta和stamp_delta计算得到的
4. 总结
当前ceph性能统计存在一定的问题
- 首先没有统计客户端到osd段这段时延,所以ceph统计的io时延比真实要低
- 由于pg可以并发,osd也可以并发处理,导致osd上报pg状态并不是同时的,因此mon统计的数据并不能反映集群的某一时刻真实性能