为什么工作没有平均分配给 gunicorn 工人?
Why isn't work being distributed across gunicorn workers evenly?
我是 运行 我的面向 public 的大型 Web 应用程序。它是一个 python HTTP 后端服务器,每分钟响应数千个 HTTP 请求。它是用 Flask 和 SQLAlchemy 编写的。 AWS 中 EC2 上的应用程序 运行。实例类型为 c3.2xlarge(它有 8 个 CPU)。
我使用 Gunicorn 作为我的网络服务器。 Gunicorn 有 17 个工作进程和 1 个主进程。下面你可以看到 17 个 gunicorn 工人:
$ 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 用来在其工人之间分配工作的算法。绝对不是循环赛?我在哪里可以看到它使用的策略以及如何调整它?什么可以解释这张图中的上升和下降? (例如,PID #332 在 10 月 7 日之前一直在做最多的工作,当时它开始下降并被上升的 PID #15708 取代)
清楚的解释会有所帮助and/or 相关文档的链接。
根据文档:
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.
基于这两个陈述,我会说承担大部分工作的单个工人几乎不会受到资源限制。一旦资源受限,其他四个工作人员就足以处理额外的负载,而无需调用其他工作人员。
您可以安全地减少工人数量((2 x num cores) + 1
只是开始的建议)。这将减少资源抖动的可能性,并可以提高应用程序的性能。
我是 运行 我的面向 public 的大型 Web 应用程序。它是一个 python HTTP 后端服务器,每分钟响应数千个 HTTP 请求。它是用 Flask 和 SQLAlchemy 编写的。 AWS 中 EC2 上的应用程序 运行。实例类型为 c3.2xlarge(它有 8 个 CPU)。
我使用 Gunicorn 作为我的网络服务器。 Gunicorn 有 17 个工作进程和 1 个主进程。下面你可以看到 17 个 gunicorn 工人:
$ 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 用来在其工人之间分配工作的算法。绝对不是循环赛?我在哪里可以看到它使用的策略以及如何调整它?什么可以解释这张图中的上升和下降? (例如,PID #332 在 10 月 7 日之前一直在做最多的工作,当时它开始下降并被上升的 PID #15708 取代)
清楚的解释会有所帮助and/or 相关文档的链接。
根据文档:
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.
基于这两个陈述,我会说承担大部分工作的单个工人几乎不会受到资源限制。一旦资源受限,其他四个工作人员就足以处理额外的负载,而无需调用其他工作人员。
您可以安全地减少工人数量((2 x num cores) + 1
只是开始的建议)。这将减少资源抖动的可能性,并可以提高应用程序的性能。