Test de estrés para WordPress

Una de las preocupaciones habituales de los que tienen un sitio web con WordPress es saber cuánto tráfico y a qué velocidad les funcionará a los usuarios el sitio web. Y la herramienta para ello es la de un test de estrés.

Para hacer estas pruebas podemos usar AB (Apache HTTP server benchmarking tool), pero también una herramienta más moderna en llamada wrk (a HTTP benchmarking tool). La herramienta la deberemos tener en una máquina conectada a Internet si queremos hacer llamadas a una web pública. En este caso el ejemplo será sobre Ubuntu.

Instalación de la herramienta

Lo primero que hemos de hacer es descargar y compilar la herramienta. Una vez acabado estará disponible en el servidor.

apt -y install build-essential libssl-dev git unzip
cd
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
cp wrk /usr/local/bin

A partir de este momento, podemos ejecutar la herramienta y ver sus opciones.

Usage: wrk <options> <url>
  Options:
    -c, --connections <N>  Connections to keep open
    -d, --duration    <T>  Duration of test
    -t, --threads     <N>  Number of threads to use
    -s, --script      <S>  Load Lua script file
    -H, --header      <H>  Add header to request
        --latency          Print latency statistics
        --timeout     <T>  Socket/request timeout
    -v, --version          Print version details
  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)

Haciendo una primera prueba

Pruebas de estrés puede haber varias, así que haremos una primera prueba, sencilla, que es la de acceder, mucho, a la página principal de nuestro sitio.

La configuración dependerá mucho de los recursos de la máquina. En este caso, vamos a hacer una prueba en un VPS que tiene 4 CPU, y haremos una prueba durante 30 segundos. Según la configuración que tengamos, podemos añadir más o menos usuarios simultáneos (por CPU), en este caso 250 usuarios. En total significa que habrá 1.000 usuarios en 30 segundos.

wrk -c250 -d30s -t4 --latency --timeout 5s https://www.example.com/
  • c: 250 conexiones por hilo
  • d: 30 segundos
  • t: 4 hilos (CPU)

El resultado será similar a este:

Running 10s test @ https://www.example.com/
  1 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.85s   902.12ms   3.56s    83.67%
    Req/Sec    15.08      7.34    40.00     85.71%
  Latency Distribution
    50%    3.31s
    75%    3.39s
    90%    3.44s
    99%    3.53s
  147 requests in 10.02s, 1.40MB read
Requests/sec:     14.67
Transfer/sec:    142.55KB

Para ajustar las peticiones deberías tener en cuenta como base las CPU de la máquina, y la cantidad de peticiones (si quieres probar normal, 100 está bien, si tienes montado algo muy bien, una prueba interesante es de 1.000. El tiempo, el que se considere… entre 30 segundos y 1 minuto está bien.

Estresando el login

Sin duda probar la página principal está bien, pero como puede haber caché, en realidad nos e prueba mucha cosa, así que quizá podamos estresar el sistema accediendo al panel de administración (puede ser de un usuario sin permisos). En este caso el test va a estar más en la base de datos.

Lo primero que deberemos hacer es crear un fichero de configuración especial. Aquí incluiremos la página del login, y el usuario y contraseña de un usuario.

vim wplogin.lua

Ahí incluiremos los datos de acceso y la prueba.

wrk.method = "POST"
wrk.body   = "log=usuario_de_test&pwd=contrasenya_del_usuario&wp-submit=Acceder&testcookie=1&redirect_to=https://www.example.com/wp-admin/"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"

En este caso, la prueba no puede ser tan grande como en el caso anterior. Lo que probaremos será cuántos logins/segundo se pueden hacer. Por ejemplo, probemos si se pueden hacer 10 logins por segundos.

wrk -c100 -d10s -t1 --latency --timeout 5s -s wplogin.lua https://www.example.com/wp-login.php

Haciendo peticiones a múltiples URL

Una de las cosas que habitualmente se suele probar es llamar a sólo una única URL, y quizá lo más interesante es elegir y probar distintas URL: la página principal, una categoría, una entrada, una página, un producto…

vim wpurl.lua

Ahí incluiremos los datos de acceso y la prueba.

init = function(args)
  local r = {}
  r[1] = wrk.format(nil, "pagina/")
  r[2] = wrk.format(nil, "post/")
  r[3] = wrk.format(nil, "tag/etiqueta/")
  r[4] = wrk.format(nil, "category/categoria/")
  req = table.concat(r)
end
request = function()
  return req
end

Ahora haremos la prueba para que llame, de forma aleatoria, a estas URL…

wrk -c1k -d1m -t16 --latency --timeout 5s -s wpurl.lua https://www.example.com/

Y a probar y optimizar.

Deja un comentario