El pico es una fecha, y la preparación también
El Black Friday cae el día después de Thanksgiving, que la ley federal de Estados Unidos fija en el cuarto jueves de noviembre. En 2026 eso da el jueves 26 de noviembre para Thanksgiving, el viernes 27 de noviembre para el Black Friday y el lunes 30 de noviembre para el Cyber Monday. Estas fechas se calculan a partir de esa regla: contrástelas con el calendario comercial de su mercado, que puede adelantar o alargar sus propias campañas.
Quedan cuatro semanas en la fecha de este artículo. Es suficiente para congelar, medir y corregir, no para reconstruirlo todo. El objetivo no es tener el servidor más grande posible, sino conocer el límite del suyo antes de que el tráfico lo encuentre por usted, y decidir de antemano qué hará si se alcanza.
Qué tumba una tienda durante el pico
- Una caché que solo sirve a visitantes anónimos — en cuanto hay una cookie de carrito o de sesión, PHP y la base de datos recalculan la página en cada solicitud.
- Consultas SQL tolerables con poco tráfico — una consulta lenta no molesta a nadie con cinco visitantes. Con doscientos a la vez, retiene conexiones y hace esperar a todas las siguientes.
- Demasiados procesos PHP para la memoria disponible — cada proceso consume RAM.
- Un cambio de última hora — una extensión, un tema o un código promocional mal configurado subido el día anterior. Es la causa más evitable, y la congelación la elimina.
- Un servicio de terceros llamado en cada página vista — un módulo de envío, de opiniones o de fidelización consultado de forma síncrona. Si se ralentiza, la tienda se ralentiza con él, aunque su servidor no tenga culpa.
- Ninguna consigna escrita — nadie sabe quién decide desactivar una función, con qué umbral ni quién avisa al cliente. Se improvisa durante la caída, lo que la alarga.
Congelar los cambios: cuatro semanas, una fecha de corte
La congelación es la medida más barata y eficaz: mientras el código y la configuración no se muevan, lo que midió sigue siendo cierto. Elija una fecha de corte, por ejemplo el viernes 20 de noviembre, una semana antes del pico. Después, ninguna actualización del CMS, ninguna extensión nueva, ningún cambio de tema. Solo pasan las correcciones de errores críticos, probadas en la copia y anotadas en un registro.
La congelación no cubre las actualizaciones automáticas: desactívelas durante el periodo. La tabla siguiente se repite cada año desplazando las fechas.
Haga una copia de seguridad completa justo antes de la congelación (archivos, base de datos, configuración del servidor) y restáurela una vez en la copia cronometrando la operación: esa duración es un dato del plan de contingencia. La diferencia entre instantánea y copia de seguridad se explica en snapshot o copia de seguridad de un VPS.
Calendario de preparación para repetir cada año
Desplace la tabla
| Periodo | Qué se hace | Prueba esperada |
|---|---|---|
| Hasta el 6 de noviembre | Inventario: versión del CMS, extensiones, servicios de terceros, tareas programadas, plan de alojamiento | Una tabla fechada, con una persona responsable por línea |
| Del 9 al 13 de noviembre | Copia de la tienda y prueba de carga de referencia | Resultado conservado con el comando exacto y el escenario |
| Del 16 al 19 de noviembre | Ajustes de caché, base de datos y PHP, y nueva prueba | Mismo escenario, mismos parámetros, resultados comparados |
| Viernes 20 de noviembre | Congelación de cambios, copia de seguridad completa | Restauración probada, no solo copia realizada |
| Del 21 al 26 de noviembre | Solo correcciones críticas, tras probarlas en la copia | Registro de cambios al día |
| Del 27 al 30 de noviembre | Vigilancia del pico, plan de contingencia listo para usar | Alertas activas y una persona de guardia designada |
Medir sobre una copia con k6 y ab
Preparar una copia de la tienda
No pruebe nunca la tienda en producción: una prueba de carga puede tumbarla, ensuciar sus estadísticas y crear pedidos falsos. Restaure una copia de seguridad en un VPS o alojamiento de pruebas de la misma familia que producción, con la misma versión de PHP y la misma base de datos. Anonimice a los clientes, corte el envío de correos y ponga los módulos de pago en modo de prueba.
Escribir el escenario antes de elegir la herramienta
Liste el recorrido de un comprador: portada, página de categoría, página de producto, añadir al carrito, página del carrito y comienzo del proceso de compra. Decida el peso de cada paso, por ejemplo muchas páginas de producto y pocos pagos. Un escenario limitado a la portada mide la caché, no la tienda.
Instalar k6
k6 es la herramienta de pruebas de carga de código abierto de Grafana, un único binario. Siga la instalación descrita en la documentación oficial de k6 en la máquina que genera la carga, nunca en el servidor probado, y compruebe con
k6 version.Escribir el script sobre una subida progresiva
En un archivo
charge.js, importehttpdesdek6/httpycheckdesdek6. Declare un escenario conexecutor: 'ramping-arrival-rate'(documentación de k6): fija un número de iteraciones por segundo con independencia de la rapidez de respuesta del sitio, lo que se parece más a la llegada de visitantes que un número fijo de usuarios virtuales. RellenestartRate,timeUnit,preAllocatedVUs,maxVUsy unasstagesque suban por escalones. En la función por defecto, encadenehttp.getsobre la página de producto y luegohttp.postsobre añadir al carrito, con unchecksobre el código 200.Fijar umbrales que hagan fallar la prueba
Añada
thresholdsa las opciones:http_req_failed: ['rate<0.01']yhttp_req_duration: ['p(95)<800']. Los valores son suyos, según lo que toleren sus clientes, no una cifra copiada. Si un umbral no se cumple, k6 termina con un código de salida distinto de cero, lo que permite repetir la prueba en una rutina automática. Loscheckno tienen ese efecto: solo los umbrales hacen fallar la prueba.Lanzar la prueba y observar el servidor a la vez
Ejecute
k6 run -e BASE_URL=https://copia.your-domain.com charge.js. En una sesión SSH en el servidor probado, deje corriendotopohtopy vigilefree -mpara la memoria y el swap. Anote en qué escalón de la subida despegan los tiempos de respuesta y qué recurso se satura primero: procesador, memoria, conexiones a la base de datos o disco.Completar con una prueba rápida con ab
ApacheBench comprueba una página concreta en una línea:
ab -n 500 -c 20 -k https://copia.your-domain.com/producto/ejemplo/. La opción-nindica el total de solicitudes,-clas simultáneas y-kactiva la conexión persistente. La documentación de Apache señala que la herramienta no implementa HTTP/1.x por completo: reserve su uso para comparar antes y después de un ajuste, no para medir una capacidad.Repetir la misma prueba tras cada ajuste
Cambie una sola cosa cada vez: caché, número de procesos PHP, un índice de la base de datos. Vuelva a lanzar exactamente el mismo comando y guarde los resultados en un archivo fechado.
Leer el resultado: el pico, no el promedio
Un tiempo de respuesta medio oculta lo que vive el comprador con mala suerte. Lea el percentil 95, o el 99 para los casos más lentos, y la tasa de errores. Una tienda cuyo promedio sigue siendo correcto pero donde uno de cada veinte compradores espera varios segundos pierde carritos sin que el promedio lo indique.
Mire también la forma de la curva. Un tiempo estable seguido de una caída brusca indica un límite duro, como un número máximo de conexiones a la base de datos o de procesos PHP. Esta prueba no dice cuántos visitantes reales recibirá: dice a qué ritmo de llegadas su copia, en las condiciones de la prueba, empieza a degradarse.
Aquí no se publica ningún resultado numérico, y es deliberado: una cifra medida en una máquina de pruebas no dice nada de la suya, y el script anterior solo se ejecutó contra un destino ficticio para validar su sintaxis, lo que no demuestra ninguna capacidad. La única medición que cuenta es la que tome sobre su propia copia.
Síntomas durante la prueba y pistas a seguir
Desplace la tabla
| Lo que observa | Causa probable | Qué medir |
|---|---|---|
| Tiempo de respuesta que sube con la carga, procesador al máximo | Demasiadas páginas calculadas por PHP en lugar de servirse desde la caché | Proporción de páginas servidas desde la caché para visitantes anónimos |
| Memoria llena y luego uso de swap | Demasiados procesos PHP para la RAM disponible | Memoria por proceso PHP y número de procesos permitidos |
| Errores 502 o 504 a ráfagas | Todos los procesos PHP ocupados, o cola saturada | Ajuste del pool PHP y duración de las solicitudes más lentas |
| Procesador tranquilo pero tiempo de respuesta alto | Espera de la base de datos o de un servicio de terceros | Registro de consultas lentas, duración de las llamadas externas |
| Error "too many connections" | Límite de conexiones de la base de datos alcanzado | Valor de `max_connections` y conexiones realmente usadas |
| Páginas de producto rápidas pero carrito lento | El carrito evita la caché, como debe, y carga la base de datos | Consultas que dispara el añadir al carrito |
Caché: lo que se sirve rápido y lo que nunca debe cachearse
La documentación de WooCommerce es clara: las páginas de carrito, de pedido y de cuenta deben seguir siendo dinámicas, porque muestran información propia del cliente. Exclúyalas de toda caché, en el plugin, en el servidor y en la red de distribución, y compruebe las cookies de sesión y de carrito que usa su versión de WooCommerce. Una página de carrito cacheada por error muestra el carrito de otro comprador, algo peor que una caída.
Para el resto, haga la lista de lo que puede servirse tal cual: portada, categorías, fichas de producto para visitantes sin cookies. El detalle de las rutas que excluir en la red de distribución se trata en nuestra guía sobre Cloudflare y la caché de un sitio cliente. En PrestaShop, la documentación para desarrolladores recomienda activar la caché Smarty en la página de Rendimiento y no activar la sección Caché cuando MySQL o MariaDB se ejecuta en la misma máquina. Compruebe estos ajustes en el back office de su versión y repita la prueba tras cada cambio.
Base de datos y caché de objetos
Active el registro de consultas lentas de MariaDB antes de la prueba: SET GLOBAL slow_query_log=1; y luego SET GLOBAL long_query_time=1; para un umbral de un segundo, valor que debe ajustar. Estos ajustes en caliente desaparecen al reiniciar; para conservarlos, póngalos en la configuración. A partir de MariaDB 10.11, las variables se renombran con el prefijo log_slow_, así que compruebe el nombre de su versión.
Una caché de objetos como Redis alivia la base de datos al guardar en memoria los resultados repetidos. Póngale un límite con maxmemory y elija la política de expulsión con maxmemory-policy: la documentación de Redis indica que allkeys-lru es una buena opción por defecto cuando una parte de las claves se lee mucho más que el resto, mientras que noeviction devuelve un error cuando la memoria está llena. Vigile keyspace_hits y keyspace_misses en INFO stats durante la prueba: una tasa de aciertos baja indica una caché que no sirve de nada.
Cargue solo lo que le pertenece
Dirija la prueba a su copia, nunca a la pasarela de pago, a un servicio de envío ni a una API de terceros: la herramienta los sobrecargaría y podrían bloquear su cuenta. Si su escenario debe pasar por el pago, use el modo de prueba del proveedor, con su acuerdo.
Dimensionar: una hipótesis que validar con la medición
Si la prueba revela que la copia se satura demasiado pronto, hay dos vías: corregir el software o cambiar de plan. Si la máquina sigue siendo el factor limitante, aumente la memoria o los núcleos por escalones y repita la misma prueba tras cada uno, hasta que la curva aguante con un margen que considere suficiente.
Una recomendación de recursos leída en una web, incluida esta, sigue siendo una hipótesis: solo cuenta su medición sobre su tienda. El método para leer el consumo está detallado en dimensionar un VPS para el sitio de un cliente. Cuando una máquina ya no basta, HAProxy en un VPS reparte la carga, a costa de una arquitectura más compleja.
Si no hace usted mismo esta prueba
Muchos comerciantes confían la tienda a una agencia o a un proveedor de alojamiento. La prueba sigue siendo necesaria: hay que pedirla. Exija tres cosas por escrito antes de la fecha de congelación: el resultado fechado de una prueba de carga sobre una copia, con el escenario y el tiempo de respuesta en el percentil 95 leído en el pico; la lista de cambios previstos y la fecha de congelación acordada; un plan de contingencia firmado, que nombre a la persona autorizada a desactivar funciones o a restaurar la copia de seguridad. Un informe que solo cita el promedio, o un «todo está listo» sin resultado, no responde a la petición.
Decida también con ellos quién zanja el día D: el plan de contingencia cuesta funciones, es decir ventas, y esa decisión corresponde al negocio, no solo al proveedor técnico.
El plan de contingencia, una línea por decisión
- Quién decide — una persona designada, con suplente, autorizada a activar el plan sin consultar a un comité.
- Con qué umbral — por ejemplo una tasa de errores o un tiempo de respuesta que definió durante las pruebas, leído por la monitorización y no a ojo.
- Acción de descarga — desactivar las funciones no esenciales: recomendaciones de productos, opiniones, búsqueda predictiva, extensiones pesadas probadas una a una durante el ensayo.
- Segunda acción — activar una página clara de cola o de mantenimiento con la hora prevista de vuelta, en lugar de un error en bruto.
- Último recurso — restaurar la copia anterior a la congelación, con el tiempo de restauración medido y el acuerdo de quien decide.
- Quién avisa — al cliente, al equipo de marketing que impulsa la campaña y a su proveedor de alojamiento, con un mensaje ya redactado.
Después del pico: conservar la medición para el año próximo
Conserve el script, el comando, los resultados y el registro de cambios en una carpeta fechada. El año próximo repetirá la misma prueba sobre la nueva versión de la tienda, y la comparación mostrará si las extensiones añadidas durante el año han encarecido el recorrido.
Para seguir la disponibilidad de las tiendas durante el periodo, consulte el informe de disponibilidad de los sitios cliente.