Stress de HTTP

Saudações.

Nesse tutorial vou abordar os procedimentos para stress e benchmark de servidores HTTP para aferir a capacidade real de sites, APIs e Webhooks.

1 – Apache AB

O comando “ab” do Apache é o mais antigo, estável e eficiente de todos.

Bash
# Instalar apache2-utils
apt -y install apache2-utils;

# Menu de ajuda
ab -h;
   # Usage: ab [options] [http[s]://]hostname[:port]/path
   # Options are:
   #     -n requests     Number of requests to perform
   #     -c concurrency  Number of multiple requests to make at a time
   #     -t timelimit    Seconds to max. to spend on benchmarking
   #                     This implies -n 50000
   #     -s timeout      Seconds to max. wait for each response
   #                     Default is 30 seconds
   #     -b windowsize   Size of TCP send/receive buffer, in bytes
   #     -B address      Address to bind to when making outgoing connections
   #     -p postfile     File containing data to POST. Remember also to set -T
   #     -u putfile      File containing data to PUT. Remember also to set -T
   #     -T content-type Content-type header to use for POST/PUT data, eg.
   #                     'application/x-www-form-urlencoded'
   #                     Default is 'text/plain'
   #     -v verbosity    How much troubleshooting info to print
   #     -w              Print out results in HTML tables
   #     -i              Use HEAD instead of GET
   #     -x attributes   String to insert as table attributes
   #     -y attributes   String to insert as tr attributes
   #     -z attributes   String to insert as td or th attributes
   #     -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)
   #     -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
   #                     Inserted after all normal header lines. (repeatable)
   #     -A attribute    Add Basic WWW Authentication, the attributes
   #                     are a colon separated username and password.
   #     -P attribute    Add Basic Proxy Authentication, the attributes
   #                     are a colon separated username and password.
   #     -X proxy:port   Proxyserver and port number to use
   #     -V              Print version number and exit
   #     -k              Use HTTP KeepAlive feature
   #     -d              Do not show percentiles served table.
   #     -S              Do not show confidence estimators and warnings.
   #     -q              Do not show progress when doing more than 150 requests
   #     -l              Accept variable document length (use this for dynamic pages)
   #     -g filename     Output collected data to gnuplot format file.
   #     -e filename     Output CSV file with percentages served
   #     -r              Don't exit on socket receive errors.
   #     -m method       Method name
   #     -h              Display usage information (this message)
   #     -I              Disable TLS Server Name Indication (SNI) extension
   #     -Z ciphersuite  Specify SSL/TLS cipher suite (See openssl ciphers)
   #     -f protocol     Specify SSL/TLS protocol
   #                     (SSL2, TLS1, TLS1.1, TLS1.2, TLS1.3 or ALL)
   #     -E certfile     Specify optional client certificate chain and private key
   # 

Usando o ab:

Bash
# URL a ser testada, troque pela sua URL alvo
URL="https://meusite.com/webhook/log-receive";

# Enviando 10.000 requisicoes no total, abrir no maximo 100 em paralelo
ab \
   -n 10000 \
   -c 100 \
   $URL;
   
# Enviando payload JSON, tipo JSON, metodo POST, 500 requisicoes, maximo 50 paralelo
echo '{ "level": "warn", "message": "Burn server, burn" }' > /tmp/payload1.json;
ab \
    -n 500 \
    -c 50 \
    -p /tmp/payload1.json \
    -T application/json \
    $URL;

# Payload de API autenticada com Bearer, 200 reqs, 20 em paralelo:
URL="https://meusite.com/api/store";
TOKEN="ak-store-38a8838j3h_h40h1";
echo '{"event":"order.created","id":42,"value":99.90}' > /tmp/payload2.json;
ab \
    -n 200 \
    -c 20 \
    -m POST \
    -p /tmp/payload2.json \
    -T 'application/json' \
    -H "Authorization: Bearer $TOKEN" \
    -H "X-Test: 123" \
    $URL;

.

.

Pai dele, alho; mãe, cebola.
Como pode ele cheirar bem?
Provérbio Árabe

Terminamos por hoje!

Patrick Brandão, patrickbrandao@gmail.com