[英]Laravel Horizon Restrictions and Optimization
laravel 范围内的maxProcesses
、 supervisors
数量和queue
总数之间是否存在任何经验法则或任何逻辑关系?
如果我有 15 个主管和 40 个队列(每个主管根据其类别有多个队列)怎么办? 我可以分配给每个主管的maxProcesses
的最大数量是多少(假设平衡auto
)?
我想知道是否有通过调整这些数字来获得更好性能的经验法则,例如,如果supervisor-x
的数量不应超过队列总数,并且maxProcesses
是否不应超过基于特定数量在运行进程的操作系统规范上。
这些数字之间有什么逻辑关系吗? 关于这个问题有好的文档吗? 我已经在 supervisor和Laravel Horizon文档上看到了这个文档,但没有找到我的问题的答案。
我需要详细解释一些事情,以便理解所有这些事情之间的关系。
Supervisor 的存在出于一些简单的设置。 最重要的一次是这些:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work
autostart=true
autorestart=true
numprocs=8
这里最重要的设置是numprocs=8
,来自主管的手册说:
Supervisor 将启动与 numprocs 指定的一样多的该程序实例。 请注意,如果 numprocs > 1,则 process_name 表达式必须在其中包含 %(process_num)s(或任何其他包含 process_num 的有效 Python 字符串表达式)。
supervisor 运行一个名为artisan queue:work
的程序的配置将创建artisan queue:work
queue:work 的8个实例(进程、工作人员,相同的东西)。 这意味着可以同时处理 8 个作业,仅此而已。
Horizon 没有 定义numprocs
,您必须知道的唯一重要设置是stopwaitsecs=3600
。 这应该始终远大于作业在整个应用程序中运行的最长时间。 这里的绝对最大量是60分钟。
现在 Horizon 带有一个平衡策略,您可以在其中定义进程(工人)的最小和最大数量,它的策略使用
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
Horizon 在这里提供的功能是根据队列中存在的工作负载量增加或减少进程(工作人员)的数量。
如果您定义如下主管配置:
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'events', 'xls', 'whatever'],
'balance' => 'auto',
'minProcesses' => 10,
'maxProcesses' => 40,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
],
],
然后所有 4 个队列, default
, events
, xls
和whatever
在相同条件下运行的队列,总共有 40 个可用的工作人员,最少 10 个。所以不是每个队列都有 40 个可用的工作人员,但所有队列都有 40 个工作人员(进程) 可用的。
为每个队列获得最佳工作规模的关键点是将它们分为不同的类别,例如
short-load
-> 每个作业大约需要 1 到 5 秒。medium-load
-> 每个作业大约需要 5 到 30 秒。long-load
-> 每个作业最多需要 5 分钟。extreme-load
-> 每个作业需要超过 5 分钟,最多一个小时。 如果您最终只有两种情况,例如short-load
和long-load
,那么您将有两种 horizon 配置,这将定义 supervisor 对产生新工人的响应速度以及它将尝试多少次重复一项失败的工作(你真的不想尝试一项在 59 分钟后每次都会失败 3 次的工作)。
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'events'],
'balance' => 'auto',
'minProcesses' => 10,
'maxProcesses' => 40,
'balanceMaxShift' => 10,
'balanceCooldown' => 1,
'tries' => 3,
],
'supervisor-long-run' => [
'connection' => 'redis',
'queue' => ['xls', 'whatever'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 1,
],
],
],
在你最近的评论之一中,你问
我想了解你所做的所有这些计算,它的公式是什么
公式是, 1 个主管实例可以有多个队列,并且所有这些队列都有最大数量的可用工作人员。 队列不是那么重要,但是在一定时间内放置在这些队列中的作业数量(以及作业的种类)是.
例子:
4 个队列每分钟产生 120 个作业,需要x
数量的工人来处理。 如果您增加(或减少)工作人员(进程)的数量,则处理所有这些作业直到队列为空所需的时间与您提供的工作人员数量有关。
如果 1 个作业需要 10 秒才能完成(作为示例平均值)并且平均每分钟有 120 个作业放入队列。 如果您想在一分钟内处理(清除队列)所有作业,则需要120 个作业* 每个作业10 秒/一分钟60 秒= 在 1 分钟内完成所有这些作业所需的工作人员(进程)数量.
所以是的,您可以将工作人员数量增加到 64、512 或 24890。这又回到了您的硬件可以处理多少负载的问题。
希望这是有道理的。
明天我将只使用工作人员、进程或实例来清理文本……真是一团糟;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.