Diagnóstico de admin-ajax.php: respuestas lentas en WordPress

Ezequiel Piñero 2 comentarios

WordPress es uno de los CMS más utilizados y gracias a su gran comunidad posee cientos de plugins y temas disponibles, eso puede dar lugar a que sea uno de los más difíciles de optimizar correctamente ya que hay muchas variables diferentes que podrían estar introduciendo retrasos. Si alguna vez se ha ejecutado una prueba de velocidad en su sitio de WordPress, es probable que haya encontrado a admin-ajax.php aparecer en sus resultados. Hoy queremos explorar brevemente cómo diagnosticar mejor las respuestas lentas de admin-ajax.php como propietario de un sitio de WordPress.

¿Qué es el archivo admin-ajax.php?

En la versión de WordPress 3.6 se introdujo la API Heartbeat (latidos de corazón) para permitir la comunicación entre el navegador web y el servidor. Para ello utiliza el archivo /wp-admin/admin-ajax.php para ejecutar las llamadas AJAX desde el navegador web y realizar un seguimiento de lo que está pasando en el panel de administración. Por ejemplo, si inicia sesión en su sitio WordPress, inmediatamente se visualizará una solicitud de admin-ajax.php en su archivo log. Los beneficios de esto son mejoras sobre la gestión de sesiones, el seguimiento de revisiones, y el autoguardado.

Desde el equipo de desarrollo de WordPress indicaron que, inicialmente, la API Heartbeat se va a utilizar para las copia de seguridad automáticas, si el usuario está editando o escribiendo un artículo y la sesión expira, se les mostrará una advertencia. La idea es tener una API relativamente simple que envía peticiones XHR al servidor cada 15 segundos y dispare eventos (o devoluciones de llamadas) en la recepción de datos. Otros componentes son capaces de ser notificados acerca de las actvidades de otro usuario. Esto puede ser usado para bloquear la edición simultánea de widgets y menús o otras tareas que requieren actualizaciones regulares desde el servidor.

Hay dos tipos diferentes de problemas que admin-ajax.php puede causar una respuesta lenta en los servidores. La primera es una cuestión de backend de la CPU y el segundo es un problema de interfaz en la que se dará cuenta de plugins de terceros…. También hubo una ligera actualización para mejorar la funcionalidad “sleep” y “wake-up” aunque todavía mucha gente sigue experimentando problemas.

Problemas backend CPU admin-ajax.php

El primer problema que encontramos es en el backend. El peso de admin-ajax.php sólo es de alrededor de 98 bytes, que es muy pequeña. Sin embargo, con el tiempo esto comienza a sumar. Mucha gente empieza a tener problemas de rendimiento en su servidor cuando éste es muy barato o está en servidores compartidos que poseen restricciones en la CPU. El sitio WP Tavern experimentó este problema y tuvo que cambiar de hosting.

En algunos casos, hemos experimentado que la API Hearbeat afecta a las cargas de CPU. Accedimos al panel de administración de WordPress y estuvimos observando los registros de acceso. Nos dimos cuenta de que con el panel de administración en el foco de solicitudes fueron espaciados cada 60 segundos. Con el panel de administración fuera de foco, las solicitudes fueron espaciadas cada 120 segundos. Por tanto, se trata de una gran cantidad de solicitudes si acaba de dejar su panel de administración abierto.

admin-ajax-php-slowY cada solicitud POST tuvo una ejecución del script PHP correspondiente en el servidor mediante el tiempo de CPU. Dejamos el panel de administración abierto durante 30 minutos y se registraron 25 ejecuciones de script PHP con un total de 5,77 segundos de CPU.

admin-ajax-php-slow-2Y eso fue sólo un usuario. Si hay varias personas iniciando sesión en WordPress (backend) el número de solicitudes de la API aumenta simultáneamente.

Plugin Hearbeat Control

hearbeat control

Entonces, ¿cómo podemos reducir las peticiones al servidor? El desarrollador Jeff Matson ha creado un plugin gratuito para WordPress llamado Hearbeat Control para administrar la API. También puede desactivarla por completo si lo desea, aunque no recomendamos hacer esto. Una vez hayamos instalado el plugin lo podremos encontrar en el panel de control en “Ajustes”.

En la página de configuración del plugin podemos encontrar las siguientes opciones:

  • Usar por defecto.
  • Desactivar todo.
  • Desactivarlo sólo en el panel de administración.
  • Permitir solamente cuando estamos en el editor. (Recomendado, ya que no deseamos expirar las sesiones y eliminar el guardado automático.)

A continuación, puedes cambiar la frecuencia de 15 segundos hasta unos 60 segundos. Cambiando el intervalo de 60 segundos es menos probable que experimentes problemas en el rendimiento del servidor.

heartbeat-control-settings

Original: You can then change the frequency from 15 seconds all the way up to 60 seconds. By changing the interval to 60 seconds you are less likely to experience server performance issues.

Problemas con plugin de terceros que usan admin-ajax.php

El segundo problema nos lo encontramos cuando usamos plugins de terceros que utilizan el fichero admin-ajax.php para ciertas funcionalidades AJAX como usar ventanas emergentes o contadores sociales. Algunos plugins hacen toneladas de peticiones POST a este archivo, que se suman rápidamente. ¿Cómo se puede diagnosticar qué plugins están usando admin-ajax.php? Bueno, una forma rápida, sin navegar a través de un montón de código, es usar la consola de Chrome (presionado F12) y mirar las solicitudes de red individuales.

Ejemplo 1 con el plugin: WP Notification Bar

En este ejemplo de abajo podemos ver que hay un tiempo de espera después de DOMContentLoaded.

chrome-devtools-admin-ajax

Nota: El hecho de que exista una solicitud no significa que necesariamente se está desacelerando su sitio abajo, ya que algunas cosas se pueden cargar de forma asíncrona. AJAX es cargado después de que la página se cargue, pero aún no es eficiente cuando los desarrolladores de plugins están haciendo toneladas de peticiones. Incluso cuando se utiliza AJAX debe de tener cuidado en usar el mínimo de peticiones posibles.

A continuación, puedes echar un vistazo a “post form action” en la cabecera de respuesta HTTP. En nuestra resolución de problemas el plugin casi siempre se revela en el nombre de la acción. Por ejemplo, se puede ver la acción es mtsnb_add_impression.

post-form-action

Si hacemos una búsqueda rápida en el código fuente de nuestra página podemos ver rápidamente la clase llamada “mtsnb” y ahora sabemos de que es nuestra barra de plugin de notificación en la parte superior de la página. El dato bar_id es otra pista.

post-action-style

Como se ve en las opciones del plugin, también está estableciendo la variable cookie.

Puedes deshabilitar el plugin por unos minutos, ejecutar las pruebas de velocidad adicionales y confirmar que esas solicitudes POST a admin-ajax.php ya no aparecen. También es importante observar que los plugin de almacenamiento en caché, no cachean el archivo admin-ajax.php ya que está dentro del directorio wp-admin.

Ejemplo 2 con el plugin: Monarch Social Sharing

En este segundo ejemplo usamos GTMetrix. Como se puede ver hubo 5 peticiones individuales que se realizan para admin-ajax.php, después de DOMContentLoaded.

admin-ajax-delays

Si ahondamos en la pestaña “POST” podemos ver “get_shares_count” lo que nos lleva directamente al plugin Monarch Social Sharing.

Hemos hecho esto muchas veces y por suerte la acción post casi siempre coincide con la clase, nombre del plugin etc. Así que conectando los puntos podemos diagnosticar rapidamente que está sucediendo. En ocasiones, la cabecera (header) nos puede alguna pista.

Para solucionar el problema, a veces, hay que contactar con los desarrolladores del plugin para ver si se puede realizar una carga más eficiente usando menos llamadas AJAX, aunque muchas veces no hay nada que hacer. En ese caso, lo ideal es buscar un plugin alternativo. Realizando una buena búsqueda se pueden encontrar plugins que hagan unas 6 o 7 llamadas AJAX, incluso plugins con la misma funcionalidad que realizan solo 1 llamada AJAX.

Así que la mejor solución a este problemas se trata de probar varios plugins con funcionalidades similares, hasta encontrar uno que no realice muchas llamadas AJAX y nos aumente el rendimiento de nuestro sitio.

Conclusión

La proxima vez que experimente un bajo rendimiento o ejecute una prueba de volocidad en WordPress sabrá que el archivo admin-ajax.php puede estar afectando su sitio. Lo puede hacer afectando tanto a la CPU como al backend o los plugins de terceros instalados en su sitio pueden estar realizando demasiadas peticiones AJAX. En ese caso podría ser el momento de buscar un plugin alternativo.

En caso de que no quiera cambiar de plugins, otra forma de arreglar el problema es contratar un mejor servicio de alojamiento como puede ser un VPS o un servidor dedicado. En Nicalia ofrecemos ambos servicios y estaremos encantados de acogeros.

 

2 respuestas a “Diagnóstico de admin-ajax.php: respuestas lentas en WordPress”

  1. Pedro dice:

    Hola, se me hace raro que nadie te haya agradecido ni escrito nada.. pero yo llevo alrededor 2 semanas peleando con eso, debido a que mi hosting me bloqueaba los servidores por que supuestamente consumia demasiados recursos..

    El caso es que creo que pude solucionarlo eliminando archivos que me daban la lata, y todo gracias a esta entrada.. es la mejor que he encontrado y lo que tengo claro es que si me vuelve a pasar algo así… lo solucionare en segundos..

    Osea que mil gracias 🙂 (Ojala me funcione) xD pero en principio parece que si..

    • Antonio Mateos dice:

      Hola Pedro!

      Gracias por comentar y esperamos que este post te sea de utilidad. Muy pronto traeremos algunos nuevos trucos sobre WordPress.

      Un saludo,
      Antonio

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


Calle Sant Marc 35, 08360, Canet de Mar, Barcelona, España|Desarrollada por Eenda Works | Diseñado por Denox