在Odoo开发中,性能优化是关键环节。from odoo.tools.profiler import profile
是一个内置的性能分析装饰器,可帮助开发者定位代码瓶颈。以下是详细使用方法和实践建议:
@profile
装饰器:from odoo.tools.profiler import profile
class MyModel(models.Model):
_name = 'my.model'
@profile
def my_method(self, args):
# 业务逻辑
/var/log/odoo/odoo.log
)会输出详细分析报告,包含以下关键指标:示例日志输出:
2025-07-07 12:34:56,789 INFO odoo odoo.tools.profiler:
Calls Queries ms
my.model.my_method
1 5 120.3
- 调用次数(Calls):方法被调用的次数。
- 数据库查询次数(Queries):方法内执行的SQL查询数量。
- 执行时间(ms):方法及其子调用的耗时(毫秒)。
若需可视化分析调用栈,可结合pyflame
和FlameGraph
工具生成火焰图:
sudo apt install autoconf automake autotools-dev g++ pkg-config python-dev libtool make
git clone https://github.com/uber/pyflame
cd pyflame
./autogen.sh
./configure
make
sudo make install
git clone https://github.com/brendangregg/FlameGraph
# 获取Odoo进程PID(假设为12345)
pyflame -p 12345 -o profile_data.txt
cd FlameGraph
./flamegraph.pl < ../profile_data.txt > profile.svg
打开profile.svg
可查看交互式火焰图,直观展示函数调用关系和耗时比例。
指标 | 含义 | 优化建议 |
---|---|---|
Queries(查询次数) | 方法内SQL查询数量 | 合并查询、使用prefetch 机制避免N+1查询、优化索引。 |
ms(执行时间) | 方法总耗时 | 检查耗时长的子调用,将复杂计算移至模型层或异步任务。 |
调用深度 | 火焰图中的调用栈层级 | 减少嵌套调用、拆分大型函数,避免阻塞渲染。 |
ir.profile
模型数据,分析SQL和QWeb渲染性能。odoo.conf
设置log_level=debug
,过滤SQL查询日志。pgAudit
插件记录所有数据库操作。write
批量操作。read_group
替代循环统计查询。fields_get
或read
方法是否包含冗余计算。_compute
计算字段,添加缓存或设置store=True
。@profile
会显著增加日志量和执行开销,建议仅在测试环境使用。profile_data.txt
避免磁盘占用。通过@profile
装饰器快速定位瓶颈,再结合火焰图和数据库监控深入分析,可系统解决Odoo性能问题。优化时需遵循“减少查询、批量操作、异步处理”原则。