Odoo中的“worker”是什么?

10

工人的目的是什么?这些工人是用于多线程还是其他什么用途?当 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 有什么区别?说实话,我不知道它们各自的作用。


请访问此链接:https://github.com/DocCyblade/tkl-odoo/blob/master/overlay/etc/odoo/openerp-server.conf#L395 - Prakash Kumar
@prakash 的链接已失效。 - vildhjarta
2个回答

26

定义

这在Odoo文档这里有解释。

Odoo包括内置的HTTP服务器,可以使用多线程或多进程。

对于生产环境,建议使用多进程服务器,因为它增加了稳定性,更好地利用计算资源,并且可以更好地监视和限制资源。

通过配置 :option:非零数量的工作进程 <odoo.py --workers>启用多进程,工作进程的数量应基于机器上的核数(可能还要考虑cron工作量)。 工作程序可以根据硬件配置进行配置,以避免资源耗尽。警告

注意:当前Windows不支持多处理模式

配置

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

workers = --workers <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。在多线程模式下,这些工人是线程,在多进程模式下是进程。

对于多进程模式,这是除HTTP工作进程外的额外设置。

有关部署架构的更多信息,包括一些图表。

有关配置文件的更多信息。

实际例子

我在上面的评论中添加了有关@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
注意:如果通知的最大内存小于总内存,则是故意这样设计的。因为在工作人员处理请求时,它们可以超出每个内存限制,所以在负载繁重的服务器下,内存可能会超过该限制。这就是为什么内置了“头部空间”的原因。

注意:如果通知的最大内存小于总内存,则是有意设计成这样。因为在工作人员处理请求时,它们可能会超出每个内存限制,因此在负载繁重的服务器下,内存可能会超过该限制。这就是为什么内置了“缓冲空间”的原因。

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

很抱歉,我仍然不明白为什么“768MB”等于“805306368”。你能解释一下吗? - SalahAdDin
1
@salahaddin 1MB = 1024kB1kB = 1024B。因此,768 x 1024 x 1024 = 805306368 B - ChesuCR

4
您可能已经知道 GIL 会阻止 Python 进行任何真正的线程操作。
为了更好地理解工作器,让我们看看没有它们会发生什么:
如果没有启用工作程序,则您的 odoo 实例仅在托管计算机上使用一个内核,因此一旦客户端数量超过一个,性能就会下降,因为新客户端需要等待轮流使用 odoo 资源。
通常,生产服务器会有多个内核,因此需要根据机器资源扩展 odoo。简单地说,workers 就相当于在同一台机器上启动多个 odoo 实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接