Hacía unos meses que había migrado un script de un servidor a otro, lo había actualizado y programado el Cron, el programa que ejecuta a cada cierto tiempo una acción. Parecía todo andar bien pero luego de un tiempo noté algo: el consumo de CPU era elevado.
Era un buen VPS como para preocuparme pero noté que los sitios que alojaba tampoco tenían un tráfico bestial, sí eran grandes (mucho contenido en base de datos) pero no lograba entender qué estaba sucediendo. Esta es una de esas historias de un error estúpido pero que puede quitarte una enorme cantidad de tiempo tratando de descularlo. Equivocarse, resolver, aprender, sí, todo muy bonito pero ¿Quién no se mandó una de estas?
Llegué a probar de todo, desactivar plugins, actualizar PHP hasta la versión 8.0 (que, a todo esto, performó mejor), borrar contenido de las bases de datos, todo parecía mejorar un poco pero a día sobraban momentos en los que el procesador se iba al 100%.
Probé reiniciando servicios, pero lo mismo, al rato se volvía un desastre. Cambié el sistema de cacheo de los sitios, agregué Redis, llegué a cachear TODO para que servir una página fuese tan sólo tomar algo que ya estaba pre-procesado, metí Cloudflare, ¿qué más podía hacer?
Hasta que se me ocurrió actualizar el script que corría el Cron. El anterior estaba tan viejo que solía cortar la ejecución por usar una API vieja, pasé todo a lo último, lo nuevo.
Obviamente al ser un mejor script corría todas las veces que era llamado pero noté algo: parecía estar corriendo todo el tiempo sin parar, WTF?
Aquí cambié el foco y miré al cron, si se estaba ejecutando demasiado ¿Quién era el culpable? ¿Cron se volvió loco? A ver...
grep CRON /var/log/syslog
De pronto, para mi sorpresa, el script se estaba ejecutando a cada minuto del fucking día. CADA MINUTO, algo que debía ejecutarse una vez cada cuatro horas lo estaba haciendo TODO EL MALDITO TIEMPO. Esto debe haber estado así desde hace seis meses más o menos, me estaba violando el servidor sin asco.
Pero ¿Qué había configurado mal? Obvio que la culpa es siempre del usuario, en este caso yo, y fue tan estúpido como obvio. Un asterisco en vez de cero. Miré la config en el panel de control de VestaCP y vi esto...
Min Hour Day Month Day of week * */2 * * *El asterisco implica "ejecutar siempre", el cero "en el minuto cero", por alguna razón cuando cargué el cron puse asteriscos pensando que significaba "en cualquier minuto" porque mi cabeza estaba ubicada solamente en el campo de la hora.
El cron interpretó que le estaba pidiendo que ejecutara TODOS los minutos el mismo script, claro, asterisco es todos, venga, te lo disparo todos los minutos, a cada maldito minuto sale, total, ¿No es lo que me estás pidiendo?
Y así señores encontré que un puto asterisco estaba violentando mi servidor y durante todo este tiempo aprendí miles de trucos para hacer un sitio más eficiente, escribí código, aprendí de redis, de caché, de todo... al pedo :D Pero bueno, ese es el lado positivo! ja!
Un maldito simple y básico error de esos que pasás tan rápido que no te das cuenta. El servidor, un VPS en Digital Ocean, se la estaba bancando bastante bien porque no se quejaba demasiado, tan sólo tenía este recurente script ejecutándose una y otra vez pero el servidor resistía y muy de vez en cuando el CPU se estancaba en el 100%, pero siempre volvía.
No, no era MySQL por su cuenta, tampoco Apache, pero esos servicios se atoraban por culpa de este otro script que estaba ahí en el medio molestando.
Y vos, ¿cual de estas estupideces te mandaste alguna vez?