scheduling - 为什么工作没有平均分配给 gunicorn worker ?

标签 scheduling gunicorn round-robin

我正在运行面向公众的大型 Web 应用程序。它是一个 python HTTP 后端服务器,每分钟响应数千个 HTTP 请求。它是用 Flask 和 SQLAlchemy 编写的。在 AWS 的 EC2 上运行的应用程序。实例类型为 c3.2xlarge (它有 8 个 CPU)。

我使用 Gunicorn 作为我的网络服务器。 Gunicorn 有 17 个工作进程和 1 个主进程。下面你可以看到 17 个 gunicorn worker :

$ sudo ps -aefF | grep gunicorn | grep worker | wc -l
17

$ sudo ps -aefF --sort -rss | grep gunicorn | grep worker
UID       PID  PPID  C      SZ     RSS PSR STIME TTY     TIME                           CMD
my-user 15708 26468  6 1000306 3648504   1 Oct06   ? 08:46:19 gunicorn: worker [my-service]
my-user 23004 26468  1  320150  927524   0 Oct07   ? 02:07:55 gunicorn: worker [my-service]
my-user 26564 26468  0  273339  740200   3 Oct04   ? 01:43:20 gunicorn: worker [my-service]
my-user 26562 26468  0  135113  260468   4 Oct04   ? 00:29:40 gunicorn: worker [my-service]
my-user 26558 26468  0  109946  159696   7 Oct04   ? 00:15:14 gunicorn: worker [my-service]
my-user 26556 26468  0  125294  148180   6 Oct04   ? 00:13:07 gunicorn: worker [my-service]
my-user 26554 26468  0  120434  128016   5 Oct04   ? 00:10:13 gunicorn: worker [my-service]
my-user 26552 26468  0   99233  116832   5 Oct04   ? 00:08:24 gunicorn: worker [my-service]
my-user 26550 26468  0   94334   96784   0 Oct04   ? 00:05:28 gunicorn: worker [my-service]
my-user 26548 26468  0   92865   90512   2 Oct04   ? 00:04:47 gunicorn: worker [my-service]
my-user 27887 26468  1   91945   86564   0 17:44   ? 00:02:57 gunicorn: worker [my-service]
my-user 26546 26468  0  127841   84464   5 Oct04   ? 00:03:39 gunicorn: worker [my-service]
my-user 26544 26468  0   90290   80736   2 Oct04   ? 00:03:12 gunicorn: worker [my-service]
my-user 26540 26468  0  107669   78176   5 Oct04   ? 00:02:33 gunicorn: worker [my-service]
my-user 26542 26468  0   89446   76616   5 Oct04   ? 00:02:49 gunicorn: worker [my-service]
my-user 26538 26468  0   88056   72028   5 Oct04   ? 00:02:02 gunicorn: worker [my-service]
my-user 26510 26468  0  106046   70836   2 Oct04   ? 00:01:49 gunicorn: worker [my-service]

我正在检查过去 7 天内收到的所有 HTTP 请求的日志。我已按进程 ID 对请求进行分组和汇总,您可以在上面的 ps 命令中看到。您可以在下面看到结果图。

如您所见,5 个 gunicorn worker 几乎完成了 100% 的工作。剩下的12个基本闲置。在这 5 个人中,一名工作人员 (PID #15708) 所做的工作是目前为止最多的。

为什么会这样?我想了解 gunicorn 用来在其 worker 之间分配工作的算法。绝对不是循环赛?我在哪里可以看到它使用的策略以及如何调整它?什么可以解释这张图中的上升和下降? (例如,PID #332 一直在做最多的工作,直到 10 月 7 日开始下降,然后被上升的 PID #15708 取代)

清晰的解释和/或相关文档的链接会有所帮助。

enter image description here

最佳答案

根据文档:

The default synchronous workers assume that your application is resource-bound in terms of CPU and network bandwidth.

和:

Gunicorn relies on the operating system to provide all of the load balancing when handling requests.

基于这两个陈述,我会说承担大部分工作的单个 worker 几乎不会受到资源限制。一旦资源受限,其他四个工作人员就足以处理额外的负载,而无需调用其他工作人员。

您可以安全地减少工作人员的数量((2 x num cores) + 1 只是开始的建议)。这将减少资源抖动的可能性,并可以提高应用程序的性能。

关于scheduling - 为什么工作没有平均分配给 gunicorn worker ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40008387/

相关文章:

python - 由 gunicorn 运行的 Flask 应用程序在一段时间后被挂起

django - AWS 上的 nginx 和 Gunicorn 出现 504 超时

python - 400(错误请求)和无效 session

java - 如何使用 OOP 构造一个实现循环算法的类?

loops - 是什么导致空的 Go for 循环锁定程序?

algorithm - 作业需求最少的加权区间调度

javascript - 在每秒的精确开始处(或每秒特定的毫秒数)运行函数

process - 内核调度程序如何通过定时器中断保持时间量子精度?

Python加权随机

algorithm - 平均重复游戏以达到每个参与者的最大数量