Laravel层位限制和优化

y1aodyip  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(121)

maxProcessessupervisors的数目和laravel horizon中queue的总数之间是否有任何经验法则或任何逻辑关系?
如果我有15个主管和40个队列(每个主管根据其类别有多个队列),我可以分配给每个主管的最大maxProcesses数是多少(假设平衡auto)?
我想知道,是否有一个经验法则,可以通过调整这些数字来提高性能,例如,supervisor-x的数量是否不应超过队列总数,maxProcesses是否不应超过基于运行进程的操作系统规范的某个数字。
这些数字之间有什么逻辑关系吗?有没有关于这个问题的好文档?我看过this document on supervisor,也看过Laravel Horizon docs,但没有找到我问题的答案。

lxkprmvk

lxkprmvk1#

我需要详细地解释事物以便理解所有这些事物之间的关系。
管理员存在于一些简单的设置之外。最重要的一次是这些:

[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=8supervisor the manual的设置是:
Supervisor将启动numprocs所命名的程序示例。注意,如果numprocs〉1,process_name表达式必须包含%(process_num)s(或任何其他包含process_num的有效Python字符串表达式)。
这个运行一个叫做artisan queue:work的程序的supervisor的配置将创建artisan queue:work8个示例(进程、工作者,同样的东西)。这意味着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个队列defaulteventsxlswhatever都在相同的条件下运行,总共将有40个工作进程可用,最少为10个。因此,不是每个队列有40个工作进程可用,而是所有队列加起来有40个工作进程(进程)可用。
要使每个队列都能以最佳方式工作,关键是要将它们划分为不同的类别,例如

  • short-load-〉每个作业大约需要1到5秒。
  • medium-load-〉每个作业大约需要5到30秒。
  • long-load-〉每个作业最多需要5分钟。
  • extreme-load-〉每个作业所需时间超过5分钟,最多可达1小时。

如果您最终只有两个场景,如short-loadlong-load,那么您将有两个配置的地平线,以这种方式将定义如何快速主管将响应产生新的工人,以及多少次,它将尝试重复一个作业,如果它失败了(在那里你真的不想尝试一个作业,每次将失败后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数量的工作进程。如果增加(或减少)工作进程(进程)数量,则处理所有这些作业直到队列为空所需的时间与可用的工作进程数量有关。

  • 如果您有10个工人可用,则将同时处理10个工单。
  • 如果您有120个可用的工作进程,则将同时处理120个作业。

如果1个作业需要10秒才能完成(作为平均值示例),并且平均每 * 分钟 * 将120个作业放入队列。如果要处理(清除队列)* 一 * 分钟内的所有作业,您需要120个作业*每个作业10秒/一分钟 * 60秒 *=工作人员数量(进程)需要在1分钟内完成所有这些作业。
因此,您可以将工作线程的数量扩展到64、512或24890。这又回到了"您的硬件可以处理多少负载"的问题上。
希望这有意义。
我明天会清理文本,只使用工人,进程或示例..它是如此混乱;)

相关问题