繁体   English   中英

Prometheus / Grafana绘图等待工作时间百分比

[英]Prometheus/Grafana plot wait time percentiles for jobs

我有一个作业调度引擎,可以在各种机器上运行作业。 我有一个待处理的作业队列作为流(通常等待执行的数千个作业中至少有十万个)。 我有一种算法可以在不同的机器上执行作业。

跟踪的核心指标之一是请求作业后计划执行多长时间(通常少于5分钟,但由于各种原因最多可能需要1个小时)。

是否有办法绘制使用Prometheus + Grafana(或Prometheus和其他解决方案,如Redis的组合)当前未分配工作已经存在多长时间的百分位数? 我想知道什么是中位等待时间,即工作的等待时间的95%和99%。

问题是直到计划执行该作业之前,不会生成任何事件,并且我们等待的时间越长,该作业将移入更高的存储桶。 此外,由于作业的安排时间可能非常不同(并非每个作业都相同),因此仅依靠过去很少的作业需要多长时间来安排时间是错误的。

一种简单的方法是遍历所有待处理的作业并连续计算百分位数,但这将非常昂贵。

Prometheus直方图实现假定一组固定的存储桶(例如,小于1秒,小于2秒,小于5秒等),只能递增(以及它们上方的所有存储桶)。

在您的情况下,您有2个选择:

  1. 在直方图中记录每个作业排队的持续时间。 这种方法的问题在于:(a)随着时间的流逝,您将不得不使每个作业一直“移动”到直方图上; (b)处理完直方图后便无法将其从直方图中删除(由于单调性要求)。
  2. 记录将每个作业添加到直方图中的时间(例如,在每小时之后1分钟之前添加的记录,在每小时之后2分钟之前添加的记录等)。 这里的问题是直方图的大小不是静态的,并且会无限期地增长(假设您的Prometheus客户首先允许它)。

因此,您剩下了两种选择:

  1. 每次被Prometheus抓取时,遍历您的队列并创建一个新的直方图(或直接创建您感兴趣的百分比)。 数以万计的要迭代的工作听起来并不那么糟糕,它应该花费几毫秒的时间。 您甚至可以将您用于队列的数据结构替换为例如二进制搜索树,这样应该可以很容易地以对数时间找出您感兴趣的确切百分位数。
  2. 放弃对挂起作业的记录排队时间,而仅对已处理作业进行记录。 每次处理作业时,您都会增加直方图。 没有比这更简单的了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM