为什么不能平均分配到枪炮工人身上?

时间:2016-10-12 21:08:44

标签: scheduling gunicorn round-robin

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

我使用Gunicorn作为我的网络服务器。 Gunicorn有17个工人流程和1个主流程。下面你可以看到17名枪手:

$ 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名枪手工人几乎完成了100%的工作。剩下的12个基本上是空闲的。在这5个人中,有一名工人(PID#15708)做的工作量最多。

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

明确的解释将有用和/或链接到相关文档。

enter image description here

1 个答案:

答案 0 :(得分:2)

根据文件:

  

默认同步工作者假定您的应用程序在CPU和网络带宽方面受资源限制。

  

Gunicorn依赖操作系统在处理请求时提供所有负载平衡。

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

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