¿Qué consejo me puede dar para escribir un punto de referencia significativo?

StackOverflow https://stackoverflow.com/questions/324200

  •  11-07-2019
  •  | 
  •  

Pregunta

He desarrollado un marco que es utilizado por varios equipos en nuestra organización. Esos "módulos", desarrollados sobre este marco, pueden comportarse de manera bastante diferente, pero todos consumen bastante recursos, aunque algunos son más que otros. Todos reciben datos de entrada, los analizan y / o transforman, y los envían más.

Planeamos comprar nuevo hardware y mi jefe me pidió que definiera e implementara un punto de referencia basado en los módulos para comparar las diferentes ofertas que tenemos.

Mi idea es simplemente comenzar secuencialmente cada módulo con un conjunto de datos bien elegido como entrada.

¿Tienes algún consejo? ¿Alguna observación sobre este sencillo procedimiento?

¿Fue útil?

Solución

Su pregunta es bastante amplia, por lo que desafortunadamente mi respuesta tampoco será muy específica.

Primero, el benchmarking es difícil. No subestimes el esfuerzo necesario para producir resultados significativos, repetibles y de alta confianza.

Segundo, ¿cuál es su objetivo de rendimiento? ¿Es el rendimiento (transacción u operaciones por segundo)? ¿Es latencia (tiempo que lleva ejecutar una transacción)? ¿Te importa el rendimiento promedio? ¿Me importa el peor desempeño del caso? ¿Te importa el peor de los casos o me importa que el 90%, el 95% o algún otro percentil obtenga un rendimiento adecuado?

Dependiendo de la meta que tenga, entonces debe diseñar su punto de referencia para compararlo con esa meta. Por lo tanto, si está interesado en el rendimiento, es probable que desee enviar mensajes / transacciones / entradas a su sistema a una velocidad prescrita y ver si el sistema se mantiene al día.

Si está interesado en la latencia, debe enviar mensajes / transacciones / entradas y medir el tiempo que lleva procesar cada una.

Si está interesado en el rendimiento del peor de los casos, agregará carga al sistema hasta lo que considere "realista". (o lo que el diseño del sistema indique que debería admitir)

Segundo, usted no dice si estos módulos van a estar vinculados a la CPU, a la E / S, si pueden aprovechar múltiples CPU / núcleos, etc. A medida que intenta evaluar diferentes soluciones de hardware, puede encontrar que su aplicación se beneficia más de un gran subsistema de E / S frente a una gran cantidad de CPU.

Tercero, el mejor punto de referencia (y el más difícil) es poner una carga realista en el sistema. Es decir, registra datos de un entorno de producción y coloca la nueva solución de hardware a través de estos datos. Hacer esto es más difícil de lo que parece, a menudo, esto significa agregar todo tipo de puntos de medición en el sistema para ver cómo se comporta (si aún no los tiene), modificar el sistema existente para agregar capacidades de grabación / reproducción, modificando el reproducción para ejecutar a diferentes velocidades y obtener un entorno realista (es decir, similar a la producción) para las pruebas.

Otros consejos

El punto de referencia más significativo es medir el rendimiento de su código en el uso diario. Obviamente, eso le proporcionará los números más realistas.

Elija varios conjuntos de datos de la vida real y póngalos a través de los mismos procesos que usa su organización todos los días. Para obtener crédito adicional, hable con las personas que usan su marco y pídales que proporcionen algunos de los "mejores casos", "normales" y "el peor de los casos". datos. Anonimice los datos si existen problemas de privacidad, pero trate de no cambiar nada que pueda afectar el rendimiento.

Recuerde que está comparando y comparando dos conjuntos de hardware, no su marco. Trate todo el software como una caja negra y simplemente mida el rendimiento del hardware.

Por último, considere guardar los conjuntos de datos y utilizarlos para evaluar de manera similar cualquier cambio posterior que realice en el software.

Si se supone que su sistema es capaz de manejar múltiples clientes llamando a todos al mismo tiempo, entonces su punto de referencia debería reflejar esto. Tenga en cuenta que algunas llamadas no funcionarán bien juntas. Por ejemplo, tener 25 subprocesos que publiquen el mismo bit de información al mismo tiempo podría provocar bloqueos en el extremo del servidor, lo que sesgaría los resultados.

Desde un punto de vista básico, he usado Perl y su Módulo de referencia para recopilar la información que me interesa.

Si está comparando hardware diferente, entonces medir el costo por transacción le dará una buena comparación de las compensaciones de hardware por rendimiento. Una configuración puede brindarle el mejor rendimiento, pero cuesta demasiado. Una configuración menos costosa puede brindarle un rendimiento adecuado.

Es importante emular el "peor de los casos" o "hora pico" de carga. También es importante probar con " típico " volúmenes Es un acto de equilibrio para obtener una buena utilización del servidor, que no cuesta demasiado, que proporciona el rendimiento requerido.

Las pruebas en configuraciones de hardware rápidamente se vuelven caras. Otra opción viable es medir primero la configuración que tiene, luego simular ese comportamiento en los sistemas virtuales utilizando un modelo.

Si puede, intente registrar algunas operaciones que los usuarios (o procesos) están haciendo con su marco, idealmente usando un clon del sistema real. Eso te da los datos más realistas. Cosas a tener en cuenta:

  1. ¿Qué funciones se usan con más frecuencia?
  2. ¿Cuántos datos se transfieren?
  3. No asumas nada. Si crees que "va a ser rápido / lento", no apuestes por eso. En 9 de cada 10 casos, estás equivocado.

Cree un top ten para 1 + 2 y trabaje a partir de eso.

Dicho esto: si reemplaza hardware antiguo por hardware nuevo, puede esperar una ejecución aproximadamente un 10% más rápida por cada año que haya pasado desde que compró el primer conjunto (si los sistemas son bastante iguales).

Si tiene un sistema especializado, los números pueden ser completamente diferentes pero, por lo general, el nuevo hardware no cambia mucho. Por ejemplo, agregar un índice útil a una base de datos puede reducir el tiempo de ejecución de una consulta de dos horas a dos segundos. El hardware nunca te dará eso.

Según lo veo, hay dos tipos de puntos de referencia cuando se trata de software de evaluación comparativa. Primero, microbenchmarks, cuando intentas evaluar un fragmento de código de forma aislada o cómo un sistema maneja una carga de trabajo estrechamente definida. Compare dos algoritmos de clasificación escritos en Java. Compare dos navegadores web con qué rapidez cada uno puede realizar alguna operación de manipulación DOM. En segundo lugar, hay puntos de referencia del sistema (acabo de hacer el nombre), cuando intenta evaluar un sistema de software bajo una carga de trabajo realista. Compare mi backend basado en Python que se ejecuta en Google Compute Engine y en Amazon AWS.

Cuando se trata de Java y similares, tenga en cuenta que la VM necesita calentarse antes de que pueda brindarle un rendimiento realista. Si mide el tiempo con el comando time , se incluirá el tiempo de inicio de JVM. Casi siempre desea ignorar el tiempo de inicio o realizar un seguimiento por separado.

Microbenchmarking

Durante la primera ejecución, los cachés de la CPU se llenan con los datos necesarios. Lo mismo ocurre con los cachés de disco. Durante algunas ejecuciones posteriores, la VM continúa calentándose, lo que significa que JIT compila lo que considera útil compilar. Desea ignorar estas ejecuciones y comenzar a medir después.

Realice muchas mediciones y calcule algunas estadísticas. Media, mediana, desviación estándar, trazar un gráfico. Míralo y observa cuánto cambia. Las cosas que pueden influir en el resultado incluyen pausas de GC en la VM, escalado de frecuencia en la CPU, algún otro proceso puede iniciar alguna tarea en segundo plano (como la detección de virus), el sistema operativo puede decidir mover el proceso en un núcleo de CPU diferente, si tiene arquitectura NUMA , los resultados serían aún más marcados.

En caso de microbenchmarks, todo esto es un problema. Mata los procesos que puedas antes de comenzar. Utilice una biblioteca de evaluación comparativa que pueda hacer algo por usted. Me gusta https://github.com/google/caliper y similares.

Evaluación comparativa del sistema

En caso de comparar un sistema bajo una carga de trabajo realista, estos detalles realmente no le interesan y su problema es '' solo '' saber qué es una carga de trabajo realista, cómo generarla y qué datos recopilar. Siempre es mejor si puede instrumentar un sistema de producción y recopilar datos allí. Por lo general, puede hacerlo porque está midiendo las características del usuario final (cuánto tiempo se procesó una página web) y estas están vinculadas a E / S para que la recopilación de datos no ralentice el sistema. (La página debe enviarse al usuario a través de la red, no importa si también registramos algunos números en el proceso).

Tenga en cuenta la diferencia entre creación de perfiles y evaluación comparativa. La evaluación comparativa puede brindarle el tiempo absoluto que dedica a hacer algo, la creación de perfiles le brinda el tiempo relativo que dedica a hacer algo en comparación con todo lo que necesita hacer. Esto se debe a que los perfiladores ejecutan programas fuertemente instrumentados (la técnica común es detener el mundo cada pocos cientos de ms y guardar un seguimiento de la pila) y la instrumentación ralentiza todo significativamente.

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