普罗米修斯?对!就是 Prometheus ,如何计算 P90 / P99 ? 准确评控服务耗时性能!

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了普罗米修斯?对!就是 Prometheus ,如何计算 P90 / P99 ? 准确评控服务耗时性能!相关的知识,希望对你有一定的参考价值。

普罗米修斯?对!就是 Prometheus ,如何计算 P90 / P99 ? 准确评控服务耗时性能!

  前文 “ 普罗米修斯?古希腊泰坦之神?异形?不,新一代企业级监控组件—Prometheus! ” 中讲过,Prometheus 作为全面拥抱云原生的新时代实时监控系统,支持全方面系统性能指标监控。

  那么如何对系统耗时性能进行精确评估呢?

服务耗时是对系统性能评估的重要因素

  当提及一个系统架构的是否优秀时,往往会通过几个问题去体现 或 评估。
  正如你面试或工作对接中经常听到的:

  • 你们的这个系统可以抗多少 QPS ?
  • 你们服务 / 接口 平均耗时是多少 ?P99 / P90 大概在多少呢 ?
  • 你们服务规模在什么级别 ?

  在实际生产中,服务耗时往往于业务复杂度、流量规模等因素成正比关系! 随着业务增长,对于平响的处理始终是一个关键着重注意点。
  我们做的大部分技术优化项目,往往最根本的目的就是压缩服务耗时。因为服务耗时越低,意味着用户可以更迅速的获取服务,服务体验会上一个层次。

极短的服务耗时是用户体验良好的基准

  现在,可以拿出手机尝试一下,打开淘宝刷个物品菜单 、微博刷个帖子 或者 打开脉脉浏览面试技巧、观察一下,各自的正文页信息刷新的时长,会有明显的迥异!
  在这个时间臻至,多重选择的时代,试想一下,你是会选择秒开的应用,还是会使用每次都要看 2~3s+ “ 缓冲中 “ 动画 或 白屏 的应用!

P90 / P99 / Avg 衡量服务耗时指标

  为了更好的衡量服务的耗时指标,业界往往会通过 P90 \\ P95 \\ P99 \\ Avg 相关指标去度量。

  Avg 是整体服务平均耗时,比较容易理解,即 总请求 / 总耗时 。比较直观的看出服务整体水平,但是颗粒度过大,无法知晓极端 或 个别 特殊问题。比如,虽然平均耗时为 150ms , 但偶尔总会感知到严重的响应迟缓,这时就会发现在服务低谷期,平响极低,高峰时,响应严重延迟!

  我们需要更细粒度的知晓服务响应耗时信息。

  PXXX 是指处于 P% 的百分位数。
  通俗的来讲,就是 一百个小学生排排队放学「个子由低到高排」,P50 的指就是第 50 个同学的身高。通过这个数值可以知晓,班里 50%的同学身高低于 120cm 「P50」 。
  换成业界内数据就是,我们 90% \\ 99% 的用户响应耗时在 200ms 「P90 \\ P99」之内,剩下 10% \\ 1% 的用户响应超过了 200ms !

Prometheus histogram

  Prometheus 提供了 histogram 类型指标 支持数据的百分位计算。其在存储设计与 Counter 、Summary、等类型不同,是以分桶的形式进行。

P90 \\ P99 计算

  histogram 会依据配置指标的 len 范围形成 有序的几个分桶,响应数值的指标将会命中不同 len 的分组。为什么这样设计呢?

  从上文理解,PXXX 不就是将数据排列,取其中 XXX% 对应的百分位就行。对,是这样。但实际生产中数据规模可能上百万,甚至亿级,如果进行这种的操作,内存和CPU计算资源可能不足以支撑,况且没必要,有种 “ 好钢没用到刀刃上 ” 的感觉,花那么多功夫就为算这个……

  于是,分桶算法提供了更好的解决方案。

  对耗时维度进行界限划分成几个桶,不同的耗时命中至不同的分桶,最终只需统计每个桶的数量就可以找到 PXXX 所在的桶,然后对命中桶的界限进行 插值 等概率学算法,就能准确的算出 PXXX 的值。

P90 \\ P99 代码实现

  • 1、定义指标
ResourceSecondMonitor = prometheus.NewHistogramVec(prometheus.HistogramOpts{
   Namespace: NAMESPACE,
   Name:      "render_second",
   Help:      "资源使用耗时",
   Buckets:   []float64{5, 10, 50, 80, 100, 120, 150, 200, 250},
}, []string{"service","resource"})
  • 2、注册指标
prometheus.MustRegister(ResourceSecondMonitor)
  • 3、收集指标
ResourceSecondMonitor.WithLabelValues(service, "ur_time").Observe(float64(resource.UrTime))
  • 4、展示指标
histogram_quantile(0.9,sum(rate(render_second[10m])) by (le))

Q&A

1、是只有 Prometheus 中的 PXXX 这样计算吗?其他地方呢?

不是,PXXX 计算方式通用,这里借 Prometheus 来讲解。

附录

简单的问题背后往往更值得思考!

欢迎加入Q群聊【编程技术交流分享群717647116】,微信群请私信博主添加

以上是关于普罗米修斯?对!就是 Prometheus ,如何计算 P90 / P99 ? 准确评控服务耗时性能!的主要内容,如果未能解决你的问题,请参考以下文章

普罗米修斯?对!就是 Prometheus ,如何计算 P90 / P99 ? 准确评控服务耗时性能!

prometheus配置详解

如何使用 promql 在新标签上对两个 Prometheus 时间序列进行分组?

监控神器-普罗米修斯Prometheus的安装

普罗米修斯监控能否监控redis耗时

k8s部署-54-如何完善k8s中Prometheus(普罗米修斯)监控项目呢?本文带你了解