解析Odoo的配置文件中的参数

在Odoo的配置文件中有许多的配置参数,合理的配置这些参数可以使Odoo更高效的运行,本篇文章会结合源码以及官方文档对一些参数进行解析,方便开发人员更深入的理解参数背后的含义。

workers

Odoo根据workers的数量,会使用不同的服务器来处理请求。

  • 如果workers的值为0,Odoo会使用多线程服务器来处理请求,服务器接收到请求后会为请求生成一个新的线程。该服务器受限于Python的GIL,不能充分利用硬件性能,但是该服务器对操作系统的兼容性很好,通常在开发环境下会使用该服务器。
  • 如果workers的值大于0,Odoo会使用多进程服务器来处理请求,该服务在启动时会创建一个基于workers配置值的进程池,请求会存入到队列中,等待空闲进程进行处理,多进程环境下会运行一个可配置的进程监控,监控进程的资源使用情况以及对失败的进程进行结束/重启操作。多进程服务器充分利用了硬件性能,在生产环境中应该使用该配置。
    • 注意:多进程服务器只支持Linux系统

根据硬件计算workers数量

  • 经验公式:workers = (CPU * 2) + 1
  • 一个worker可以处理6个并发请求
  • 如果一个Odoo实例需要支持的最大并发数量为54,则服务器需要配置4核的CPU,计算公式:((54/6) - 1) / 2 = 4

limit_time_cpu

workers数量大于0时,Odoo使用多进程服务器,该配置项限制进程处理请求所占用的CPU时间(时间片的总和),例如limit_time_cpu=60,则请求只能使用60秒的CPU时间。

  • 时间片:CPU在运行时不会一直运行单一进程,而是在进程之间不断切换,一个进程允许运行的时间即一个时间片

limit_time_cpu通过操作系统提供的方法对worker占用的资源进行限制,源码

python 复制代码
def check_limits(self):
    ...
    # update RLIMIT_CPU so limit_time_cpu applies per unit of work
    # resource为Python的内置模块
    # getrusage(get resource usage?)方法用于获取资源占用情况
    # 参数resource.RUSAGE_SELF代表获取进程本身的资源占用,还支持其他参数,例如:resource.RUSAGE_CHILDREN子,可以获取紫禁城
    r = resource.getrusage(resource.RUSAGE_SELF)
    # CPU时间包含用户态时间utime(user time)与内核态时间stime(system time)  
    cpu_time = r.ru_utime + r.ru_stime
    # 获取资源的大小限制,soft(软限制)/hard(硬限制),硬限制是用来指定软限制能设定的最大值,由系统管理员通过设置系统级参数来决定
    soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
    # 这里与cpu_time相减目的是将执行限制指令之前的CPU时间排除掉
    # `setrlimit`(*resource*, *limits*) 设置资源的大小限制,limits必须是格式(soft,hard),soft/hard都必须为整数
    resource.setrlimit(resource.RLIMIT_CPU, (int(cpu_time + config['limit_time_cpu']), hard))

limit_time_real

多进程模式下worker执行的最大实际时间。

  • 实际时间(real time): CPU时间+CPU切换到其他进程时的等待时间

通过进程监控实现资源的限制,源码

python 复制代码
def process_timeout(self):
    now = time.time()
    for (pid, worker) in self.workers.items():
        # watchdog_timeout即配置文件中的limit_time_real
        if worker.watchdog_timeout is not None and \
                (now - worker.watchdog_time) >= worker.watchdog_timeout:
            _logger.error("%s (%s) timeout after %ss",
                          worker.__class__.__name__,
                          pid,
                          worker.watchdog_timeout)
            self.worker_kill(pid, signal.SIGKILL)
相关推荐
程序员岳焱1 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*2 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅2 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头2 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
IT_10243 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
bobz9653 小时前
动态规划
后端
stark张宇3 小时前
VMware 虚拟机装 Linux Centos 7.9 保姆级教程(附资源包)
linux·后端
亚力山大抵4 小时前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask
超级小忍4 小时前
Spring Boot 中常用的工具类库及其使用示例(完整版)
spring boot·后端
CHENWENFEIc5 小时前
SpringBoot论坛系统安全测试实战报告
spring boot·后端·程序人生·spring·系统安全·安全测试