首页 > 解决方案 > 如何在 Django、UWSGI 和 Kubernetes 的峰值负载下优化每秒请求数

问题描述

我们有一个应用程序经历了一些非常短而尖锐的峰值——通常大约 15-20 分钟长,峰值为 150-250 个请求/秒,但在此期间大约平均为 50-100 个请求/秒。p50 响应时间约为 70 毫秒(而 p90 约为 450 毫秒)

该应用程序通常只是为来自数据库/memcached 集群的模型提供服务,但有时也会向 3rd 方 API 等(跟踪/Stripe 等)发出请求。

这是一个使用 uwsgi 运行的 Django 应用程序,运行在 Kubernetes 上。

我将为您省去完整的 uwsgi/kube 设置,但 TLDR:

# uwsgi
master = true
listen = 128 # Limited by Kubernetes
workers = 2 # Limited by CPU cores (2)
threads = 1
# Of course much more detail here that I can load test...but will leave it there to keep the question simple

# kube
Pods: 5-7 (horizontal autoscaling)

如果我们假设平均响应时间为 150 毫秒,我会粗略计算出 93 个请求/秒的总容量 - 略低于我们的峰值。在我们的日志中,我们经常得到uWSGI listen queue of socket ... full日志,这是有道理的。

我的问题是......我们有什么选择来处理这个峰值?限制:

我们唯一的选择是在 kubernetes 级别上保持水平扩展吗?当然,除了使我们的查询/缓存尽可能高效之外。

标签: djangokubernetesuwsgiscaling

解决方案


推荐阅读