上周在技术交流群里看到一位朋友发了张截图:他们基于 Odoo 的进销存系统运行半年后明显变慢,首页要等好几秒,列表页翻页经常转圈,最夸张的是提交采购审批单后要卡五六秒。群里大家七嘴八舌,有人说“换 SSD”,有人说“加 CPU”,也有人说“数据库要拆读写分离”。我问他监控面板上什么指标异常,他说没装监控,只知道 PostgreSQL 偶尔 CPU 90% 以上。
这个场景我太熟悉了。Odoo 作为一套开源 ERP/业务系统,它的“慢”从来不是单点问题,前端界面慢、ORM 查询慢、SQL 执行慢、异步任务堆积慢,表象几乎一样,但处理方式完全不同。如果不先做观测盲目调优,大概率是白折腾。后来我建议他部署 ArcoObservability 做全链路监测,用了一周时间把几个核心慢点全部定位出来。这篇文章就围绕这件事展开,讲清楚 Odoo 的性能问题该怎么分层排查,以及 ArcoObservability 在其中的实际用法。适合正在做 Odoo 实施、二次开发或运维维护的团队参考。
1. Odoo 慢排查为什么容易“猜错方向”
1.1 先聊聊 Odoo 的两个反直觉特点
很多人第一次接触 Odoo 时,往往把它当成一个普通的 Web 应用来调优,这恰恰是最容易走弯路的地方。Odoo 有两个反直觉的特点决定了它的性能瓶颈跟传统应用不一样。
第一,Odoo 的业务逻辑主要跑在 Python ORM 层,而不是纯 SQL 层。你要是习惯用“POST /xxx/search_read 请求慢”去反推“数据库慢”,经常会在数据库里找不到对应的慢 SQL,或者明明单条 SQL 很快,接口却慢得离谱。原因在于 ORM 一个请求可能拼装了几十条甚至上百条查询,而且这些查询之间还有依赖关系。真正的问题往往不是某一条 SQL 慢,而是“N+1 查询”太多、去重去得没意义、笛卡尔集查询没控制好。
第二,Odoo 的界面慢经常跟业务逻辑没关系。Odoo Web 的界面很“重”,启动时要加载一堆打包后的 JS/CSS 资源,登录后还要拉取菜单权限、用户设置、消息总线连接。我见过不少案例,数据库负载很低,但用户就是感觉卡。套上 ArcoObservability 之后能看到全部耗时其实消耗在静态资源加载、Web 会话握手和前端渲染上,后端接口只有几十毫秒。这种问题你加服务器没用,得抓前端性能指标和请求瀑布流。
1.2 为什么“重启/加配置”只能管一阵子
以前很多运维团队处理 Odoo 慢的方式是:慢就重启服务、清缓存、再不行加内存、加 CPU。刚用完那几天确实有效,因为 PostgreSQL 的 shared buffers 重新热起来了,Python worker 的僵尸连接也被清掉了。可过一两周问题又回来,因为根本矛盾没有被暴露。
这里要打个比方。Odoo 出问题像是在隧道里堵车,你的直觉是隧道口收费太慢,于是拼命扩张收费口。实际原因可能是隧道里面发生了事故,有的车横在路上走不了,后面全被压住了。传统排查只能看到收费口的数据(进程 CPU、IO),看不到“事故点”(慢查询、锁等待、ORM 低效逻辑)。ArcoObservability 这类可观测性工具做的就是全景图:哪个模块的请求慢,这个请求在哪个环节耗时,它是访问了数据库还是调了外部接口,数据库执行了哪些 SQL,每一条花了多久。有了这些信息,才谈得上针对性优化。
1.3 可观测性的数据从哪来
ArcoObservability 的设计思路并不复杂,核心就是采集三层数据。
- 应用层:通过注入到 Odoo 进程里的 Agent,采集 HTTP 请求明细、JS 报错、页面加载绩效、Python 调用链等数据。
- 数据库层:通过抓取 PostgreSQL 的查询日志或利用 pg_stat_statements 视图,获取 SQL 文本、执行计划、耗时时长和锁等待时间。
- 主机与中间件层:采集 CPU、内存、磁盘、网络、容器状态和 Redis/消息队列等依赖组件指标。
这些信息汇总到平台后,会以拓扑图和链路图的形式呈现。从“用户在界面上点了提交”到“Python 函数处理”再到“SQL 执行完返回”,整条链路上哪一跳慢一目了然。这也是我后来向朋友力荐它的核心原因:不要再用“猜”的方式调优,让数据替你做决定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Odoo 架构里的“慢点地图”:四个最常见瓶颈层
Odoo 的请求路径大致是:浏览器 → Nginx → Odoo Web Worker(Python)→ ORM/业务代码 → PostgreSQL。此外还伴随 Redis、消息队列、邮件网关等外部组件。根据我踩过的坑,这套链路里最容易出现的性能问题集中在四个层。
2.1 前端与静态资源层:界面卡、加载慢的隐形杀手
这一层的问题最容易被忽略,因为用户感知就是“打开 Odoo 应用界面很慢”,技术人员一查服务器 CPU 不高、数据库没慢查询,就无从下手。但真相往往在浏览器那一端。
Odoo 的 Web 前端会把模块的 JS 文件打包成若干个 bundle,如果安装了大量第三方模块,bundle 文件会急剧膨胀。每次升级或更新模块后,这些 bundle 需要重新生成;如果 /odoo/backend-assets 请求在客户端浏览器没有做好缓
