Performance & Scalability serimizin bir parçası
Tam kılavuzu okuyunOdoo Performans Ayarlama: PostgreSQL ve Sunucu Optimizasyonu
Yavaş bir Odoo örneği, üretkenlik kaybına ve kullanıcıların hayal kırıklığına uğramasına neden olur. İyi haber: Odoo performans sorunlarının çoğu donanım yükseltmesi olmadan çözülebilir. Kötü haber: Temel nedeni teşhis etmek tüm yığının (Python, PostgreSQL, Nginx, Redis ve ağ katmanı) anlaşılmasını gerektirir.
Bu kılavuz, Odoo 19 Enterprise için performans optimizasyonu yaşam döngüsünün tamamını kapsar: darboğazları belirlemek, PostgreSQL'i ayarlamak, Odoo sunucu ayarlarını optimize etmek, Nginx önbelleğe almayı yapılandırmak ve kullanıcı sayınız ve işlem hacminiz için altyapınızı doğru boyutlandırmak.
Önemli Çıkarımlar
- PostgreSQL ayarlaması en büyük performans artışını sağlar (tipik kurulumlarda %50-300)
- Başlangıç noktası olarak, paylaşılan arabellekler kullanılabilir RAM'in %25'ine ayarlanmalıdır
- Odoo'nun ORM'si pg_stat_statements ile yakalanabilecek N+1 sorgu üretir
- Sık sık filtrelenen alanlardaki (şirket_kimliği, durum, tarih) dizinler zorunludur
- Nginx proxy önbelleğe alma, Odoo sunucusuna çarpmadan statik varlıklar sunar
- Çalışan yapılandırması eşzamanlı kullanıcı kapasitesini doğrudan etkiler
- Redis oturumunu önbelleğe alma, kimlik doğrulama için veritabanı yükünü azaltır
- Vakum ve analiz programlarının yüksek yazma gerektiren Odoo iş yüklerine göre ayarlanması gerekir
Diagnosing Performance Bottlenecks
Herhangi bir şeyi ayarlamadan önce, zamanın gerçekte nerede harcandığını belirleyin. Blind optimization wastes effort.
Enable Odoo query logging:
# odoo.conf
[options]
log_level = info
logfile = /var/log/odoo/odoo.log
# For SQL query logging (development/staging only):
log_handler = odoo.sql_db:DEBUG
Enable PostgreSQL slow query logging:
# /etc/postgresql/15/main/postgresql.conf
log_min_duration_statement = 1000 # Log queries taking > 1 second
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_lock_waits = on
pg_stat_statements'ı (en değerli PostgreSQL uzantısı) yükleyin:
-- Enable the extension
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Find the top 20 slowest queries
SELECT
round(total_exec_time::numeric, 2) AS total_ms,
calls,
round(mean_exec_time::numeric, 2) AS mean_ms,
round((100 * total_exec_time / sum(total_exec_time) OVER ())::numeric, 2) AS pct,
left(query, 100) AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;
-- Reset statistics after tuning to measure improvement
SELECT pg_stat_statements_reset();
Identify N+1 queries in Odoo:
Odoo bir kayıt listesi yüklediğinde ve ardından ilgili verileri getirmek için kayıt başına bir sorgu yaptığında N+1 sorgu oluşur. pg_stat_statements'ta buna benzer kalıpları arayın:
-- This query appearing 500 times in a single page load = N+1 problem
SELECT * FROM res_partner WHERE id = $1
Çözüm, Odoo'nun prefetch_ids mekanizmasını kullanmak veya ORM sorgunuza select eklemektir:
# Bad: triggers N+1 for partner on each order
for order in orders:
print(order.partner_id.name) # One query per order
# Good: prefetch partner data in one query
orders = self.env['sale.order'].search([...])
orders.mapped('partner_id') # Forces prefetch
for order in orders:
print(order.partner_id.name) # No additional queries
PostgreSQL Configuration Tuning
PostgreSQL, herhangi bir donanımda çalışacak şekilde tasarlanmış muhafazakar varsayılanlarla birlikte gelir. Bir Odoo üretim sunucusu için bu varsayılanların ayarlanması gerekir.
Memory settings (for a 32 GB RAM server):
# /etc/postgresql/15/main/postgresql.conf
# Shared buffers: 25% of RAM
shared_buffers = 8GB
# Work memory: per-operation memory for sorts/joins
# Start conservative, increase if you see disk sorts
work_mem = 64MB
# Maintenance work memory: for VACUUM, CREATE INDEX
maintenance_work_mem = 2GB
# Effective cache size: tells planner how much OS cache is available
# Set to 75% of total RAM
effective_cache_size = 24GB
# WAL settings for better write performance
wal_buffers = 256MB
checkpoint_completion_target = 0.9
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 1GB
Bağlantı ayarları:
# Maximum connections (Odoo workers × 2 + headroom)
max_connections = 200
# For connection pooling with PgBouncer
# If using PgBouncer, reduce to 50-100
Query planner settings:
# Enable parallel query execution
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
max_worker_processes = 16
# SSD storage: random_page_cost should equal seq_page_cost
random_page_cost = 1.1 # Default is 4.0 (for spinning disk)
seq_page_cost = 1.0
# Increase statistics target for better query plans on Odoo's large tables
default_statistics_target = 200
Autovacuum tuning for high-write workloads:
Odoo'nun envanter, muhasebe ve mesajlaşma modülleri yoğun INSERT/UPDATE trafiği oluşturur. Default autovacuum settings are insufficient:
autovacuum = on
autovacuum_max_workers = 5
autovacuum_naptime = 30s
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.01 # Vacuum when 1% of rows are dead
autovacuum_analyze_scale_factor = 0.005 # Analyze when 0.5% of rows change
autovacuum_vacuum_cost_delay = 2ms # Reduce I/O throttling
Critical Database Indexes
Eksik dizinler, zayıf yapılandırmadan sonra Odoo performans sorunlarının ikinci en yaygın nedenidir. Odoo, birincil anahtarlar ve bazı yabancı anahtarlar için dizinler oluşturur, ancak yaygın olarak filtrelenen alanların çoğunda dizinler yoktur.
pg_missing_fk_indexes görünümünü kullanarak eksik dizinleri kontrol edin:
-- Find foreign keys without indexes
SELECT
tc.table_name,
kcu.column_name,
ccu.table_name AS foreign_table_name,
pg_relation_size(tc.table_name::regclass) AS table_size
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage ccu
ON ccu.constraint_name = tc.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY'
AND NOT EXISTS (
SELECT 1 FROM pg_indexes pi
WHERE pi.tablename = tc.table_name
AND pi.indexdef LIKE '%' || kcu.column_name || '%'
)
ORDER BY table_size DESC;
Essential indexes for Odoo 19:
-- Sale orders (most queried table)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_sale_order_state
ON sale_order(state);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_sale_order_company_date
ON sale_order(company_id, date_order DESC);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_sale_order_partner
ON sale_order(partner_id) WHERE state != 'cancel';
-- Account moves (invoicing)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_account_move_state_type
ON account_move(state, move_type);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_account_move_company_date
ON account_move(company_id, invoice_date DESC);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_account_move_partner
ON account_move(partner_id) WHERE state = 'posted';
-- Account move lines (most queried for reconciliation)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_account_move_line_account_reconcile
ON account_move_line(account_id, reconciled, date);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_account_move_line_move_date
ON account_move_line(move_id, date);
-- Stock moves (inventory)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stock_move_state_product
ON stock_move(state, product_id);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stock_quant_product_location
ON stock_quant(product_id, location_id);
-- Mail messages (can grow very large)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_mail_message_res_model_id
ON mail_message(res_model, res_id);
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_mail_message_date
ON mail_message(date DESC);
-- IR rule performance (access control)
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_ir_rule_model_groups
ON ir_rule(model_id);
Odoo Worker Configuration
Odoo çalışanlarının sayısı, sunucunun kaç eşzamanlı isteği işleyebileceğini belirler.
Formula for worker count:
Workers = (CPU_cores × 2) + 1
Memory per worker: 256MB - 512MB depending on workload
Example for 8 CPU cores, 32GB RAM:
Workers = (8 × 2) + 1 = 17
Memory check: 17 × 512MB = 8.5GB (well within 32GB)
odoo.conf çalışan ayarları:
[options]
# Worker processes
workers = 17
# Limits to prevent runaway workers
limit_memory_hard = 2684354560 # 2.5GB hard limit (kills worker)
limit_memory_soft = 2147483648 # 2GB soft limit (triggers gc)
limit_time_cpu = 600 # CPU seconds per request
limit_time_real = 1200 # Wall clock seconds per request
limit_request = 8192 # Requests before worker restart
# Long polling (for live notifications)
longpolling_port = 8072
Çalışan türlerini anlama:
Odoo iki tür çalışan kullanır:
- HTTP çalışanları (
workersyapılandırma): Tüm web isteklerini yönetin - Cron çalışanları (1 ayrılmış): Planlanan eylemleri arka planda çalıştırın
Cron çalışanı her zaman çalışır ancak HTTP kapasitenize dahil edilmez. En yüksek yükte bile en az 1 cron çalışanının mevcut olduğundan emin olun.
Performans için Nginx Yapılandırması
Nginx, Odoo'nun önünde yer alır ve TLS sonlandırmasını, statik dosya sunumunu ve isteğe bağlı olarak önbelleğe almayı yönetir.
Yüksek performanslı Nginx yapılandırması:
upstream odoo {
server 127.0.0.1:8069 weight=1 fail_timeout=0;
}
upstream odoochat {
server 127.0.0.1:8072 weight=1 fail_timeout=0;
}
# Cache zone for static assets
proxy_cache_path /var/cache/nginx/odoo
levels=1:2
keys_zone=odoo_cache:100m
max_size=1g
inactive=60m
use_temp_path=off;
server {
listen 443 ssl http2;
server_name your-odoo.com;
# Gzip compression
gzip on;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1000;
gzip_comp_level 6;
# Static file caching
location /web/static/ {
proxy_cache odoo_cache;
proxy_cache_valid 200 7d;
proxy_cache_use_stale error timeout updating
http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
expires 7d;
proxy_pass http://odoo;
}
# Long polling for live chat/notifications
location /web/longpolling {
proxy_pass http://odoochat;
proxy_read_timeout 3600s;
proxy_connect_timeout 300s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Main application
location / {
proxy_pass http://odoo;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 720s;
proxy_connect_timeout 300s;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
# Security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy strict-origin-when-cross-origin;
}
}
Oturum ve Önbellek için Redis
Redis, oturum yönetimi ve Odoo'nun ORM önbelleği için veritabanı yükünü önemli ölçüde azaltır.
Redis'i yükleyin ve yapılandırın:
# Install Redis
sudo apt install redis-server
# Configure Redis for Odoo (max 4GB memory, LRU eviction)
sudo nano /etc/redis/redis.conf
# redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lru
save "" # Disable persistence for pure cache
tcp-keepalive 300
Odoo'yu Redis'i kullanacak şekilde yapılandırın:
# odoo.conf
[options]
# Redis for session storage
session_redis_host = 127.0.0.1
session_redis_port = 6379
session_redis_prefix = odoo_session_
# Redis for IR rules and ORM cache
cache_redis_host = 127.0.0.1
cache_redis_port = 6379
İzleme ve Sürekli Performans Yönetimi
PostgreSQL günlük analizi için pgBadger'ı kurun:
# Install pgBadger
sudo apt install pgbadger
# Generate report from PostgreSQL logs
pgbadger /var/log/postgresql/postgresql-15-main.log \
-o /var/www/html/pgbadger/index.html \
--format html \
--top 20
İzlenecek temel ölçümler:
| Metrik | Uyarı Eşiği | Kritik Eşik |
|---|---|---|
| Sayfa yükleme süresi | > 2 saniye | > 5 saniye |
| Veritabanı sorgu süresi | > 100ms ortalama | > 500ms ortalama |
| İşçi hafızası | > Limitin %80'i | > Limitin %95'i |
| PostgreSQL bağlantıları | > Maksimumun %70'i | > Maksimumun %90'ı |
| Disk IOPS'si | > Tedarik edilenlerin %80'i | > Tedarik edilenlerin %95'i |
| Önbellek isabet oranı | < %95 | < %90 |
Sıkça Sorulan Sorular
50 eşzamanlı Odoo kullanıcısı için minimum sunucu spesifikasyonu nedir?
Orta düzeyde işlem hacmine sahip 50 eşzamanlı kullanıcı için: 8 vCPU, 32 GB RAM, 500 GB SSD (NVMe tercih edilir). Odoo'nun PostgreSQL veritabanı birincil G/Ç darboğazı olduğundan hızlı depolama, ham CPU hızından daha önemlidir. 13 işçiyi (boşluk için 8×2-3), 8 GB paylaşılan_bufferları yapılandırın ve veritabanınızın SSD biriminde olduğundan emin olun.
Odoo yavaşlığımın Python mu yoksa PostgreSQL mi olduğunu nasıl teşhis edebilirim?
Yavaş bir işlemi kaydetmek için Odoo'nun yerleşik profil oluşturucusunu (Ayarlar → Teknik → Performans → Geliştirici modunda Profil Oluşturucu) kullanın. Alev grafiği, zamanın Python kodunda mı harcandığını yoksa SQL sonuçlarını mı beklediğini gösterecektir. Eğer SQL sorguları baskınsa PostgreSQL ayarlama ve indekslerine odaklanın. Python hakimse, eksik @api.depends önbelleğe alma veya özel kod verimsizliklerini arayın.
Bağlantı havuzu oluşturmak için PgBouncer'ı kullanmalı mıyım?
Evet, 30'dan fazla Odoo çalışanına veya yoğun API trafiğine sahip dağıtımlar için. İşlem modu havuzundaki PgBouncer, birçok Odoo çalışanının gerçek PostgreSQL bağlantılarından oluşan daha küçük bir havuzu paylaşmasına olanak tanıyarak bağlantı başına ek yükü azaltır. PgBouncer'ı kullanırken PostgreSQL'de max_connections'ı 50-100 olarak yapılandırın, ardından PgBouncer'ınpool_size değerini Odoo çalışan sayınızla eşleşecek şekilde ayarlayın.
VAKUM ANALİZİNİ Odoo veritabanında ne sıklıkla çalıştırmalıyım?
Autovacuum, doğru yapılandırıldığı takdirde bunu otomatik olarak gerçekleştirir. Yukarıdaki ayarlamadan sonra (agresif ölçek faktörleri, daha fazla çalışan), autovacuum aktif tablolarda sürekli olarak çalışmalıdır. Tabloların sık sık süpürüldüğünü doğrulamak için SELECT schemaname, tablename, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 20; komutunu çalıştırın.
Çok fazla Odoo çalışanının etkisi nedir?
Her Odoo çalışanı minimum 256-512 MB RAM tüketir. Çok fazla çalışan belleğin tükenmesine yol açarak çalışanların çökmesine (limit_memory_hard) neden olur ve bu da kullanıcılar için HTTP 500 hatalarına neden olur. Ek olarak, çok fazla PostgreSQL bağlantısı (workers × max_db_connections) veritabanını zorlayabilir. Formül (CPU×2+1) ile başlayın, yük altındaki belleği izleyin ve gerekirse ayarlayın.
Sonraki Adımlar
Odoo performans ayarı yinelenen bir süreçtir. Tek bir ayarlama oturumu önemli kazanımlar sağlar ancak sürdürülebilir performans, veri hacminiz büyüdükçe sürekli izleme, periyodik dizin analizi ve yapılandırma ayarlamaları gerektirir.
ECOSIRE, Kurumsal dağıtımlar için Odoo performans denetimleri sağlayarak özel iş yükünüz, işlem kalıplarınız ve altyapınız için en yüksek etkili optimizasyonları belirler. Mühendislerimiz Odoo kurulumlarını 10 kullanıcılı KOBİ'lerden 500 kullanıcılı kurumsal dağıtımlara ayarladı.
ECOSIRE'den Odoo Performans Denetimi talep edin →
Mevcut sunucu özelliklerinizi, kullanıcı sayınızı ve karşılaştığınız belirtileri paylaşın; ekibimiz temel nedenleri belirleyip öncelikli bir optimizasyon planı sunacaktır.
Yazan
ECOSIRE Research and Development Team
ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.
İlgili Makaleler
Odoo Accounting vs QuickBooks: Detailed Comparison 2026
In-depth 2026 comparison of Odoo Accounting vs QuickBooks covering features, pricing, integrations, scalability, and which platform fits your business needs.
Case Study: eCommerce Migration to Shopify with Odoo Backend
How a fashion retailer migrated from WooCommerce to Shopify and connected it to Odoo ERP, cutting order fulfillment time by 71% and growing revenue 43%.
Case Study: Manufacturing ERP Implementation with Odoo 19
How a Pakistani auto-parts manufacturer cut order processing time by 68% and reduced inventory variance to under 2% with ECOSIRE's Odoo 19 implementation.
Performance & Scalability serisinden daha fazlası
k6 Load Testing: Stress-Test Your APIs Before Launch
Master k6 load testing for Node.js APIs. Covers virtual user ramp-ups, thresholds, scenarios, HTTP/2, WebSocket testing, Grafana dashboards, and CI integration patterns.
Nginx Production Configuration: SSL, Caching, and Security
Nginx production configuration guide: SSL termination, HTTP/2, caching headers, security headers, rate limiting, reverse proxy setup, and Cloudflare integration patterns.
Odoo vs Acumatica: Cloud ERP for Growing Businesses
Odoo vs Acumatica compared for 2026: unique pricing models, scalability, manufacturing depth, and which cloud ERP fits your growth trajectory.
Testing and Monitoring AI Agents in Production
A complete guide to testing and monitoring AI agents in production environments. Covers evaluation frameworks, observability, drift detection, and incident response for OpenClaw deployments.
Compliance Monitoring Agents with OpenClaw
Deploy OpenClaw AI agents for continuous compliance monitoring. Automate regulatory checks, policy enforcement, audit trail generation, and compliance reporting.
Optimizing AI Agent Costs: Token Usage and Caching
Practical strategies for reducing AI agent operational costs through token optimization, caching, model routing, and usage monitoring. Real savings from production OpenClaw deployments.