Dentro del universo de dudas generales y problemas particulares que se presentan con el ERP de Odoo hay una que suele ser tan recurrente y tan compleja que he decidido escribir una entrada al respecto: odoo lento. ¿Cuáles son las razones más comunes y como resolverlas?
Antes que nada: Monitorear
El universo de problemas de rendimiento de una VPS es, ciertamente, muy grande; a esto hay que sumarle el rendimiento de un ERP en particular como Odoo. Por lo tanto, antes de tomar cualquier decisión, es importante realizar un monitoreo general del sistema. Para esto Linux cuenta con muchas herramientas dentro del propio sistema que nos permiten entender mejor las incidencias de rendimiento. Si su Odoo no está en un VPS Linux entonces es aconsejable migrarse a uno.
También, la mayoría de los VPS Cloud de pago ofrecen herramientas de monitoreo en el tiempo, permitiendo ver picos del uso del CPU a determinadas horas, consumo de Ram, Memoria, request, etc. Toda esa información nos servirá para empezar a trabajar.
Recursos
Lo primero que vamos a considerar son los recursos asignados. Si tenemos un VPS chico de 1 CPU y 1 Gb de Ram, pero en nuestro Odoo ingresan diariamente unas 20 personas que prácticamente trabajan en simultáneo, entonces claramente necesitaremos un VPS un poco mejor. La cuenta es sencilla y está recomendada por Odoo Oficial, consiste en multiplicar por 2 el número de CPU y sumarle uno para obtener el número de workers aceptados por el sistema. Cada worker equivale a 6 concurrencias de usuarios (es decir, 6 usuarios exactamente al mismo tiempo haciendo cosas en el sistema). Como dicho escenario no suele ser normal, se suele usar una regla general en sistemas que dictamina que 6 concurrencias son, aproximadamente, 25 empleados que utilicen el sistema. Es una regla "a ojo" ya que depende mucho de la empresa; habrá las que 6 concurrencias les signifiquen menos empleados, y habrá las que les signifiquen muchos más.
Si al monitorear en horarios de trabajo regular vemos un consumo excesivo del CPU, y sabemos que se están produciendo muchas concurrencias, puede ser recomendable aumentar las prestaciones de nuestro proveedor VPS.
Asignación de Recursos
¿Qué pasa si los recursos son altos y pese a todo el sistema no funciona? Es aconsejable revisar como se asignan los recursos. Si el VPS se utiliza exclusivamente para Odoo, entonces lo ideal es asignar todo lo posible de Ram a cosas como PostgreSQL (el gestor de bases de datos que utiliza Odoo). Para esto existen muchas alternativas, recomiendo leer este breve artículo que compartimos en la Wiki de OdooAR: Optimización PostgreSQL ya que despeja muchas dudas de como realizar la optimización.
Acciones Automatizadas / CRON
Una de las cosas que más me gustan de Odoo es poder crear acciones automatizadas y planificadas que disparen código dependiendo una acción o un tiempo definido. Sin embargo son un arma de doble filo, ya que si no están perfectamente optimizadas pueden convertirse en un gran hueco donde se van todos los recursos del servidor.
Si nuestro Odoo por momentos está lento y consume bastante CPU, nos conviene darle una mirada a dichas acciones (Ajustes > Técnico > Acciones planificadas). Por defecto vendrán algunas muy simples y útiles, como notificaciones por mail o limpieza de la base de datos. Pero muchos módulos de terceros crean y activan acciones sin tener en cuenta los recursos del servidor y la utilidad de la misma. En muchos Odoo me ha tocado encontrarme con infinidad de estas, automatizaciones para validar presupuestos, para eliminar contactos o actualizar su información, etc. El problema con muchas de estas acciones es que referencian métodos que, muchas veces, se arman en bases de prueba con 10 o 15 registros de Contactos (res.partner) y al momento de entrar a un Odoo real se encuentran a lo mejor con una base de 10 o 15 mil Contactos. Un error común es hacer una función recursiva sobre todos los registros para actualizar un campo o generar un proceso, y muchas veces no es necesario. Siempre hay que intentar que dichas funciones recursivas lleven un filtro que traiga solo la información útil a manejar; y en caso de ser imposible dividir el proceso en bloques de 1000 o, a lo sumo, 2000 registros.
Otra manera de optimizar dichas acciones es aumentando el espacio de tiempo en que se ejecutan. Si tienen muchas acciones que se realizan cada 1 minuto o cada 5 minutos entonces hay que poner el foco de atención. Por lo general no es necesario, muchas veces con tan poco tiempo de espacio la acción no se terminará de ejecutar antes de que Odoo vuelva a pedirla. Y, como dato final, si detectamos que la acción no nos aporta nada al sistema, entonces es aconsejable desactivarla por unos días a ver si nuestra teoría es efectiva. En caso de no ser necesaria, dejarla desactivada.
Actualizar Odoo
No soy partidario de estar actualizando constantemente el framework de Odoo (hay gente que lo automatiza para actualizarlo diariamente o semanalmente y no tiene mucho sentido), pero si es verdad que durante 3 años las versiones mayores reciben parches de todo tipo. Entre ellos, parches de rendimiento muy interesantes que de no actualizar nos los estamos perdiendo. Por tal motivo siempre es recomendable hacer un update cada cierto tiempo, especialmente si nunca actualizaron la instancia. Si nuestro odoo ya quedó viejo en el tiempo, (más de 3 años) puede ser buena idea hacer una migración o implementación a una versión más moderna.
Longpolling
Un error constante que suele aparecer es la configuración Longpolling. De hecho, es muy común tener configurado más de 1 worker y que cada tanto salga el cartel "No está conectado", seguido de una falla del sistema. Para esto recomiendo un artículo en la wiki de OdooAR, donde se emplea NGINX para mejorar el rendimiento del sistema y configurar de manera apropiada el longpolling: Optimización NGINX.
¿Y si todo falla?
Realmente hay infinidad de casos y situaciones fuera de lo general, incluso hay muchos módulos que tienen un consumo excesivo, y tanto su rastreo como su solución depende mucho del equipo de mantenimiento que hay del otro lado. En este caso la experiencia es un factor fundamental.