Pregunta

Estoy tratando de escribir un script cuya eficiencia estoy tratando de medir. Tengo un par de preguntas:

  1. Para aplicaciones pequeñas, ¿se requiere este tipo de perfil? ¿O me estoy volviendo paranoico? (suponiendo que la mayoría del código sea decentemente eficiente / sin bucles infinitos)
  2. ¿Contra qué debo comparar esto? ¿Con qué debo comparar?
  3. A continuación se muestra la salida de eficiencia que obtuve de ab. ¿Está demasiado lejos? ¿Me dirijo en la dirección equivocada al diseñar esta aplicación? ¿Hay alguna señal de advertencia que deba tener en cuenta?
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)

Estoy usando PHP para escribir el script. En otras pruebas, también encontré que & Quot; Solicitudes fallidas & Quot; se convierte en 0 si comento la parte de conexión MySQL desde mi script PHP. Que pasa ¿Cómo reduzco esta tasa de falla?

Gracias Alec

¿Fue útil?

Solución

¿Espera 100 solicitudes simultáneas? ¿Espera recibir solicitudes de 10K en 30 segundos?

Es genial que pueda ejecutar este punto de referencia, pero pregúntese qué significa. Piensa en la cantidad real de tráfico que recibirás. Realmente necesita una pregunta para comparar:

  • Espero que mi sitio tenga 3.000 usuarios.
  • Espero que durante el uso pico, 500 de ellos lleguen a la página
  • Un uso típico es de 3 solicitudes en un minuto: 3 * 500 / 60 = ~ 25 req/sec
  • ¿Puede mi sitio manejar 25 requisitos / segundo y responder (< 200 ms por solicitud)?

A menos que esté en el primer porcentaje de la web, su página no verá 100 solicitudes concurrentes en la vida real. No tiene sentido ajustar su sitio para ese nivel de tráfico. Para alcanzar esos números, debe hacer compromisos de diseño a nivel de arquitectura (uso de la base de datos, métodos de almacenamiento en caché, etc.: de ahí su número de fallas cuando la base de datos está encendida).

Si solo está intentando perfilar su script, use xdebug para encontrar dónde está su código está gastando su tiempo.

Otros consejos

Creo que esto parece un gran trabajo. ¿Lejos? Yo diría que está muy por encima de la norma.

Una pregunta es cuál será la carga en el servidor en producción. Su secuencia de comandos está activando solicitudes en este servidor, pero si usted es el único usuario en una instancia de desarrollo, no está viendo lo que sucede cuando llega al servidor de producción mientras procesa la carga de producción típica.

Si ese es el caso, necesita DOS fuentes de solicitud: una que represente su nueva aplicación y otra para los procesos de producción con los que competirá por los recursos.

¿Puede establecer el número de usuarios simultáneos en el software de referencia? ¿Esta prueba solo envía 1000 solicitudes, una tras otra? Tener más usuarios golpeando el servidor al mismo tiempo podría ser más realista.

¿Puedes hacer que el intervalo de envío sea aleatorio? Esa podría ser una mejor representación de su situación real.

¿Puede variar los datos que usa el script? ¿Representa las condiciones bajo las cuales se usará muy bien?

Aparte de eso, todo lo que puedo ofrecer son mis felicitaciones. Parece que estás siendo muy minucioso conmigo.

No debería recibir ninguna solicitud fallida; debe verificar su registro de errores para ver por qué están fallando.

Es muy probable que MySQL se esté quedando sin conexiones, en cuyo caso simplemente puede ajustar su servidor para permitir más conexiones concurrentes (si espera esa cantidad de tráfico).

Intente usar xdebug para perfilar su código. xdebug también le dará mejores errores en pantalla & amp; apilar rastros.

Luego use webgrind para ver el perfil en un formato agradable.

~ 200 ms por solicitud es un número algo común en el que una página parece ser "rápida" para la mayoría de los usuarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top