log_min_duration_statement = 1000
Problemas de performance ocasionados por el ir.cron de Odoo
Al principio no quería escribir sobre este tema debido a que me parecía muy obvio, pero es la segunda vez que lo veo. Durante esta semana me contactaron preguntandome si sabia lo que podía pasar con un server que estaba corriendo Odoo (una instalación grande, con más de 50 usuarios concurrentes). Concretamente el server donde estaba ejecutandose la base de datos (con Amazon RDS si entiendo bien) presentaba unos picos de actividad cada cinco minutos, como lo muestra el siguiente gráfico:
Y la periodicidad (cada cinco minutos) me apuntó a dos posibles responsables: checkpoints de la base de datos o acciones planificadas de Odoo (ejecutadas mediante el ir.cron). Le comenté mis ideas a quien me contactó, y dicha persona se puso a trabajar revisando las tareas del ir.cron. Dicho y hecho, había una tarea que se ejecutaba cada cinco minutos y la misma penalizaba en forma significativa el servidor de la base de datos.
Una situación similar experimenté con otro cliente. Este contaba con un server que si bien no mostraba picos de actividad de la base de datos, presentaba queries que demoraban más de lo aconsejable en resolverse. En este punto vale la pena hacer un cambio en el archivo de configuración de PostgreSQL. En este se debe indicar:
Lo que logra que se logueen las sentencias de SQL que duran más de 1 segundo (algo aconsejable).
Volviendo al cliente, el mismo presentaba varias consultas que demoraban más de un segundo. Y presentaba problemas de lockeo en la tabla ir_cron. Lo que me daba una pista de lo que podía estar pasando. Dicho y hecho había una tarea planificada que se repetía una vez por minuto. Y dicha tarea actualizaba una tabla con más de 20,000 registros. Apenas desactivamos dicha tarea, el server empezó a funcionar mucho mejor debido a que no se encontraba sobrecargado.
Por último, vale la pena contar como hicimos para desactivar dicha tarea planificada. La misma se hallaba permanentemente en ejecución por lo cual era imposible desactivarla por medio del UI. Entonces durante la madrugada (cuando ningún usuario se encontraba trabajando), procedimos a detener el server de Odoo y por medio del psql hicimos un pequeño update en la base de datos con la siguiente sentencia:
update ir_cron set active = FALSE where id = <id de la tarea>
Acerca de:
Gustavo Orrillo
Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.