...

Por qué la caché de objetos a veces ralentiza WordPress

Muchos administradores activan el Caché de objetos y te preguntas por qué las páginas reaccionan más lentamente, las consultas se cuelgan o se producen errores 502. Te voy a mostrar las razones técnicas detrás de esto, cuando el almacenamiento en caché se rompe y cómo configurar la caché para que realmente acelera las cosas en lugar de ralentizarlos.

Puntos centrales

  • Hacinamiento por opciones autocargadas y transitorios provoca rechazos y tiempos de espera.
  • Conflictos entre Redis, Memcached y los plugins ralentizan las funciones.
  • Interpretación errónea de Site Health conduce a instalaciones innecesarias.
  • invalidación y la fragmentación mantienen datos obsoletos en la RAM durante demasiado tiempo.
  • Papel de la caché de páginas: la caché de objetos no la sustituye.

¿Qué ralentiza a veces la caché de objetos?

Una caché de objetos mantiene los resultados de la base de datos en RAM, pero sólo acelera si el Tasa de aciertos permanece alta y la memoria se gestiona limpiamente. Si las opciones autocargadas y los transitorios llenan la caché hasta el límite, el motor rechaza nuevas entradas y WordPress vuelve a la base de datos. Esto aumenta la latencia porque el servidor primero consulta la caché, luego falla, vuelve a ejecutar la consulta y puede acabar intentando guardar de nuevo en vano. En plataformas con límites estrictos, como 1 MB por objeto o búferes de unos 800 KB, el rendimiento cae bruscamente. Por ello, antes de modificar PHP o la base de datos, compruebo primero el tamaño y el número de entradas.

La sobrecarga de cada consulta a la caché también influye, aunque falte la entrada, lo que puede afectar a la Tiempo de respuesta para muchas consultas pequeñas y puntuales. En sitios con pocas consultas repetidas a la BD, el almacenamiento en caché apenas ofrece ventajas porque la gestión de las claves cuesta más de lo que ahorra. Cuanto más dinámicas son las páginas y más elementos específicos del usuario, más cautelosamente configuro la caché. Sin reglas claras de invalidación, los valores obsoletos permanecen y causan confusión en el backend y en la página en vivo. Un proceso limpio de escritura, caducidad y borrado mantiene las cosas rápidas.

Configuraciones erróneas y conflictos típicos

A menudo surgen conflictos cuando varios plugins utilizan un object-cache.php y se sobrescriben entre sí. Entonces una integración como Redis Object Cache Pro se desactiva silenciosamente, mientras que WordPress parece seguir funcionando normalmente. Puedo reconocer esto por la falta de estadísticas avanzadas o advertencias en las herramientas, a pesar de que Redis debería estar realmente activo. También veo a menudo indicaciones engañosas de falta de caché persistente en Site Health, aunque el servidor tenga APCu para el proceso local. Antes de instalar nuevos plugins, ordeno el entorno de caché existente y sólo permito un backend.

Los parámetros incorrectos de Redis o la latencia de la red son otro freno que se puede aplicar a cada Operación añadido. Un Redis en otro host con un RTT más alto convierte rápidamente el Object Cache en una pérdida de tiempo, incluso si la base de datos responde rápidamente a nivel local. A esto se añaden TTLs demasiado largos que conservan contenidos obsoletos. Los usuarios ven entonces precios de productos o cadenas de traducción antiguos durante minutos, a pesar de que hace tiempo que cambié los cambios en directo. Una comprobación rápida de la conexión, el espacio de nombres y los tiempos de expiración ahorra muchas horas de resolución de problemas; resumo más información de fondo en este artículo sobre errores de configuración típicos de Redis juntos.

Mantener limpias las opciones autocargadas y los transitorios

La tabla wp_options puede contener un Trampa cuando los plugins marcan grandes cantidades de datos como autocargados. WordPress carga estos valores de una sola vez con cada petición de página, lo que alimenta la caché de objetos con una cadena enorme. Si el tamaño supera el límite del búfer, el almacenamiento falla y el servidor entra en un bucle ineficiente de lectura, rechazo y recarga. Por eso mantengo los datos autoloaded muy por debajo de 800 KB y almaceno los bloques grandes en opciones no autoloaded o en tablas separadas. Suelo eliminar los transitorios cuando hace tiempo que están obsoletos o nunca caducan durante las actualizaciones.

Cuando empiezan los errores 502, desactivo brevemente el Cache en el backend, reducir las opciones de autocarga y reactivar la caché sólo después de una limpieza. Para ello, utilizo herramientas de análisis y me fijo en los principales consumidores: largas listas de redireccionamiento, objetos estadísticos, restos de sesión. Limpio agresivamente todo lo que no es absolutamente necesario para la primera carga. A continuación, vuelvo a medir el tiempo de carga, las consultas a la base de datos y el índice de aciertos de la caché. Sólo cuando estas cifras clave son correctas empiezo a realizar ajustes finos, como el tamaño de los fragmentos o la precarga.

Caché de objetos frente a caché de páginas: el papel correcto

Hago una clara distinción entre Caché de página y Object Cache, porque ambos resuelven problemas diferentes. Page Cache entrega páginas HTML enteras y ahorra PHP y la base de datos casi por completo. Object Cache, por su parte, acelera fragmentos recurrentes y opciones cuando PHP se está ejecutando de todos modos. En blogs y páginas sin contenido personalizado, Page Cache suele proporcionar el mayor impulso, mientras que Object Cache es de poca utilidad. Sólo muestra su fuerza con tiendas, filtros, funciones de búsqueda y muchos accesos a BD; resumo los detalles en esta visión general Caché de página frente a caché de objetos de forma práctica.

Por lo tanto, primero me aseguro de que más completo La caché de páginas está activa antes de cambiar la caché de objetos. Los tiempos de respuesta por debajo de 600 ms en el arranque en frío indican que el servidor funciona bien y que la caché de objetos sólo está afinando. Si falta la caché de página, la caché de objetos alivia los síntomas, pero la CPU sigue bajo carga. La página entonces escala mal porque cada visitante dispara de nuevo la pila PHP. La secuencia correcta ahorra costes y crea reservas resistentes para los picos de tráfico.

Seguimiento y medición: el diagnóstico correcto

Antes de cambiar la configuración, mido el PresenteConsultas por petición, tasa de aciertos de la caché, utilización de la RAM, tiempo medio de respuesta. Compruebo las rutas calientes, es decir, las consultas recurrentes que son adecuadas para la caché y las consultas puntuales que sólo generan sobrecarga. En la práctica, comparo tres escenarios: sin caché de objetos, con APCu/Redis local y con backends remotos. Esto me permite reconocer rápidamente si la latencia se debe a la red, a demasiadas escrituras fallidas en la caché o a la pila de PHP. Repito estas mediciones después de cada cambio para no tener sólo una corazonada, sino cifras fiables.

Esto me ayuda a clasificar rápidamente los patrones de error y las soluciones más comunes. Cuadro en la vida cotidiana. Muestra qué síntomas apuntan a qué causas y qué medidas inmediatas priorizo. Lo utilizo como lista de comprobación antes de profundizar en los archivos de registro. Esto me ahorra tiempo durante las escaladas y me permite volver a poner el sitio en funcionamiento más rápidamente. Los casos de ejemplo cubren la mayoría de los incidentes típicos.

Problema Causa Solución
Error 502 después de iniciar sesión Tampón sobrecargado por opciones autocargadas Reducir los datos autocargados a menos de 800 KB; vaciar los transitorios
Faltan funciones de Redis object-cache.php sobrescrito por otro plugin Eliminar el conflicto, activar el archivo correcto
Contenido antiguo a pesar de la actualización Invalidación de la caché a lento Purga selectiva, comprobación del TTL, desactivación de la escritura directa
Muchas consultas duplicadas Ninguna coincidencia, clave de caché incorrecta Normalización de claves, deduplicación de consultas

Comprobaciones rápidas y órdenes desde el terreno

Necesito algunas cifras significativas para el diagnóstico inicial. Empiezo con el tamaño de las opciones autoloaded directamente en la base de datos:

-- Determinar el tamaño de las opciones cargadas automáticamente
SELECT SUM(LENGTH(option_value)) AS bytes, COUNT(*) AS items
FROM wp_options
WHERE autoload = 'yes';

-- Buscar las opciones autocargadas más grandes
SELECT option_name, LENGTH(option_value) AS bytes
FROM wp_options
WHERE autoload = 'yes
ORDER BY bytes DESC
LIMIT 20;

Ordeno los transitorios que han caducado si se han quedado atrás:

-- Elimine los transitorios caducados (¡tenga cuidado, haga primero una copia de seguridad!)
DELETE FROM wp_options
WHERE option_name LIKE '_transient_%'
  AND option_name NOT LIKE '_transient_timeout_%''
  AND EXISTS (
    SELECT 1 FROM wp_options t
    WHERE t.option_name = CONCAT('_transient_timeout_', SUBSTRING_INDEX(option_name, '_transient_', -1))
      AND t.option_value < UNIX_TIMESTAMP()
  );

DELETE FROM wp_options
WHERE option_name LIKE '_site_transient_%'
  AND option_name NOT LIKE '_site_transient_timeout_%''
  AND EXISTS (
    SELECT 1 FROM wp_options t
    WHERE t.option_name = CONCAT('_site_transient_timeout_', SUBSTRING_INDEX(option_name, '_site_transient_', -1))
      AND t.option_value < UNIX_TIMESTAMP()
  );

Con Redis, compruebo si se producen rechazos o desalojos:

# Visión general básica
redis-cli INFO stats | egrep "evicted_keys|keyspace_misses|keyspace_hits"
redis-cli INFO memoria | egrep "memoria_usada_humana|memoria_máx|ratio_fragmentación"
redis-cli CONFIG GET maxmemory-policy

Para Memcached, las estadísticas proporcionan información sobre la presión de las losas y el tamaño de los elementos:

echo estadisticas | nc 127.0.0.1 11211
echo stats losas | nc 127.0.0.1 11211
echo stats items | nc 127.0.0.1 11211

Vigilo APCu a través de métricas agregadas: Tasa de aciertos, fragmentación, caché ocupada y número de entradas. Esto suele mostrar si las entradas son demasiado grandes o si nunca se borran porque faltan los TTL.

Serializador, compresión y detalles de red

La elección de Serializador y la compresión determinan el tamaño y la velocidad. El serializador PHP produce valores más grandes, pero es universal. Los serializadores binarios ahorran RAM y CPU, pero reducen la compatibilidad con algunas configuraciones. La compresión merece la pena para estructuras grandes y repetitivas (por ejemplo, mapas taxonómicos), pero no para objetos muy pequeños, donde la sobrecarga se come la ventaja. Yo activo la compresión de forma selectiva y acepto que sólo puedo evitar el límite de 1 MB de los backends individuales mediante una división inteligente, no mediante una compresión ciega.

En el mismo host, me baso, en la medida de lo posible, en Enchufes Unix en lugar de TCP: Esto ahorra latencia y sobrecarga del sistema. Si Redis es externo, compruebo el RTT y los tiempos de ejecución de los paquetes fluctuantes. Sólo 1-3 ms de latencia adicional por consiga/configure se acumulan bajo carga. Las conexiones persistentes reducen la sobrecarga de configuración, mientras que el pipelining ayuda con las series de operaciones. Al mismo tiempo, me aseguro de que los tiempos de espera demasiado agresivos no provoquen tormentas de reconexiones innecesarias.

Estampida de cachés: controlar la avalancha

Un patrón que a menudo se pasa por alto es el Cache StampedeUna clave cara caduca, varios procesos notan el vacío y regeneran los mismos datos al mismo tiempo. El resultado son picos de carga y tiempos de espera ocasionales. Yo mitigo esto con tres tácticas:

  • Jitter sobre los TTL: en lugar de 300 s fijos, utilizo 240-360 s aleatoriamente para que las teclas no se inclinen al mismo tiempo.
  • Inspiración suave: Se permite que las entradas se „sobrecarguen“ brevemente mientras un único proceso se hace cargo de la regeneración.
  • Cerraduras para reconstrucciones costosas: pongo una llave de bloqueo corta antes de la generación. Si falla, vuelvo a entregar el valor antiguo y lo intento más tarde.

Esto significa que los tiempos de respuesta permanecen estables, incluso cuando las páginas muy frecuentadas reinician su generación de claves. En las páginas de tiendas, esto se nota especialmente en los resultados de filtros y búsquedas.

APCu, Redis y Memcached en funcionamiento

Los tres backends tienen Peculiaridades:

  • APCu es por proceso. Esto hace que los accesos sean extremadamente rápidos, pero las entradas no son compartidas entre los procesos de PHP FPM. La fragmentación puede ser minimizada a través de TTLs sensibles, tamaños de entrada moderados y suficiente shm_size en jaque. Para los scripts CLI, deliberadamente sólo activo APCu si quiero el efecto, para que los trabajos de calentamiento no ralenticen las áreas de caché de FPM.
  • Memcached funciona con losas. Los objetos muy grandes tienen que ir a parar a clases correspondientemente grandes; si éstas siguen siendo escasas, se producen rechazos a pesar de que haya memoria libre en otras losas. Con tamaños de objetos por debajo del límite máximo y una división en varias claves, evito este callejón sin salida.
  • Redis es flexible, pero el política de memoria máxima decide qué claves caen bajo presión. Prefiero namespaces dependientes de políticas con TTL para que los desalojos no golpeen datos de configuración „eternos“. La persistencia AOF/RDB cuesta CPU y E/S; en operación de caché pura, la calculo conscientemente o uso lazy free para evitar bloqueos.

Es importante diferenciar entre datos calientes y fríos: Los fragmentos de catálogo y navegación reciben TTL más largos, mientras que los contextos de usuario fugaces viven poco tiempo o se quedan completamente fuera. De este modo, la caché sigue siendo relevante y se limpia sola.

Estrategia de descarga, espacios de nombres y multisitios

„Una vez Tirar de la cadena y bueno“ no suele ser una buena idea. Si otro proyecto se está ejecutando en el mismo Redis o la instancia comparte varias etapas, se trata de un riesgo de producción. Yo trabajo con Espacios de nombres y purga basada en prefijos. En WordPress, además, aseguro la separación mediante el prefijo de la base de datos y un prefijo de clave específico del proyecto. Para la puesta en escena/en vivo, utilizo bases de datos separadas o prefijos únicos para que las claves en vivo nunca se pierdan accidentalmente.

En configuraciones multisitio, el ID del blog forma parte de la estrategia clave. Esto evita los rebotes entre sitios y permite una purga selectiva por sitio. Cuando se trasladan dominios, planifico una ruta de migración: las claves que contienen componentes de dominio deben reconstruirse de forma controlada en lugar de caer en combinaciones antiguas/nuevas huérfanas.

Estructuras de datos, fragmentación y limitaciones de la RAM

Una caché de objetos gana EstructuraLas claves pequeñas y bien definidas con TTL claros pueden gestionarse de forma eficiente. Si se almacenan matrices u objetos enormes como una sola entrada, aumenta el riesgo de fragmentación y pérdida de memoria. Entonces, las nuevas entradas ya no caben en los huecos existentes a pesar de que la memoria total esté libre. Por eso divido los trozos grandes en varias claves más pequeñas que pueden ejecutarse de forma independiente. Esto reduce la tasa de error y aumenta las posibilidades de acierto.

La gestión de la memoria suele seguir estrategias LRU que minimizan los usos poco frecuentes. Entradas eliminar primero. Si no pincho los datos importantes o los escribo con un TTL sensato, LRU desplaza exactamente los objetos equivocados bajo carga. También compruebo el tamaño máximo del objeto, porque una entrada puede ser técnicamente demasiado grande aunque la RAM total siga libre. Paso por alto fácilmente estos valores límite hasta que de repente aparecen fallos masivos. Por lo tanto, siempre merece la pena echar un vistazo a los contadores de errores y a los detalles del backend.

Selección correcta de plugins y estrategia de puesta en escena

Considero el número de plugins de caché activos bajo y utilizar un backend que se adapte al alojamiento. Redis es a menudo adecuado para cachés compartidas a través de múltiples procesos PHP, mientras que APCu es adecuado para el acceso local rápido. En entornos de prueba, me aseguro de que la caché utiliza su propio espacio de nombres para que los datos en vivo no se filtren accidentalmente. Antes de cada lanzamiento, vacío sistemáticamente la caché de páginas y objetos y pruebo una vez en frío y otra en caliente. Esto me permite detectar las regresiones antes de que afecten a los clientes.

Para las actualizaciones, compruebo los registros de cambios de Cache-claves o ganchos de invalidación. Aquí es exactamente donde se esconden los frenos cuando un plugin utiliza nuevas rutas de datos que el mecanismo de purga existente no reconoce. Por lo tanto, establezco un plan de pruebas corto y fijo después de las actualizaciones: Cesta de la compra de WooCommerce, búsqueda, vistas con sesión iniciada, traducciones. En cuanto algo se bloquea, retrocedo y aíslo el desencadenante. Esta disciplina ahorra tiempo de inactividad y protege las tasas de conversión.

Configuración para WooCommerce, WPML y contenido dinámico

Las tiendas y el multilingüismo aumentan la Dinámica y, por tanto, los requisitos de la caché. Para WooCommerce, fijo las consultas de producto y taxonomía más utilizadas, mientras que mantengo deliberadamente los valores de la cesta de la compra y los específicos del usuario cortos o los excluyo por completo de la caché. Con WPML, hay muchas variantes de la misma consulta; aquí merece la pena una estrategia de claves con sufijos de idioma y TTL moderados. También compruebo los hooks que se purgan de forma fiable durante las actualizaciones de productos. Esto mantiene el catálogo fresco sin que yo tenga que actualizar demasiado.

Los formularios, cuadros de mando y precios personalizados requieren sensibilidad por la relación entre velocidad y corrección. Evito almacenar en caché datos de sesión o tokens relevantes para la seguridad, aunque parezca tentador. En su lugar, me concentro en las consultas caras y de sólo lectura y mantengo las rutas de invalidación y los TTL cortos. El resultado es una página notablemente más rápida que sigue siendo correcta y segura. Aquí es exactamente donde el almacenamiento en caché sensato se separa de los atajos arriesgados.

Paso a paso: Del error 502 a la página rápida

Si, tras activar la caché de objetos, la página de repente vacila, Procedo sistemáticamente. Primero, desactivo brevemente la caché para que el sitio vuelva a cargarse y guardo el object-cache.php. A continuación, analizo las opciones de carga automática más grandes, elimino los transitorios innecesarios y reduzco el total muy por debajo del límite crítico. A continuación, reactivo la caché, mido la tasa de aciertos y el tiempo de respuesta y controlo los rechazos en los registros. Sólo entonces optimizo los parámetros de Redis, los TTL y el espacio de nombres si sigue habiendo problemas.

Las páginas individuales permanecen lento, Busco las consultas con mayor duración total y compruebo si pueden deduplicarse o materializarse. Descompongo los objetos de caché de gran tamaño en unidades más pequeñas y establezco ganchos de purga específicos para las actualizaciones. Si la latencia de la red hacia el Redis remoto se hace notable, cambio a APCu local o a una instancia de Redis cercana al host como prueba. Documento cada cambio con valores medidos para poder asignar claramente los efectos. Este enfoque en los números me impide hurgar en la oscuridad.

Resumen: Lo que monté en la práctica

Sólo activo Object Cache cuando Carga DB es medible y existen consultas recurrentes. Previamente configuro una caché de páginas para que no se produzca una carga pesada. A continuación, reduzco las opciones de carga automática, ordeno los transitorios y defino TTL claros. Para las tiendas y los sitios multilingües, planifico las claves de forma limpia con sufijos y garantizo una invalidación fiable. Si quieres profundizar más, puedes encontrar una introducción compacta en Caché de objetos y ajuste de la base de datos.

Compruebo regularmente el Tasa de aciertos, la latencia media y los contadores de errores de los backends de caché. En cuanto aparecen advertencias en Site Health, las valido con mediciones reales en lugar de instalar inmediatamente más plugins. Si dos plugins de caché están funcionando al mismo tiempo, elimino uno y dejo un sistema funcionando limpiamente. Con límites como 1 MB por objeto o búferes de 800 KB, planifico conscientemente el reparto de las claves. De este modo, aprovecho las ventajas de la caché de objetos sin caer en las trampas típicas.

Artículos de actualidad