Problemas de CPU en host y wp-cron.php

Black-byte y otros sitios asociados ;D han sido periódicamente suspendidos por estar alojados en un shared host, que como todo shared host pone cuotas máximas en el uso de procesador de los script, BDs y demas procesos corriendo en el host. Después de mucho rastrear el problema pasando por optimización de las plantillas de wordpress, instalación y afinamiento de plugins de cacheo,  hasta rastreo y blindaje de posibles ataques informáticos parece que aunque sea en mi caso particular el culpable ha aparecido.

Se trata de wp-cron.php, un pequeño script del core de WordPress  que automatiza tareas, en general las que se quieran, pero en particular viene pre-configurado para buscar los pingbacks, publicar los post con fecha futura, controlar las actualizaciones de comentarios, entre otras. wp-cron no es un verdadero cron en el sentido de un sistema operativo (un procesos a bajo nivel que es llamado a horas o intervalos específicos, sino que es activado cuando se crean o actualizan páginas y  cuando se cargan páginas aparentemente. Un proceso se levanta, se mantiene arriba un tiempo y mientras tanto intenta realizar sus tareas programadas, si no puede aparentemente se puede quedar en un ciclo infinito consumiendo recursos, esto reportado múltiples ocasiones en los foros de WordPress.

El que se quede o no consumiendo recursos parece estar atado a configuraciones del servidor como abrir outgoing connections a los servidores a los cuales se esta intentando hacer un pingback o a la posibilidad de hacer una conexión a sí mismo (auto-pingback), algunas de estas configuraciones pueden no estar al alcance de un usuario de webhosting y las compañías de host generalmente son poco solicitas a hacer un cambio en configuración a los servidores Apache o el servidor web que esté sirviendo las páginas.

Una solución y la que parece haber dado resultado en mi caso es deshabilitar wp-cron y correr un cron verdadero llamando el script cada cierto tiempo. Para deshabilitar el wp-cron basta con agregar la siguiente linea al wp-config.php (dicho archivo se encuentra por lo general en el directorio raiz de la instalación de de WordPress) :

define(‘DISABLE_WP_CRON’, true);

La linea se puede agregar en cualquier parte después de la apertura del tag php, por ejemplo bajo define(‘DB_NAME’, ‘yourDbName’); .  El cron del sistema por el otro lado debe llamar el wp-cron.php así

wget  http://www.misitioEjemplo.com/wp-cron.php?doing_wp_cron

Donde misitioEjemplo es la ruta completa hasta el script wp-cron.php   . Adicionalmente el cron de sistema debe tener una periodicidad acorde con las necesidades del sitio, si existen muchos procesos automatizados que requieran tiempos exactos se recomienda hacer a no menos de 15 minutos, pero si no, se puede usar una periodicidad hasta de uno o dos veces por dia.

Si detecta que su WordPress esta consumiendo recursos de cpu excesivos puede intentar este método, con la ventaja de que es fácilmente reversible (quitar la configuración y eliminar el cron de sistema)  y al menos en mi caso redujo drásticamente el uso de CPU.

Compartir esta entrada

DiggReddit