0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

P99是如何计算的

jf_ro2CN3Fa 来源:www.kawabangga.com /posts/4284 2023-01-29 15:41 次阅读

Latency(延迟)是我们在监控线上的组件运行情况的一个非常重要的指标,它可以告诉我们请求在多少时间内完成。监控 Latency 是一个很微妙的事情,比如,假如一分钟有 1亿次请求,你就有了 1亿个数字。如何从这些数字中反映出用户的真实体验呢?

之前的公司用平均值来反应所有有关延迟的数据,这样的好处是计算量小,实施简单。只需要记录所有请求的一个时间总和,以及请求次数,两个数字,就可以计算出平均耗时。

但问题是,平均耗时非常容易掩盖真实的问题。比如现在有 1% 的请求非常慢,但是其余的请求很快,那么这 1% 的请求耗时会被其他的 99% 给拉平,将真正的问题掩盖。

所以更加科学的一种监控方式是观察 P99/P95/P90 等,叫做 Quantile。简单的理解,P99 就是第 99% 个请求所用的耗时。假如 P99 现在是 10ms,那么我们可以说 “99% 的请求都在 10ms 内完成”。虽然在一些请求量较小的情况下,P99 可能受长尾请求的影响。但是由于 SRE 一般不会给在量小的业务上花费太多精力,所以这个问题并不是很大。

但是计算就成了一个问题。P99 是计算时间的分布,所以我们是否要保存下来 1 亿个请求的时间,才能知道第 99% 的请求所用的时间呢?

这样耗费的资源太大了。考虑到监控所需要的数据对准确性的要求并不高。比如说 P99 实际上是 15.7ms 但是计算得到数据是 15.5ms,甚至是 14ms,我认为都是可以接受的。

我们关注更多的是它的变化。“P99 耗时从 10.7ms 上涨到了 14ms” 和 “P99耗时从 11ms 上涨到了 15.5ms” 这个信息对于我们来说区别并不是很大。(当然了,如果是用于衡量服务是否达到了服务等级协议 SLO 的话,还是很大的。这样需要合理地规划 Bucket 来提高准确性)。

所以基于这个,Prometheus 采用了一种非常巧妙的数据结构来计算 Quantile: Histogram

Histogram 本质上是一些桶。举例子说,我们为了计算 P99,可以将所有的请求分成 10 个桶,第一个存放 0-1ms 完成的请求的数量,后面 9 个桶存放的请求耗时上区间分别是 5ms、10ms、50ms、100ms、200ms、300ms、500ms、1s、2s,这样只要保存 10 个数字就可以了。

要计算 P99 的话,只需要知道第 99% 个数字落在了哪一个桶,比如说落在了 300ms-500ms 的桶,那我们就可以说现在的 99% 的请求都在 500ms 之内完成(这样说不太准确,如果准确的说,应该是第 99% 个请求在 300ms – 500ms 之间完成)。这些数据也可以用来计算 P90、P95 等等。

由于我们的监控一般是绘制一条曲线,而不是一个区间。所以 P99 在 300-500 之间是不行的,需要计算出一个数字来。

Prometheus 是假设每一个桶内的数据都是线性分布的,比如说现在 300-500 的桶里面一共有 100 个请求,小于300个桶里面一共有 9850 个请求。所有的桶一共有 1万个请求。

那么我们要找的 P99 其实是第 10000 * 0.99 = 9900 个请求。第 9900 个请求在 300-500 的桶里面是第 9900 – 9850 = 50 个请求。根据桶里面都是线性分布的假设,第 50 个请求在这个桶里面的耗时是 (500 – 300) * (50/100) = 400ms,即 P99 就是 400ms。

可以注意到因为是基于线性分布的假设,不是准确的数据。比如假设 300-500 的桶中耗时最高的请求也只有 310ms,得到的计算结果也会是 400ms。桶的区间越大,越不准确,桶的区间越小,越准确。

写这篇文章,是因为昨天同事跑来问我,“为啥我的日志显示最慢的请求也才 1s 多,但是这个 P999 latency 显示是 3s?”

我查了一下确实如他所说,但是这个结果确实预期的。因为我们设置的桶的分布是:10ms、50ms、100ms、500ms、1s、5s、10s、60s。

如上所说,Prometheus 只能保证 P999 latency 落在了 1s – 5s 之间,但不能保证误差。

如果要计算准确的 Quantile,可以使用 Summary 计算。简单来说,这个算法没有分桶,是直接在机器上计算准确的 P99 的值,然后保存 P99 这个数字。但问题一个是在机器本地计算,而不是在 Prometheus 机器上计算,会占用业务机器的资源;另一个是无法聚合,如果我们有很多实例,知道每一个实例的 P99 是没有什么意义的,我们更想知道所有请求的 P99。显然,原始的信息已经丢失,这个 P99 per instance 是无法支持继续计算的。

另外一个设计巧妙的地方是,300-500 这个桶保存的并不是 300-500 耗时的请求数,而是 <500ms 的请求数。也就是说,后面的桶的请求数总是包含了它前面的所有的桶。这样的好处是,虽然我们保存的数据没有增加(还是10个数字),但是保存的信息增加了。假如说中间丢弃一个桶,依然能够计算出来 P99,在某些情况下非常有用,比如监控资源不够了,我们可以临时不收集前5个桶,依然可以计算 P99。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 监控
    +关注

    关注

    6

    文章

    2163

    浏览量

    55066

原文标题:P99 是如何计算的?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何计算感性负载的功率因数?

    的方法: 首先,我们需要了解功率因数的定义。功率因数(PF)是一个无单位的数值,表示电压和电流之间的相位差。它是有功功率(P)与视在功率(S)之比,即PF = P/S。 计算有功功率(P
    发表于 11-13 16:39

    14位,3.3V CMOS直接数字合成器-CBM99D10

    CBM99D10BQ:1G高精度DDS,助力北斗信号接收CBM99D10BQ是一款内置14位DAC的直接数字频率合成器(DDS),支持高达1GSPS采样速率,可生成400MHz正弦波形。用户可通过
    的头像 发表于 11-11 11:42 664次阅读
    14位,3.3V CMOS直接数字合成器-CBM<b class='flag-5'>99</b>D10

    数控车床m99指令的用法

    X20 F100  N40 M99  在这个例子中,M20指令用于设置循环次数为10,P参数表示循环次数的值。当程序执行到M99指令时,数控系统会自动检查M20指令设置的循环次数,并根据循环次数进行
    的头像 发表于 10-23 15:52 248次阅读

    XCVU9P 板卡设计原理图:616-基于6U VPX XCVU9P+XCZU7EV的双FMC信号处理板卡 高性能数字计算

    光纤加速计算 , 基带信号处理 , 高性能数字计算卡 , 高速图像处理卡 , XCVU9P
    的头像 发表于 10-21 15:46 223次阅读
    XCVU9<b class='flag-5'>P</b> 板卡设计原理图:616-基于6U VPX XCVU9<b class='flag-5'>P</b>+XCZU7EV的双FMC信号处理板卡 高性能数字<b class='flag-5'>计算</b>卡

    CBM24AD99Q数据手册-中文版

    CBM24AD99Q芯片是低噪声24 位同步采样Δ-Σ模数转换器(ADC),具有内置可编程增益放大器(PGA)、内部电压基准和内部振荡器。CBM24AD99Q包含颅外脑电图(EEG)和心电图(ECG
    发表于 10-16 13:39 0次下载

    智能加速计算卡设计原理图:628-基于VU3P的双路100G光纤加速计算卡 XCVU3P板卡

    DA 信号处理板卡 , PCIe 光纤加速计算卡 , XCVU3P板卡 , 高速视频采集卡 , 信号输出验证, PCIe 光纤加速计算卡 , XCVU3P板卡 , 光纤加速
    的头像 发表于 08-01 11:03 248次阅读
    智能加速<b class='flag-5'>计算</b>卡设计原理图:628-基于VU3<b class='flag-5'>P</b>的双路100G光纤加速<b class='flag-5'>计算</b>卡 XCVU3<b class='flag-5'>P</b>板卡

    DS99R101/DS99R102 3-40MHz DC平衡24位LVDS串行器和解串器数据表

    电子发烧友网站提供《DS99R101/DS99R102 3-40MHz DC平衡24位LVDS串行器和解串器数据表.pdf》资料免费下载
    发表于 07-09 09:39 0次下载
    DS<b class='flag-5'>99</b>R101/DS<b class='flag-5'>99</b>R102 3-40MHz DC平衡24位LVDS串行器和解串器数据表

    数控车床m99指令的用法

    数控车床是一种高度自动化的机床,广泛应用于机械加工领域。在数控车床的编程中,M代码(辅助功能代码)起着非常重要的作用。M99指令是数控车床编程中的一种辅助功能代码,用于实现程序的循环调用。下面我们将
    的头像 发表于 06-14 15:52 4293次阅读

    cnc怎么编程m99循环次数

    CNC(计算机数控)编程是一种用于控制机床自动加工零件的技术。M99是一个在数控程序中用于结束循环的指令。 引言 CNC编程是一种广泛应用于制造业的技术,它允许机床按照预设的程序自动加工零件。CNC
    的头像 发表于 06-14 15:49 1999次阅读

    乐鑫ESP32-P4芯片应用,WT99P4C6-S1开发板应用方案

    的ESP32-P4芯片,为智能设备开发带来了新的突破。ESP32-P4:性能飞跃,功能全面ESP32-P4芯片继承了ESP32系列的优良传统,并在此基础上实现了性能的飞跃
    的头像 发表于 06-01 08:04 1491次阅读
    乐鑫ESP32-<b class='flag-5'>P</b>4芯片应用,WT<b class='flag-5'>99P</b>4C6-S1开发板应用方案

    双串联高速开关二极管BAV99QB数据手册

    电子发烧友网站提供《双串联高速开关二极管BAV99QB数据手册.pdf》资料免费下载
    发表于 02-21 09:59 0次下载
    双串联高速开关二极管BAV<b class='flag-5'>99</b>QB数据手册

    电机堵转的扭矩怎么计算

    电机扭矩的计算公式 T=9550P/n 有一点不是太明白,在堵转的情况下,没有转速也就是说n=0,这个公式是不是就不适用了? 如果要计算电机堵转的扭矩有没有其他的计算公式?
    发表于 01-09 07:14

    protel99

    protel99使用好久,最近几年常有一个情况,一个文件刚开始几兆到几十兆,经过几次修改后变大好多,有的上百兆,而且铺地会变成一块,无法删除。有知道原因望高手吗,请指教,谢谢!
    发表于 12-31 19:56

    三相异步电动机的耗电量怎样计算?能用W=P*T计算吗?

    三相异步电动机的耗电量怎样计算?能用W=P*T计算吗?如果这样计算的话,那耗电量的大小与电机带不带负载岂不是就没有关系了吗?
    发表于 12-21 06:28

    Protel99 与WIN10系统冲突解决办法

    PROTEL99 与WIN10系统冲突解决办法
    的头像 发表于 11-20 09:30 3844次阅读
    Protel<b class='flag-5'>99</b> 与WIN10系统冲突解决办法