
OpenProject 性能调优与水平扩展实战指南Web Worker、后台 Worker 与 Kubernetes 部署配置【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject导读本指南以 OpenProject 官方运维文档 docs/installation-and-operations/operation/scaling/README.md 为核心系统讲解如何通过环境变量与部署配置对 OpenProject 进行性能调优与水平扩展。你将掌握一组与性能直接相关的OPENPROJECT_*环境变量的含义与默认值、Packaged 安装下使用openproject config:set与openproject scale命令调整 Web/后台 Worker 数量的完整流程以及 docker-compose 和 Kubernetes/Helm 两种容器化部署的扩展方式并了解底层 Puma、GoodJob、Rack::Timeout 的实现原理。OpenProject 的并发模型是多进程Worker多线程ThreadWeb 请求由 Puma 服务器处理邮件投递、项目复制、备份、资源删除等异步任务则由后台 WorkerGoodJob处理。调优的核心就是在这两种 Worker 的数量、线程数与可用内存之间找到平衡。一、与性能相关的核心环境变量OpenProject 的配置系统以OPENPROJECT_为环境变量前缀定义于 config/constants/settings/definition.rb#L34配置名中的下划线在环境变量中要写成双下划线例如web_max_threads→OPENPROJECT_WEB_MAX__THREADS见 definition.rb#L1885-L1891。以下六个环境变量直接决定 OpenProject 的性能表现环境变量含义源码默认值OPENPROJECT_WEB_WORKERS处理 HTTP 请求的 Web WorkerPuma 进程数量。在 Kubernetes 部署中该值通过服务的副本数replicas来体现2见 definition.rb#L1418-L1429OPENPROJECT_WEB_TIMEOUT单个请求的最大处理时间秒超时后请求被终止生产环境120其他环境0不超时OPENPROJECT_WEB_WAIT__TIMEOUT请求在队列中等待被处理的最长时间秒30OPENPROJECT_WEB_MIN__THREADS每个 Web Worker 的最小线程数4OPENPROJECT_WEB_MAX__THREADS每个 Web Worker 的最大线程数16OPENPROJECT_GOOD__JOB__MAX_THREADS后台 WorkerGoodJob的最大线程数20见 definition.rb#L594-L599这些默认值定义在 config/constants/settings/definition.rb 的web配置节中definition.rb#L1418-L1429web: description: Web worker count and threads configuration default: workers 2, timeout Rails.env.production? ? 120 : 0, wait_timeout 30, min_threads 4, max_threads 16, term_on_timeout 1对应的配置辅助方法定义在 lib_static/open_project/configuration/helpers.rb#L179-L201它们同时支持若干传统环境变量别名RACK_TIMEOUT_SERVICE_TIMEOUT可覆盖web_timeoutRACK_TIMEOUT_WAIT_TIMEOUT可覆盖web_wait_timeoutRAILS_MIN_THREADS/RAILS_MAX_THREADS可分别覆盖web_min_threads/web_max_threads。环境变量如何作用于 Puma在 config/puma.rb 中这些配置被直接接入 Puma 服务器threads_min_count OpenProject::Configuration.web_min_threads threads_max_count OpenProject::Configuration.web_max_threads threads threads_min_count, [threads_min_count, threads_max_count].max workers OpenProject::Configuration.web_workers也就是说一个 OpenProject Web 实例的并发上限约为workers × max_threads进程数乘以每进程最大线程数。调整任一维度都会线性影响实例能承载的并发请求量。超时机制Rack::Timeout 的启用条件从 config/initializers/rack_timeout.rb#L31-L47 可以看到一个容易被忽略的细节# Use rack-timeout if we run in clustered mode with at least 2 workers # so that workers, should a timeout occur, can be restarted without interruption. if OpenProject::Configuration.web_workers 2 service_timeout OpenProject::Configuration.web_timeout wait_timeout OpenProject::Configuration.web_wait_timeout ... Rails.application.config.middleware.insert_before( Rack::Runtime, Rack::Timeout, service_timeout:, wait_timeout:, term_on_timeout:, service_past_wait: true )只有当OPENPROJECT_WEB_WORKERS 2集群模式时OPENPROJECT_WEB_TIMEOUT和OPENPROJECT_WEB_WAIT__TIMEOUT才会真正生效。这样设计是为了保证超时发生时该 Worker 可以被无中断地重启单 Worker 模式不启用超时中间件。数据库连接池的联动调优Web 线程与后台线程共享数据库连接池调整线程数时必须同步关注连接池大小。见 config/initializers/database_pool_size.rb生产环境连接池大小会被自动提升为max(web_max_threads 1, 配置中的 pool 值)本地/开发环境启动时会检查web_max_threads good_job_max_threads GoodJob 工具连接数是否超过配置的 pool 值不足则打印警告提示通过database.yml的pool参数或DATABASE_URL中的?poolN调整。因此调大OPENPROJECT_WEB_MAX__THREADS或OPENPROJECT_GOOD__JOB__MAX_THREADS时建议同步评估数据库连接池是否足够避免出现线程等连接的性能瓶颈。二、Packaged 安装调整 Web 进程与后台 WorkerPackaged 安装deb/rpm 包方式是 OpenProject 自托管最常见的形态之一。官方推荐至少配置4 个 Web 进程从 9.0.3 版本起打包安装的默认值即为 4注意这与上文源码级默认值2不同打包安装环境通过额外配置覆盖了该默认值。每个 Web Worker 大约占用300–400MB RAM扩容前请先评估系统的可用内存。2.1 查看与设置 Web Worker 数量首先检查当前的进程数sudo openproject config:get OPENPROJECT_WEB_WORKERS如果命令返回空则使用默认进程数4。要调整进程数执行sudo openproject config:set OPENPROJECT_WEB_WORKERSnumber其中number为 1 到round(AVAILABLE_RAM * 1.5)之间的正整数AVAILABLE_RAM为系统可用内存单位 GB即进程数上限约为可用内存的 1.5 倍向上取整。修改后重启 Web 进程使配置生效sudo openproject restart web2.2 调整后台 Worker 数量后台 Worker 由 GoodJob 驱动packaging/scripts/worker 中的启动命令为QUIETtrue bundle exec good_job start。默认只启动1 个后台 Worker 进程它负责邮件投递、项目复制、执行备份以及删除资源等异步任务。官方建议配置2 个后台 Worker 进程。设置后台 Worker 进程数sudo openproject scale workernumber同样地number为 1 到round(AVAILABLE_RAM * 1.5)之间的正整数。执行后对应的 systemd 服务会被自动创建或删除如果输入值与当前值相同命令会输出Nothing to do.在后台线程方面config/application.rb#L202-L215 展示了 GoodJob 的完整接线config.active_job.queue_adapter :good_job config.good_job.retry_on_unhandled_error false config.good_job.execution_mode :external config.good_job.preserve_job_records true config.good_job.queues OpenProject::Configuration[:good_job_queues] config.good_job.max_threads OpenProject::Configuration[:good_job_max_threads] config.good_job.enable_cron OpenProject::Configuration[:good_job_enable_cron] config.good_job.shutdown_timeout 30 config.good_job.smaller_number_is_higher_priority true相关配置的默认值可在 config/constants/settings/definition.rb#L588-L621 中找到good_job_queues默认*处理所有队列good_job_max_threads默认20good_job_max_cache默认10000good_job_enable_cron默认truegood_job_cleanup_preserved_jobs_before_seconds_ago默认7.days。当后台任务积压时可以优先考虑提高OPENPROJECT_GOOD__JOB__MAX_THREADS以提升单个 Worker 的吞吐。三、All-in-One Docker 安装不支持扩展All-in-One Docker 安装方式没有任何横向或纵向扩展的手段。这是该部署形态的明确设计限制单容器内 Web 与后台任务运行在一起进程与资源都不可拆分调整。如果预期负载会增长官方建议直接改用docker-compose 或 Kubernetes 部署以获得完整的扩展灵活性。这也可以理解为一种架构取舍All-in-One 容器的价值在于开箱即用的简单性而非可扩展性。四、docker-compose 安装通过 .env 调整 Worker 数docker-compose 部署下扩展方式与 Packaged 安装类似只是配置入口变为环境变量文件。编辑部署目录下的.env文件加入或修改OPENPROJECT_WEB_WORKERSnumber其中number为 1 到round(AVAILABLE_RAM * 1.5)之间的正整数。修改后需要重新创建容器使环境变量生效docker compose up -d[!NOTE]Docker compose无法在多个实例之间进行水平扩展横向扩容除非借助额外的工具如负载均衡器与共享存储方案。它对副本数的控制能力有限适合中小规模或单机多服务场景。作为对照仓库根目录的 docker-compose.yml#L56-L58 展示了开发环境下的相关配置OPENPROJECT_WEB_MAX__THREADS: 1、OPENPROJECT_WEB_MIN__THREADS: 1、OPENPROJECT_WEB_WORKERS: 0——即开发模式刻意关闭多进程、使用单线程以减少资源占用并简化调试这从侧面印证了这些变量对运行形态的直接控制力。五、Kubernetes 与 Helm Charts水平扩展的正确姿势对于需要真正水平扩展的生产环境Kubernetes / Helm 是官方推荐的部署方式。扩展核心是在 Helm 的values.yaml中调整副本数与资源配额具体涉及四个关键项增加replicaCount控制 OpenProject Web 实例副本数量对应 Web 请求处理能力增加backgroundReplicaCount控制后台 Worker 实例数量对应异步任务处理能力调整workers段的副本数按 Worker 类型分别提升replicas保证资源分配充足相应地提升 CPU 与内存的 requests/limits。一个典型的扩展配置示例如下来自原文档# Web deployment containers replicas replicaCount: 2 # Web deployment resources resources: requests: memory: 512Mi cpu: 250m limits: memory: 4Gi cpu: 4 # Worker deployment workers: default: replicas: 1 # Keep 1 worker resources: requests: memory: 512Mi cpu: 250m limits: memory: 4Gi cpu: 4其中replicaCount相当于把OPENPROJECT_WEB_WORKERS的职责上移到 Kubernetes 层如原文档所述in Kubernetes deployments, this value is applied using replicas of the services。资源段requests/limits则为每个副本提供调度依据与硬性上限建议结合前文每个 Web Worker 约 300–400MB RAM的经验值进行规划。扩展时的配套检查清单在 Kubernetes 中上调副本数或线程数后建议按以下顺序检查配套配置数据库连接连接池上限是否覆盖web_max_threads good_job_max_threads的总需求参考 config/initializers/database_pool_size.rb必要时提高数据库 max_connections会话与缓存多副本场景下需要共享会话/缓存存储如 Memcached/Redis确保各副本状态一致附件存储水平扩展要求附件存储本地盘或对象存储对多副本可见后台任务去重GoodJob 基于数据库表good_jobs调度多 Worker 实例天然共享任务队列但需确认good_job_queues默认*与各 Worker 类型的职责划分符合预期超时中间件由于web_workers 2时才会启用 Rack::Timeout见 config/initializers/rack_timeout.rbKubernetes 多副本部署天然满足该条件建议同时确认OPENPROJECT_WEB_TIMEOUT与OPENPROJECT_WEB_WAIT__TIMEOUT的取值符合业务预期。六、调优经验与常见误区进程数并非越多越好Web Worker 每个占用约 300–400MB RAM后台 Worker 也有相似的内存开销。进程数超过round(AVAILABLE_RAM * 1.5)会导致系统内存耗尽、触发 swap 甚至 OOM。调优时始终遵循先看内存再定进程数的顺序。进程与线程的比例权衡增加OPENPROJECT_WEB_WORKERS进程数提升多核 CPU 利用率与故障隔离能力代价是内存线性增长增加OPENPROJECT_WEB_MAX__THREADS线程数在不增加内存的前提下提升单进程并发但会放大对数据库连接池的压力且受 Ruby 应用自身线程安全与 I/O 模型的约束。后台任务积压的处理顺序先确认是进程不够还是单进程吞吐不够任务量大但单个任务耗时短优先增加 Worker 进程数openproject scale workerN任务本身耗时长如大批量邮件、大项目复制优先提高OPENPROJECT_GOOD__JOB__MAX_THREADS默认 20让单个进程并行处理更多任务同时关注数据库连接池是否同步扩容。总结OpenProject 的性能调优本质上是在内存预算、Web 并发、后台并发三个维度上做平衡Packaged 安装用openproject config:set/openproject scale命令调整docker-compose 用.env中的OPENPROJECT_WEB_WORKERS调整Kubernetes/Helm 则通过replicaCount、backgroundReplicaCount与workers.replicas做真正的水平扩展。无论哪种部署形态都建议以系统可用内存为出发点参照本文给出的默认值、取值范围与配套检查清单逐步验证并在调整后观察 Puma 队列长度、后台任务积压量与数据库连接占用等指标迭代出适合自身负载的配置组合。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考