【发布时间】:2022-01-22 10:05:12
【问题描述】:
我在 nginx 控制器后面遇到了 gunicorn 的问题。 我有一个用 aiohttp 用 python 编写的微服务,我正在使用 gunicorn。该微服务部署在 Kubernetes 集群中。我决定通过做一些压力测试来测试我的应用程序,为此我使用了 locust。问题是:当我在本地 docker 容器中运行我的应用程序时,它显示出非常好的结果,但是当我在 kubernetes 集群中进行压力测试时,我看到运行我的应用程序的 pod 的内存使用率很高。我认为这是内存泄漏,并在本地对我的应用程序进行压力测试时检查了 docker stats,它使用了 80-90 MiB 的内存。但是当我在集群中进行压力测试时,我看到 grafana 仪表板上的内存使用量不断增加。内存使用量高达 1.2 Gb,当我停止 locust 时,它并不稳定,只是从 600 Mb 跳到 1.2,我在图表上看到了尖峰。 该 pod 目前获得 1 个 cpu 和无限内存。 这是我的 gunicorn 配置:
workers = 1
bind = f"{SERVICE_HOST}:{SERVICE_PORT}"
worker_class = "aiohttp.GunicornUVLoopWebWorker"
#worker_connections = 4096
#max_requests = 4096
#max_requests_jitter = 100
我尝试了不同的 gunicorn 配置与 3 个工作人员 (2*nCPU + 1) 和带有抖动的 max_request 以重新启动工作人员。但一直没有得到好的结果。 我发现的一件事 - 当我进行高负载(同时 500 个用户)时,蝗虫会显示客户端超时并显示“远程断开连接”。我在 gunicorn 文档中读到,将 gunicorn 放在 nginx 后面是一个好习惯,因为 nginx 可以缓冲响应。当我在本地或集群内进行测试时,我没有这样的错误。 我还没有弄清楚的主要问题是为什么本地和集群内的内存使用量不同? 在本地测试 docker stats 时有 1 名工作人员显示 80-90 MiB,但 grafana 图表显示了我已经描述的内容......
【问题讨论】:
-
欢迎来到社区!那么您是否仅在 grafana 中检查 pod 的内存?我建议通过
kubectl exec命令登录到 pod 并检查内部究竟发生了什么以及究竟是什么消耗了内存 + 哪些容器的运行时在本地和 k8s 集群中使用?它可以不同。看起来与this question 相似,但没有得到答复。 -
@moonkotte 谢谢!今天我做了一些测试。我在本地 nginx 后面运行我的应用程序,当它处于负载状态时,我将
docker exec放入容器并运行top命令。所以我只是在看master和一个worker进程的内存消耗,它很稳定,没有内存泄漏。但后来我在一个吊舱内做了完全相同的事情。我开始加载并运行kubectl execint pod,输入top命令,几分钟后我看到gunicorn 工作进程的内存消耗不断增加。我还尝试了使用抖动和积压的 max_request,但它没有帮助。
标签: python kubernetes gunicorn aiohttp locust