Eficiencia, evaluación comparativa, pruebas de velocidad, rendimiento
-
20-08-2019 - |
Pregunta
Estoy tratando de escribir un script cuya eficiencia estoy tratando de medir. Tengo un par de preguntas:
- 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)
- ¿Contra qué debo comparar esto? ¿Con qué debo comparar?
- 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
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).
~ 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.