Pergunta

Eu estou tentando escrever um script cuja eficiência Estou tentando medir. Eu tenho um par de perguntas: -

  1. Para pequenas aplicações, é este tipo de perfis necessários? Ou estou ficando paranóico? (Assumindo que a maioria do código é decentemente eficientes / não loops infinitos)
  2. Contra o que devo referência isso? O que devo comparar com?
  3. Abaixo está a saída de eficiência que eu tenho de ab. É desta forma também fora? Estou indo na direção errada concepção deste aplicativo? Existem quaisquer sinais de alerta que eu deveria estar ciente de?
abs -n10000 -c100 http://localhost/testapp

This is ApacheBench, Version 2.3 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache/2.2.10
Server Hostname:        localhost
Server Port:            80

Document Path:          /testapp
Document Length:        525 bytes

Concurrency Level:      100
Time taken for tests:   33.608 seconds
Complete requests:      10000
Failed requests:        5179
   (Connect: 0, Receive: 0, Length: 5179, Exceptions: 0)
Write errors:           0
Total transferred:      6973890 bytes
HTML transferred:       5253890 bytes
Requests per second:    297.55 [#/sec] (mean)
Time per request:       336.080 [ms] (mean)
Time per request:       3.361 [ms] (mean, across all concurrent requests)
Transfer rate:          202.64 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.5      0     109
Processing:     8  334 403.9    176    3556
Waiting:        7  334 403.9    176    3556
Total:          9  335 403.8    177    3556

Percentage of the requests served within a certain time (ms)
  50%    177
  66%    296
  75%    415
  80%    519
  90%    842
  95%   1141
  98%   1615
  99%   1966
 100%   3556 (longest request)

Eu estou usando PHP para escrever o roteiro. Em mais testes, eu também descobriram que "os pedidos falhou" se torna 0 se eu comentar a parte de conexão MySQL do meu script PHP. O que há de errado? Como posso reduzir esta taxa de falha?

Obrigado, Alec

Foi útil?

Solução

Você espera 100 solicitações simultâneas? Você espera para receber solicitações de 10 K em 30 segundos?

É ótimo que você pode executar este benchmark, mas pergunte a si mesmo o que significa. Pense sobre a quantidade real de tráfego que você irá receber. Você realmente precisa de uma questão de ponto de referência contra:

  • Eu espero que o meu site terá 3.000 usuários.
  • Espero que durante o pico de uso, 500 deles estará batendo na página
  • A normalmente uso é 3 solicitações mais de um minuto: 3 * 500 / 60 = ~ 25 req/sec
  • Pode meu site alça 25 req / seg e ser sensível (<200 ms por pedido)?

A menos que você está no pequeno percentual topo da web, sua página não vai ver 100 solicitações simultâneas na vida real. Não faz sentido para sintonizar o seu site para esse nível de tráfego. Para atingir esses números, você precisa fazer o projeto compromete no nível de arquitetura (uso de banco de dados, métodos de armazenamento em cache, etc: daí o seu número de falhas quando o banco de dados é on)

.

Se você está apenas tentando o perfil de seu script, use xdebug para encontrar onde seu código está gastando seu tempo.

Outras dicas

Eu acho que isto parece um grande trabalho. Way off? Eu diria que jeito que está acima da norma.

Uma questão é que a carga sobre o servidor será na produção. Seu script está disparando solicitações neste servidor, mas se você for o único usuário em uma instância de desenvolvimento que você não está vendo o que acontece quando você bate o servidor de produção enquanto ele está processando a carga de produção típico.

Se for esse o caso, você precisa de duas fontes de pedido: uma que representa o seu novo aplicativo, e outra para os processos de produção que ele vai competir por recursos

.

Você pode definir o # de usuários simultâneos no software de benchmark? Será que este teste apenas enviar 1000 pedidos, um após o outro? Tendo vários usuários batendo no servidor ao mesmo tempo pode ser mais realista.

Você pode fazer o envio intervalo aleatório? Isso poderia ser uma melhor representação de sua situação real.

Você pode variar os dados que o uso de script? Será que representam as condições em que ele vai ser usado muito bem?

Além disso, todos oferecem posso é meus parabéns. Parece que você está sendo muito profundo para mim.

Você não deveria estar recebendo quaisquer pedidos falhados -. Você precisa verificar seu log de erro para ver porque eles estão falhando

É mais provável que seja MySQL ficar sem conexões, caso em que você pode simplesmente ajustar o servidor para permitir mais conexões simultâneas (se você espera que a quantidade de tráfego).

Tente usar xdebug para o perfil de seu código. xdebug também lhe dará melhor na tela erros e rastreamentos de pilha.

Em seguida, use webgrind para ver o perfil em um bom formato.

~ 200ms por solicitação é um número pouco comum em que uma página parece ser 'rápido' para a maioria dos usuários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top