Apache ab - testando com 1000 simultaneidade

2

Estou apenas tentando reunir algumas informações sobre a capacidade do servidor e executei esse teste ab do apache.

Eu testei com 1, 10, 100, 1000 simultaneidade por 1 minuto. O resultado abaixo é para 1000 usuários simultâneos

Estou usando este script de referência - link A única coisa que eu mudei foi substituir a consulta Benchmark do MySQL (1 milhão, Encode (...)) por outro Benchmark mais simples (1 milhão, 1 + 1)

O script leva aproximadamente 0,52 segundos para ser concluído, de forma que em um minuto eu esperaria cerca de 115 solicitações concluídas em condições ideais.

Resultado de ab -t 60 -n 5000 -kc 1000 mydomain-name/benchmark.php

Benchmarking mydomain-name (be patient)
Finished 111 requests

Server Software:        Apache/2.4.18
Document Path:          /benchmark.php
Document Length:        4210 bytes

Concurrency Level:      1000
Time taken for tests:   60.383 seconds
Complete requests:      111
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      486180 bytes
HTML transferred:       467310 bytes
Requests per second:    1.84 [#/sec] (mean)
Time per request:       543987.550 [ms] (mean)
Time per request:       543.988 [ms] (mean, across all concurrent requests)
Transfer rate:          7.86 [Kbytes/sec] received

Connection Times (ms)
                  min  mean[+/-sd] median   max
Connect:       57  136  42.2    140     199
Processing:  2362 30681 16963.4  31249   60180
Waiting:     2362 30680 16963.4  31248   60180
Total:       2425 30817 17005.2  31389   60378

Percentage of the requests served within a certain time (ms)
  50%  31306
  66%  39785
  75%  45021
  80%  47629
  90%  54320
  95%  57756
  98%  58191
  99%  59632
 100%  60378 (longest request)

Por isso, com 1000 níveis de simultaneidade, foram concluídas 111 solicitações. Minhas perguntas são:

1) Mostra dois valores Time per requests . Eu sei que esse script leva cerca de 520 milissegundos para ser executado quando eu faço check-in no navegador. Então, o segundo valor de 543,988 [ms] (significa, em todas as solicitações simultâneas) o tempo real por solicitação quando o teste estava em execução? Primeira vez por valor de solicitação de 543987.550 parece ser apenas: 543.988 x 1000 (usuários simultâneos)? isso significa que demorou cerca de 54 segundos para executar os testes (como "Tempo para testes" diz 60.383 segundos?)

Tudo o que estou tentando fazer é saber em que ponto ele afeta o desempenho do servidor. Observando acima no nível de simultaneidade 1000, ele ainda é capaz de atender a 1,84 solicitações por segundo no tempo médio por solicitação de 543 milissegundos - o que é esperado quando não há carga?

Se você estiver interessado aqui, há dados para o nível de simultaneidade 10 e 100.

ab -t 60 -k -n 500 -c 10 mydomain-name/benchmark.php

Benchmarking mydomain-name (be patient)
Completed 100 requests
Finished 111 requests

Document Path:          /benchmark.php
Document Length:        4210 bytes

Concurrency Level:      10
Time taken for tests:   60.038 seconds
Complete requests:      111
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      486180 bytes
HTML transferred:       467310 bytes
Requests per second:    1.85 [#/sec] (mean)
Time per request:       5408.824 [ms] (mean)
Time per request:       540.882 [ms] (mean, across all concurrent requests)
Transfer rate:          7.91 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   11   1.5     11      20
Processing:  1743 5170 647.3   5251    6893
Waiting:     1743 5169 647.3   5251    6892
Total:       1754 5181 647.5   5262    6906

Percentage of the requests served within a certain time (ms)
  50%   5260
  66%   5308
  75%   5370
  80%   5391
  90%   5441
  95%   5510
  98%   5540 
  99%   5967
 100%   6906 (longest request)

Eu repeti o mesmo teste com 100 usuários simultâneos.

ab -t 60 -n 2000 -c 100 -k mydomain-name/benchmark.php

Benchmarking mydomain-name (be patient)
    Finished 114 requests

Server Software:        Apache/2.4.18
Server Port:            80

Document Path:          /benchmark.php
Document Length:        4210 bytes

Concurrency Level:      100
Time taken for tests:   60.683 seconds
Complete requests:      114
Failed requests:        0
Keep-Alive requests:    0
Total transferred:      499320 bytes
HTML transferred:       479940 bytes
Requests per second:    1.88 [#/sec] (mean)
Time per request:       53230.746 [ms] (mean)
Time per request:       532.307 [ms] (mean, across all concurrent requests)
Transfer rate:          8.04 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   21   4.0     21      28
Processing:  1932 30540 16362.9  30710   54039
Waiting:     1931 30539 16362.9  30710   54038
Total:       1953 30561 16362.6  30732   54066

Percentage of the requests served within a certain time (ms)
  50%  30732
  66%  41063
  75%  46327
  80%  48960
  90%  52212
  95%  52273
  98%  52288
  99%  52840
 100%  54066 (longest request)
    
por TigerTiger 05.07.2018 / 21:32

1 resposta

0

O que você realmente está vendo é um aplicativo que está "serializando" o processamento de solicitação - o que significa que apenas uma solicitação está sendo processada por vez, independentemente do número de solicitações que estão sendo emitidas para ela.

Observe a consistência do RPS nos níveis de simultaneidade - sempre em torno de 1,8 - e observe que 1,8 é aproximadamente 1 / tempo de serviço de uma única solicitação (, 53 segundos).

O aplicativo está recebendo 1 ou 10 ou 100 ou 1000 solicitações, está escolhendo uma delas, enfileirando o restante (existem várias maneiras de fazer isso sob o capô), processando a que foi coletada em .53 segundos, retornando resultados , escolhendo outro dos pedidos que estão sendo enfileirados, processando, completando, retornando resultados, etc por 60 segundos.

Portanto, essa é a "capacidade" dessa configuração - um pouco menos de 2 solicitações por segundo - que é independente da taxa de solicitação simultânea recebida.

Como isso é 2018 e não 1993, você provavelmente quer consertar isso. :) Você deve ser capaz de fazer centenas a - às vezes - milhares de solicitações / s com o PHP em um único nó de tamanho razoável e configurado.

Por que exatamente as solicitações estão sendo serializadas? É algo no script de benchmark - pegar um cadeado ou fazer alguma outra ação serializada - ou algo na configuração do servidor - número de servidores web, etc. Se você não consegue descobrir, talvez crie outra pergunta com os detalhes e alguém provavelmente pode ajudar.

    
por 05.07.2018 / 22:55