Skip to content

Workers & Performance

import { Aside } from ‘@astrojs/starlight/components’;

Odoo uses a multi-process architecture with workers to handle concurrent requests. Properly configuring workers is key to good performance.

Odoo workers are separate processes that handle incoming HTTP requests. More workers means more concurrent requests can be processed simultaneously.

  • 0 workers — Single-threaded mode (development only)
  • 1 worker — Handles one request at a time, suitable for light usage
  • 2+ workers — Handles multiple concurrent requests
UsageConcurrent UsersWorkersRAMCPU
Development1-212 GB1 vCPU
Small team5-1024 GB2 vCPU
Medium team10-3048 GB4 vCPU
Large team30-100816 GB8 vCPU
  1. Go to your instance → Settings → Performance
  2. Adjust the worker count
  3. Click Save — Deploy Monkey restarts the instance with the new configuration
PlanMax Workers
Free1
Base2
ProUnlimited
AgencyUnlimited

Odoo uses a separate cron worker to execute scheduled actions (automated emails, inventory checks, etc.). Deploy Monkey allocates:

  • 1 cron worker by default for all instances
  • This worker does not count toward your worker limit

Each worker has memory limits to prevent runaway processes:

SettingDefaultDescription
limit_memory_soft2 GBWorker is recycled after exceeding this
limit_memory_hard2.5 GBWorker is killed immediately
limit_time_cpu60sMax CPU time per request
limit_time_real120sMax wall-clock time per request

Deploy Monkey monitors your worker processes in real-time to help you understand when scaling is needed.

During regular server health checks (every 5 minutes), Deploy Monkey:

  1. Identifies all Odoo/Python worker processes in your container
  2. Measures CPU usage over a 0.5-second window
  3. Classifies workers as busy (consumed CPU) or idle
  4. Calculates usage percentage: busy workers ÷ configured workers × 100

Worker usage appears in two places:

  1. Instance Monitoring tab — worker usage chart alongside health metrics
  2. Worker Usage APIGET /api/v1/instances/{id}/worker-usage for programmatic access
Usage LevelRecommendation
< 60%Normal — no action needed
60-80%Moderate — monitor during peak hours
> 80%High pressure — consider adding workers
> 95%Critical — users may experience slow responses
  • Vacuum regularly — Odoo runs auto-vacuum, but large databases benefit from manual vacuum during maintenance windows
  • Index custom fields — If you query custom fields frequently, add database indexes
  • Archive old records — Move old sales orders, leads, and logs to archive
  • Enable proxy mode — Already configured by Deploy Monkey (proxy_mode = True)
  • Tune db_maxconn — Database connections per worker. Default is 64, which works for most setups
  • Use --load=base,web — Only load necessary server-wide modules
  • Use SSDs — Odoo is I/O intensive; SSDs make a significant difference
  • Adequate RAM — Underprovised RAM leads to swap usage, which kills performance
  • Fast CPU — Single-thread performance matters more than core count for Odoo
  • Minimize custom module complexity — Avoid heavy computations in compute fields
  • Use read_group for reporting — Instead of loading all records and computing in Python
  • Batch operations — Use write on recordsets instead of looping with individual writes

Odoo uses longpolling for real-time features like chat and notifications. Deploy Monkey configures a dedicated longpolling port and routes it through Nginx automatically.

The longpolling process:

  • Runs on a separate port (default 8072)
  • Handles WebSocket-like connections for real-time updates
  • Is proxied through Nginx at /longpolling/poll
  • Does not count toward your worker limit