【问题标题】:Prometheus/Grafana plot wait time percentiles for jobsPrometheus/Grafana 绘制作业等待时间百分位数
【发布时间】:2018-10-21 14:58:30
【问题描述】:

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

要跟踪的核心指标之一是作业被请求后多长时间会被安排执行(通常不到 5 分钟,但由于各种原因可能长达 1 小时)。

有没有办法绘制出使用 Prometheus + Grafana(或 prometheus 和 Redis 等其他解决方案的混合)的当前未分配作业的百分位数?我想知道什么是中位等待时间,即工作等待时间的 95% 和 99%。

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

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

【问题讨论】:

    标签: grafana prometheus job-scheduling


    【解决方案1】:

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

    在你的情况下,你有两个选择:

    1. 在直方图中记录每个作业已排队等待的持续时间。这种方法的问题是(a)随着时间的推移,你必须不断地将每一项工作“移动”到直方图上; (b) 作业一旦处理就不能从直方图中删除(因为单调性要求)。
    2. 记录每个作业添加到直方图中的时间(例如,在整点 1 分钟之前添加的记录、在整点 2 分钟之前添加的记录等)。这里的问题是您的直方图大小不是静态的,并且会无限增长(假设您的 Prometheus 客户端首先允许它)。

    因此,您有几个选择:

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

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2021-07-07
      • 2020-09-11
      • 2018-10-20
      相关资源
      最近更新 更多