在幼年地平线上,maxProcessessupervisorsqueue的总数之间有没有什么经验法则或逻辑关系?

What if I have 15 supervisors and 40 queues (each supervisor has multiple queues based on their category)? What is the maximum number of maxProcesses I can assign to each supervisor (suppose balancing auto)?
I want to know that if there's a rule of thumb for a better performance on horizon by tuning these numbers, for example if the number of supervisor-x should not exceed the total number of queues and if the maxProcesses should not exceed a certain number based on the OS spec running the processes.

这些数字之间有没有什么逻辑关系?有没有关于这个问题的好文件?我已经看到了this document on supervisorLaravel Horizon docs,但还没有找到我问题的答案.

推荐答案

我需要详细地解释这些事情,才能理解所有这些事情之间的关系.

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 the manual:

Supervisor将启动与Numpros指定的相同数量的此程序实例.请注意,如果number pros>;1,则PROCESS_NAME表达式中必须包含%(PROCESS_NUM)s(或包含PROCESS_NUM的任何其他有效的Python字符串表达式).

运行名为artisan queue:work的程序的Supervisor的这种配置将创建8artisan queue:work的实例(进程、工作进程等).这意味着可以处理8个作业(job)simultaneously个,不多也不少.

Horizon并不是definenumprocs,你唯一需要知道的重要设置是stopwaitsecs=3600.这应该始终远远大于作业(job)在整个应用程序中运行的最大时间.在这里,绝对最大时长将是60分钟.

现在,Horizon提供了balancing strategy,您可以在其中定义进程(工作进程)的最小和最大数量以及它的策略

'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个.因此,not每个队列有40个工作进程可用,但所有队列加在一起有40个工作进程可用.

这里的关键点是让每个队列有一个良好的规模以最佳方式工作,关键是将它们划分为不同的类别,例如

  • 每项作业(job)大约需要1到5秒.
  • 每项作业(job)大约需要5到30秒.
  • long-load->;每个作业(job)最多需要5分钟.
  • 每项作业(job)花费的时间超过5分钟,最长可达1小时.

如果您最终只有两个方案,如short-loadlong-load,那么您将有两种Horizon配置,以这种方式定义Supervisor将以多快的速度响应生成新的Worker,以及如果作业(job)失败,它将try 重复作业(job)的次数(在这种情况下,您非常不希望try 在59分钟3次后每次都失败的作业(job)).

'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,
        ],
    ],
],

在你问的最后一条 comments 中

我想了解你做的所有计算,它的公式是什么

公式是,1个Supervisor实例可以有多个队列,并且所有这些队列都有最大数量的可用工作线程.队列是not个同样重要的队列,但是放置在这些队列in a certain amount of time is中的amount个作业(job)(以及作业(job)的种类).

Example:

每分钟产生120个作业(job)的4个队列,需要x个工人来处理.如果您放大(或缩小)工作线程(进程)的数量,则处理所有这些作业(job)直到队列为空所需的时间与您提供的可用工作线程数量有关.

  • 如果您有10个可用的工作人员,则将同时处理10个工作.
  • 如果您有120个可用的工人,那么将同时处理120个工作.

如果一个作业(job)需要10秒才能完成(例如,平均值),并且平均有120个作业(job)被放入一个队列,则需要each分钟.如果您希望在one分钟内处理(清除队列)所有作业(job),则每个作业(job)需要120 jobs*10 seconds/60 seconds立即=在1分钟内完成所有这些作业(job)所需的工人(进程)数量.

因此,是的,你可以将员工数量扩大到64512人或24890人.这一切都回到了问题how much load can your hardware handle.

希望这是有意义的.

明天我将仅使用工作进程、进程或实例来清理文本.真是一团糟.)

Laravel相关问答推荐

从8.0更新到10.0后,图像不再上传到存储

找不到 Laravel 5 类日志(log)

FileViewFinder.php 第 137 行中的 Laravel 5 InvalidArgumentException:未找到视图 [.admin]

Laravel,没有shell 访问的转储自动加载

laravel 基本路径

验证规则 required_if 与其他条件(Laravel 5.4)

Eloquent 的集合方法,例如 only 或 except 返回一个空集合

Laravel Session 总是改变 Laravel 5.4 中的每个刷新/请求

Eager加载:在具有eloquent关系的枢轴上使用`with`

合并两个 Eloquent 集合并删除所有重复项.

Laravel Request::input 调用未定义的方法

Laravel 5 - 没有重叠的任务计划不起作用

在 Laravel 中将 Public 添加到assets资源路径

在 Laravel 中生成随机数

Laravel 5 与 Postgresql

扩展 Eloquent 的类的构造函数

Laravel - 语法错误,文件意外结束

Laravel 4:将什么作为参数传递给 Url 类?

assets资源不引用公用文件夹(Laravel)

在 Laravel 中软删除父记录时如何软删除相关记录?