Django 设置中有一个 celery 任务,它使用 Redis 作为后端。我想提高吞吐量、响应能力并预测容量规划的任务完成时间。该任务从内部系统获取数据并将其同步到外部系统。每个任务只会同步到 5 个外部系统。
系统电流统计
- 平均每天有3500 个任务进入队列。
- 延迟细分:p50 - 0.91s,p75 - 5.09s,p90 - 17.88s,p95:22.56s,p99 - 51.32s,最大值 - 11.93 min
- 3 个工作人员为此队列并行运行
- 每小时到达率不同。一天 5 小时占队列中项目的 52%
- 第 13 小时 - 22.07%
- 4 - 10.98%
- 14 - 9.80%
- 11 - 6.14%
- 12 - 5.94%
- 20 - 4.85 %
- 15 - 4.78%
- 休息(17 小时) - 35.44%
响应能力
- 为了使系统(队列工作人员)响应,每个外部系统特定的队列和工作人员应该足以使用重试队列。
吞吐量
# p50, p75, p90, p95, p99, max
>>> (probs = {0.50: 0.91, 0.25: 5.09, 0.15: 17.88, 0.05: 22.56, 0.04: 51.32, 0.01: 11.93 * 60}
>>>val = 0
>>>for k, v in probs.items():
val += k * v * 3500
>>>mean_service_time = val/3500
>>>mean_service_time
- 完成任务的平均/平均时间是14.748s。
- 平均值高于中位数 (p50 - 0.88s)
- 还有其他更好的指标来计算吞吐量吗?什么是正确的指标?由于负载分布不均匀,每小时吞吐率是否是一个更好的指标?
排队等待时间
在阅读了一些关于排队理论的知识后,我可以找到一个计算队列等待时间、队列长度、平均排队时间的公式。
到达率 = 0.0405(3500/86400 (一天中的总秒数))
服务率 = 0.06 (1/14.748)
服务器数量 = 3(3 个并行工作人员)
时间段 = 秒
计算器的结果
- 队列长度 = 39 个单位
- 在系统中花费的平均时间 = 962.9 s
- 利用率 = 0.675
- 系统中 0 个单位的概率 = 0.5079
这个计算是否正确有效?有没有更好的方法来计算指标?
进行所有计算的目的是在生产率增长 3 倍时如何使队列工作人员更快,减少队列等待时间,考虑到其他资源的队列长度不会像数据库那样成为瓶颈。
有没有更好的方法来进行容量规划?
注意:有一种试验和方法方法可以通过将容量增加 5 倍以实现 3 倍增长,但我想看看是否可以使用排队理论和数学来解决问题。