Odoo 中的“工人”是啥?

Posted

技术标签:

【中文标题】Odoo 中的“工人”是啥?【英文标题】:What is a "worker" in Odoo?Odoo 中的“工人”是什么? 【发布时间】:2016-06-25 10:10:36 【问题描述】:

工人的目的是什么?这些工人是用于多线程还是其他?当Odoo 实例启动时,我在命令行上看到至少 6 个工作人员通知:

2016-03-10 13:55:09,602 15504 INFO ? openerp.service.server: Worker WorkerHTTP (15504) alive
2016-03-10 13:55:09,606 15503 INFO ? openerp.service.server: Worker WorkerHTTP (15503) alive
2016-03-10 13:55:09,625 15507 INFO ? openerp.service.server: Worker WorkerCron (15507) alive
2016-03-10 13:55:09,628 15506 INFO ? openerp.service.server: Worker WorkerCron (15506) alive
2016-03-10 13:55:09,629 15508 INFO ? openerp.service.server: Worker WorkerCron (15508) alive
2016-03-10 13:55:09,629 15509 INFO ? openerp.service.server: Worker WorkerCron (15509) alive

WorkerHTTPWorkerCron 有什么区别?老实说,我不知道他们在做什么。

【问题讨论】:

访问此链接 s://github.com/DocCyblade/tkl-odoo/blob/master/overlay/etc/odoo/openerp-server.conf#L395 @prakash 链接已失效。 【参考方案1】:

定义

在Odoo文档here中有解释

Odoo 包括内置 HTTP 服务器,使用多线程或 多处理。

对于生产使用,建议使用多处理 服务器,因为它增加了稳定性,可以更好地利用 计算资源,可以更好地监控和 资源受限。

通过配置:option:a non-zero number of worker processes <odoo.py --workers>启用多处理,worker的数量应该 取决于机器中的核心数量(可能有一些 cron 工作人员的空间取决于预测的 cron 工作量) 工作人员限制可以根据硬件配置进行配置,以 避免资源耗尽警告

注意:多处理模式目前在 Windows 上不可用

配置

您应该使用 2 个工作线程 + 每个可用 CPU 1 个 cron 线程,每 10 个并发用户使用 1 个 CPU。确保在配置文件中调整内存限制和 CPU 限制。

workers = --workers <count>

如果 count 不为 0(默认值),则启用多处理并设置指定数量的 HTTP 工作者(处理 HTTP 和 RPC 请求的子进程)。

许多选项允许限制和回收工人:

--limit-request <limit>

工作人员在被回收和重新启动之前将处理的请求数。默认为 8196。

--limit-memory-soft <limit>

每个工作人员允许的最大虚拟内存。如果超出限制,则在当前请求结束时将工作人员杀死并回收。默认为 640MB。

--limit-memory-hard <limit>

虚拟内存的硬限制,任何超过限制的工作人员将立即被杀死,而无需等待当前请求处理结束。默认为 768MB。

--limit-time-cpu <limit>

防止工作人员对每个请求使用超过 CPU 秒数。如果超过限制,工人将被杀死。默认为 60。

--limit-time-real <limit>

防止工作人员花费超过几秒钟的时间来处理请求。如果超过限制,工人将被杀死。默认为 120。

--limit-time-cpu 的不同之处在于这是一个“挂墙时间”限制,包括例如SQL 查询。

--max-cron-threads <count>

致力于 cron 作业的工人数量。默认为 2。workers 是多线程模式下的线程和多处理模式下的进程。

对于多处理模式,这是对 HTTP 工作进程的补充。

More info about Deployment Architecture, with some diagram.

More information about the configuration file

实例

我在上面的评论中添加@prakah link 的信息:

Heading            | Description 
------------------ | ---------------------------------------------------------
CPUs               | Number of CPU Cores not threads
Physical           | Physical memory, not virtual or swap
workers            | Number of workers specified in config file (workers = x)
cron               | Number of workers for cron jobs (max_cron_threads = xx)
Mem Per            | Memory in MB that is the max memory for request per worker
Max Mem            | Maximum amount that can be used by all workers 
limit_memory_soft  | Number in bytes that you will use for this setting

注意:如果通知小于总内存,则为 Max Memory,这是故意的。作为 工作人员处理他们可以增长超出 Mem Per 限制的请求,因此 重负载下的服务器可能会超过这个数量。这就是为什么有 是内置的“头部空间”。

CPUs | Physical | workers | cron | Mem Per | Max Mem | limit_memory_soft  
---- | -------- | ------- | ---- | ------- | ------- | -----------------------
ANY  | =< 256MB |    NR   |  NR  |      NR |     NR  | NR
 1   |   512MB  |    0    |  N/A |     N/A |     N/A | N/A
 1   |   512MB  |    1    |  1   |   177MB |   354MB | 185127901
 1   |    1GB   |    2    |  1   |   244MB |   732MB | 255652815
 1   |    2GB   |    2    |  1   |   506MB |  1518MB | 530242876
 2   |    1GB   |    3    |  1   |   183MB |   732MB | 191739611
 2   |    2GB   |    5    |  2   |   217MB |  1519MB | 227246947
 2   |    4GB   |    5    |  2   |   450MB |  3150MB | 471974428
 4   |    2GB   |    5    |  2   |   217MB |  1519MB | 227246947
 4   |    4GB   |    9    |  2   |   286MB |  3146MB | 300347363
 4   |    8GB   |    9    |  3   |   546MB |  6552MB | 572662306  
 4   |    16GB  |    9    |  3   |  1187MB | 14244MB | 1244918057

【讨论】:

对不起,我还是不明白为什么768MB805306368。你能解释一下吗? @salahaddin 1MB = 1024kB, 1kB = 1024B。所以768 x 1024 x 1024 = 805306368 B【参考方案2】:

您可能知道GIL 阻止 Python 执行任何真正的线程处理

为了更好地了解工人,让我们看看没有他们会发生什么:

在没有启用工作器的情况下,您的 odoo 实例仅使用主机中的一个核心,因此一旦客户端数量超过一个,性能就会下降,因为新客户端需要等待轮到使用 odoo 资源。

通常生产服务器会有多个内核,因此需要在机器资源上扩展 odoo;简单地说,工人在某种程度上等于在同一台机器上启动多个 odoo 实例。

【讨论】:

以上是关于Odoo 中的“工人”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的窗口是啥?

工人、工人实例和执行者之间的关系是啥?

编程中“工人”的概念是啥意思?

从odoo中的日期计算Odoo Days?

工人 puma 日志提前终止是啥意思,为啥会发生?

odoo14开发侧权限配置