Eficiência, Benchmarking, Speed-teste, Desempenho
-
20-08-2019 - |
Pergunta
Eu estou tentando escrever um script cuja eficiência Estou tentando medir. Eu tenho um par de perguntas: -
- 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)
- Contra o que devo referência isso? O que devo comparar com?
- 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
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).
~ 200ms por solicitação é um número pouco comum em que uma página parece ser 'rápido' para a maioria dos usuários.