ہماری Performance & Scalability سیریز کا حصہ
مکمل گائیڈ پڑھیںاوڈو پرفارمنس ٹیوننگ: پوسٹگری ایس کیو ایل اور سرور آپٹیمائزیشن
Odoo کی ایک سست مثال کھوئی ہوئی پیداواری صلاحیت اور مایوس صارفین میں پیسہ خرچ کرتی ہے۔ اچھی خبر: Odoo کی کارکردگی کے زیادہ تر مسائل ہارڈ ویئر اپ گریڈ کے بغیر قابل حل ہیں۔ بری خبر: بنیادی وجہ کی تشخیص کے لیے پورے اسٹیک کو سمجھنے کی ضرورت ہوتی ہے — Python، PostgreSQL، Nginx، Redis، اور نیٹ ورک پرت۔
یہ گائیڈ Odoo 19 انٹرپرائز کے لیے مکمل پرفارمنس آپٹیمائزیشن لائف سائیکل کا احاطہ کرتا ہے: رکاوٹوں کی نشاندہی کرنا، PostgreSQL کو ٹیوننگ کرنا، Odoo سرور کی ترتیبات کو بہتر بنانا، Nginx کیشنگ کو ترتیب دینا، اور آپ کے صارف کی تعداد اور لین دین کے حجم کے لیے اپنے بنیادی ڈھانچے کو درست کرنا۔
اہم ٹیک ویز
- PostgreSQL ٹیوننگ کارکردگی کا سب سے بڑا فائدہ فراہم کرتی ہے (عام تنصیبات میں 50-300%)
- مشترکہ بفرز کو ابتدائی نقطہ کے طور پر دستیاب RAM کے 25% پر سیٹ کیا جانا چاہیے۔
- Odoo کا ORM N+1 سوالات پیدا کرتا ہے جو pg_stat_statements کے ساتھ پکڑے جا سکتے ہیں
- کثرت سے فلٹر کیے جانے والے فیلڈز (company_id، ریاست، تاریخ) پر اشاریہ جات لازمی ہیں
- Nginx پراکسی کیشنگ Odoo سرور کو مارے بغیر جامد اثاثوں کی خدمت کرتی ہے
- ورکر کنفیگریشن براہ راست سمورتی صارف کی صلاحیت کو متاثر کرتی ہے۔
- Redis سیشن کیشنگ تصدیق کے لیے ڈیٹا بیس کا بوجھ کم کرتی ہے۔
- ویکیوم اور تجزیہ کے نظام الاوقات کو اوڈو کام کے بوجھ کے لیے ٹیون کرنا ضروری ہے
کارکردگی کی رکاوٹوں کی تشخیص
کسی بھی چیز کو ٹیون کرنے سے پہلے، اس بات کی نشاندہی کریں کہ اصل میں وقت کہاں گزارا جا رہا ہے۔ اندھی اصلاح کوشش کو ضائع کرتی ہے۔
اوڈو استفسار لاگنگ کو فعال کریں:
# 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
پوسٹگری ایس کیو ایل سست استفسار لاگنگ کو فعال کریں:
# /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 انسٹال کریں (سب سے قیمتی PostgreSQL ایکسٹینشن):
-- 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();
اوڈو میں N+1 سوالات کی شناخت کریں:
N+1 سوالات اس وقت ہوتے ہیں جب Odoo ریکارڈز کی فہرست لوڈ کرتا ہے اور پھر متعلقہ ڈیٹا حاصل کرنے کے لیے فی ریکارڈ ایک سوال کرتا ہے۔ pg_stat_statements میں اس طرح کے پیٹرن تلاش کریں:
-- This query appearing 500 times in a single page load = N+1 problem
SELECT * FROM res_partner WHERE id = $1
اوڈو کا prefetch_ids میکانزم استعمال کرنا یا select کو اپنے ORM استفسار میں شامل کرنا درست ہے:
# 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 کنفیگریشن ٹیوننگ
PostgreSQL جہاز کسی بھی ہارڈ ویئر پر چلنے کے لیے ڈیزائن کیا گیا قدامت پسند ڈیفالٹس کے ساتھ۔ Odoo پروڈکشن سرور کے لیے، ان ڈیفالٹس کو ٹیون کرنا ضروری ہے۔
میموری سیٹنگز (32 جی بی ریم سرور کے لیے):
# /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
کنکشن کی ترتیبات:
# Maximum connections (Odoo workers × 2 + headroom)
max_connections = 200
# For connection pooling with PgBouncer
# If using PgBouncer, reduce to 50-100
سوال کے منصوبہ ساز کی ترتیبات:
# 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
اعلی تحریری کام کے بوجھ کے لیے آٹو ویکیوم ٹیوننگ:
Odoo کی انوینٹری، اکاؤنٹنگ، اور پیغام رسانی کے ماڈیولز بھاری INSERT/UPDATE ٹریفک پیدا کرتے ہیں۔ ڈیفالٹ آٹو ویکیوم سیٹنگز ناکافی ہیں:
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
اہم ڈیٹا بیس انڈیکس
ناقص کنفیگریشن کے بعد اوڈو کارکردگی کے مسائل کی دوسری سب سے عام وجہ غائب انڈیکسز ہیں۔ Odoo بنیادی کلیدوں اور کچھ غیر ملکی کلیدوں کے لیے اشاریہ جات بناتا ہے، لیکن بہت سے عام طور پر فلٹر کیے گئے فیلڈز میں اشاریہ کی کمی ہوتی ہے۔
pg_missing_fk_indexes منظر کا استعمال کرتے ہوئے گمشدہ اشاریہ جات کو چیک کریں:
-- 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;
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);
اوڈو ورکر کنفیگریشن
اوڈو ورکرز کی تعداد اس بات کا تعین کرتی ہے کہ سرور کتنی سمورتی درخواستوں کو سنبھال سکتا ہے۔
کارکنوں کی تعداد کا فارمولہ:
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 کارکن کی ترتیبات:
[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
کارکنوں کی اقسام کو سمجھنا:
اوڈو دو قسم کے کارکنان استعمال کرتا ہے:
- HTTP کارکن (
workersتشکیل): تمام ویب درخواستوں کو ہینڈل کریں۔ - کرون ورکرز (1 محفوظ): پس منظر میں طے شدہ کارروائیاں چلائیں۔
کرون ورکر ہمیشہ چل رہا ہے لیکن آپ کی HTTP صلاحیت میں شمار نہیں ہوتا ہے۔ اس بات کو یقینی بنائیں کہ کم از کم 1 کرون ورکر زیادہ بوجھ پر بھی دستیاب ہو۔
کارکردگی کے لیے Nginx کنفیگریشن
Nginx Odoo کے سامنے بیٹھتا ہے اور TLS ختم کرنے، جامد فائل کی خدمت، اور اختیاری طور پر کیشنگ کو سنبھالتا ہے۔
اعلی کارکردگی Nginx ترتیب:
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;
}
}
سیشن اور کیشے کے لیے ریڈیس
Redis سیشن مینجمنٹ اور Odoo کے ORM کیشے کے لیے ڈیٹا بیس کے بوجھ کو نمایاں طور پر کم کرتا ہے۔
** ریڈیس کو انسٹال اور کنفیگر کریں:**
# 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.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
نگرانی اور جاری کارکردگی کا انتظام
PgBadger پوسٹگری ایس کیو ایل لاگ تجزیہ کے لیے ترتیب دیں:
# 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
** مانیٹر کرنے کے لیے کلیدی میٹرکس:**
| میٹرک | وارننگ تھریشولڈ | تنقیدی حد |
|---|---|---|
| صفحہ لوڈ ہونے کا وقت | > 2 سیکنڈ | > 5 سیکنڈ |
| DB استفسار کا وقت | > 100ms اوسط | > 500ms اوسط |
| ورکر میموری | > 80% حد | > 95% حد |
| PostgreSQL کنکشنز | > 70% زیادہ سے زیادہ | > 90% زیادہ سے زیادہ |
| ڈسک IOPS | > فراہم کردہ کا 80% | > 95% فراہم کردہ |
| کیشے ہٹ کا تناسب | <95% | <90% |
اکثر پوچھے گئے سوالات
Odoo کے 50 ہم آہنگ صارفین کے لیے کم از کم سرور کی وضاحت کیا ہے؟
معتدل ٹرانزیکشن والیوم والے 50 ہم وقت صارفین کے لیے: 8 vCPUs، 32 GB RAM، 500 GB SSD (NVMe ترجیحی)۔ Odoo کا PostgreSQL ڈیٹا بیس بنیادی I/O رکاوٹ ہے، لہذا تیز اسٹوریج خام CPU رفتار سے زیادہ اہم ہے۔ 13 ورکرز (ہیڈ روم کے لیے 8×2-3)، 8 جی بی مشترکہ_بفرز کو ترتیب دیں، اور یقینی بنائیں کہ آپ کا ڈیٹا بیس SSD والیوم پر ہے۔
میں کیسے تشخیص کروں کہ میری Odoo کی سست روی Python ہے یا PostgreSQL؟
سست آپریشن کو ریکارڈ کرنے کے لیے Odoo کا بلٹ ان پروفائلر (ترتیبات → تکنیکی → کارکردگی → پروفائلر ڈیولپر) استعمال کریں۔ فلیم گراف دکھائے گا کہ آیا Python کوڈ میں وقت گزارا گیا ہے یا SQL نتائج کا انتظار ہے۔ اگر ایس کیو ایل کے سوالات کا غلبہ ہے تو، پوسٹگری ایس کیو ایل ٹیوننگ اور انڈیکس پر توجہ دیں۔ اگر ازگر کا غلبہ ہے تو، گمشدہ @api.depends کیشنگ یا کسٹم کوڈ کی نااہلیوں کو تلاش کریں۔
کیا مجھے کنکشن پولنگ کے لیے PgBouncer استعمال کرنا چاہیے؟
ہاں، 30+ Odoo کارکنوں یا بھاری API ٹریفک کے ساتھ تعیناتیوں کے لیے۔ ٹرانزیکشن موڈ پولنگ میں PgBouncer بہت سے Odoo کارکنوں کو حقیقی PostgreSQL کنکشن کا ایک چھوٹا پول شیئر کرنے کی اجازت دیتا ہے، جس سے فی کنکشن اوور ہیڈ کو کم کیا جا سکتا ہے۔ PgBouncer کا استعمال کرتے وقت max_connections کو PostgreSQL میں 50-100 پر کنفیگر کریں، پھر PgBouncer کے pool_size کو اپنے Odoo ورکر کی گنتی سے مماثل سیٹ کریں۔
Autovacuum اسے خود بخود ہینڈل کرتا ہے اگر صحیح طریقے سے ترتی�
Autovacuum اسے خود بخود ہینڈل کرتا ہے اگر صحیح طریقے سے ترتیب دیا گیا ہو۔ اوپر ٹیوننگ کے بعد (جارحانہ پیمانے کے عوامل، زیادہ کارکن)، آٹو ویکیوم کو فعال میزوں پر مسلسل چلنا چاہیے۔ ٹیبلز کو کثرت سے خالی کیا جا رہا ہے اس کی تصدیق کے لیے SELECT schemaname, tablename, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze FROM pg_stat_user_tables ORDER BY n_dead_tup DESC LIMIT 20; کو چلائیں۔
Odoo کے بہت زیادہ کارکنوں کا کیا اثر ہے؟
Odoo کا ہر کارکن کم از کم 256–512 MB RAM استعمال کرتا ہے۔ بہت زیادہ کارکنان میموری کی تھکن کا باعث بنتے ہیں، جس کی وجہ سے کارکن کریش ہو جاتے ہیں (limit_memory_hard)، جس کے نتیجے میں صارفین کے لیے HTTP 500 کی خرابیاں پیدا ہوتی ہیں۔ مزید برآں، بہت زیادہ PostgreSQL کنکشنز (workers × max_db_connections) ڈیٹا بیس کو زیر کر سکتے ہیں۔ فارمولے (CPU×2+1) کے ساتھ شروع کریں، بوجھ کے نیچے میموری کو مانیٹر کریں، اور اگر ضرورت ہو تو ایڈجسٹ کریں۔
اگلے اقدامات
اوڈو پرفارمنس ٹیوننگ ایک تکراری عمل ہے۔ ایک واحد ٹیوننگ سیشن اہم فوائد فراہم کرتا ہے، لیکن مسلسل کارکردگی کے لیے آپ کے ڈیٹا کے حجم میں اضافے کے ساتھ مسلسل نگرانی، متواتر انڈیکس تجزیہ، اور کنفیگریشن ایڈجسٹمنٹ کی ضرورت ہوتی ہے۔
ECOSIRE آپ کے مخصوص کام کے بوجھ، لین دین کے نمونوں، اور انفراسٹرکچر کے لیے سب سے زیادہ اثر انداز ہونے والی اصلاحوں کی نشاندہی کرتے ہوئے، انٹرپرائز کی تعیناتیوں کے لیے Odoo پرفارمنس آڈٹ فراہم کرتا ہے۔ ہمارے انجینئرز نے Odoo کی تنصیبات کو 10-صارف SMBs سے لے کر 500-صارف انٹرپرائز تعیناتیوں تک بنایا ہے۔
ECOSIRE سے Odoo پرفارمنس آڈٹ کی درخواست کریں →
اپنے موجودہ سرور کی تفصیلات، صارف کی تعداد، اور ان علامات کا اشتراک کریں جن کا آپ سامنا کر رہے ہیں، اور ہماری ٹیم بنیادی وجوہات کی نشاندہی کرے گی اور ایک ترجیحی اصلاحی منصوبہ پیش کرے گی۔
تحریر
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
متعلقہ مضامین
blog.posts.ai-powered-customer-segmentation-guide.title
blog.posts.ai-powered-customer-segmentation-guide.description
blog.posts.ai-supply-chain-optimization-2026.title
blog.posts.ai-supply-chain-optimization-2026.description
blog.posts.b2b-ecommerce-strategy-wholesale-guide.title
blog.posts.b2b-ecommerce-strategy-wholesale-guide.description
Performance & Scalability سے مزید
blog.posts.webhook-debugging-monitoring-guide.title
blog.posts.webhook-debugging-monitoring-guide.description
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.