2011-04-13 31 views
6

Quiero hacer pruebas de carga para 10 millones de usuarios de mi sitio. El sitio es una aplicación web basada en Java. Mi enfoque es crear un plan de prueba de Jmeter para todos los enlaces y luego tomar un informe para los 10 millones de usuarios. Luego use jvisualVM para hacer perfiles y verifique si hay algún cuello de botella.¿Cómo hacer pruebas de carga utilizando jmeter y visualVM?

¿Hay alguna forma mejor de hacerlo? ¿Hay alguna demo existente para hacer esto? Estoy haciendo esto por primera vez, por lo que cualquier ayuda será de gran ayuda.

+0

Mi objetivo es apoyar a al menos 10 millones de usuarios. – Daemonthread

+0

Wow. Esa es una gran pregunta. Un par de preguntas iniciales: 10 Mill es mucho. ¿Es eso usuarios concurrentes y únicos? ¿Estás al frente con servidores web nativos? ¿Estás agrupando los servidores de la aplicación java? ¿Usará un equilibrador de carga? ¿Puedes decir qué servidor de aplicaciones usarás? ¿Habrá otras dependencias como bases de datos, etc.? – Nicholas

+2

10 millones de usuarios en DB. Puedo hacer eso con un procedimiento PL/SQL. 150 usuarios concurrentes. Sin agrupamiento. Solo máquina de puesta en escena. Sin equilibrador de carga El servidor de la aplicación es Jetty. – Daemonthread

Respuesta

0

blogged, la forma en que procedió a la prueba de rendimiento:

  1. Asegúrese de que el servidor (hardware puede estar de acuerdo con los requisitos de montaje/producción) no tiene otras instalaciones que pueden afectar el rendimiento.
  2. Para configurar los usuarios en DB, se puede usar un procedimiento y se puede llamar como parte del plan de prueba de jmeter.
  3. Instale el jmeter en una máquina separada, para que el jmeter no afecte el rendimiento.
  4. Cree un plan de prueba en jmeter (como se muestra en la figura 1) para todos los uri, con comprobación de respuesta y solicitudes basadas en temporizador.
  5. Tome la referencia inicial, usando jmeter.
  6. Revise los uri de bajo rendimiento. Estos son los puntos a esperar para los cuellos de botella.
  7. Pruebe diferentes opciones para mejorar el rendimiento, pero concéntrese en un solo cuello de botella a la vez.
  8. Pruebe cualquier solución del paso 6 y luego tome un punto de referencia. Si hay alguna mejora, confirme los cambios y repita desde el paso 5. De lo contrario, invierta y pruebe cualquier otra opción desde el paso 6.
  9. El próximo paso sería usar balanceo de carga, escalado de hardware, clustering, etc. Esto puede incluir algunos configuración física y costo de hardware/software. Da los resultados con las opciones de escalabilidad.

Para una explicación detallada: http://www.daemonthread.com/2011/06/site-performance-tuning-using-jmeter.html

3

Estás en la ruta correcta, pero tu límite de carga es de alto factor.

Por qué digo que esto es porque su sitio probablemente necesite más máquina para manejar a 10Milj usuarios concurrentes. Un proceso solo probablemente tendría dificultades para manejar corrientes concurrentes 32K TCP. También haga algunos cálculos del ancho de banda que tomaría para manejar realmente a los usuarios de 10Milj.

Ahora no sé qué tipo de servicio piensa proporcionar en su sitio, pero cuando pienso en que JVisualVM ralentiza el procesamiento por un factor de 10 (o más para el seguimiento de métodos), realmente no mediría el "real mundo "si tienes JMeter y JVisualVM para trabajar al mismo tiempo.

JVisualVM es más útil cuando se ejecuta con cargas más bajas.

Para crear una buena medición, primero asegúrese de tener una buena referencia. Realice una prueba con 10 usuarios concurrentes, conecte JVisuamVM y déjelo funcionar por un tiempo, no todos los valores interesantes.

Después de que tenga su línea base, puede comenzar a agregar más carga. Agregue 10 veces la carga (por ejemplo, 100 usuarios), observe los cambios en JVisualVM. Continúa con esto hasta que sea obvio que JVisualVM te ralentiza, para que cada vez que agregues carga extra, asegúrate de haber anotado los números que te interesan. Traza los números en un gráfico.

Ahora ... Interpola el gráfico (a mano) para la cantidad de usuarios que quieras. Esto funciona para el uso de la memoria, el acceso al disco, etc., pero no para el tiempo de CPU usado, porque JVisualVM consumirá la CPU y le dará números inválidos (especialmente si tiene activado el seguimiento de métodos).

Si realmente quiere llegar a los 10 millones de usuarios, tampoco confiaría en JMeter, escribiría un pequeño programa de prueba que realice la prueba que desee. Esto estaría bien, ya que la configuración del sitio para manejar 10Milj también llevará tiempo, por lo que gastar un poco más de tiempo de las herramientas de prueba no es un desperdicio.

+0

Unix hace un muy buen punto: asegúrese de tener una buena base sólida y hacer un lote de pruebas con diferentes usuarios concurrentes (10, 50, 100, 150) ejecutando cada prueba por la misma duración y al menos una hora de duración . – BlackGaff

+2

En la última versión de JDK JVisualVM tiene un generador de perfiles de muestreo que no afecta el rendimiento en orden de magnitud. Este tipo de creación de perfiles se puede realizar en servidores de producción incluso con carga moderada. –

3

El hecho de que tenga 10 millones de usuarios en la base de datos no significa que deba cargar la prueba con tantos usuarios. Piénselo: ¿su sitio realmente tendrá 10 millones de usuarios de simultáneos? Para las aplicaciones web, una proporción de 1: 100 usuarios registrados es común, es decir, es poco probable que tenga más de 100 mil usuarios en cualquier momento.

¿Puede JMeter manejar ese tipo de carga? Lo dudo. Por favor intente con faban en su lugar. Es muy ligero y puede admitir miles de usuarios en una sola máquina virtual. También tiene mucha más flexibilidad para crear su carga de trabajo y también puede automatizar el monitoreo de toda su infraestructura de prueba.

Ahora a la parte de análisis. No dijiste qué servidor estabas usando. Cualquier servidor de aplicaciones Java proporcionará suficiente soporte de monitoreo. Los servidores comerciales proporcionan buenas herramientas de GUI, mientras que Tomcat proporciona una amplia supervisión a través de JMX. Es posible que desee comenzar aquí antes de bajar al nivel de JVM.

Para la JVM, realmente no desea utilizar VisualVM mientras ejecuta una prueba de rendimiento tan grande. Además de soportar tal carga, asumo que estás usando múltiples instancias de servidor de aplicaciones/JVM. El principal problema de rendimiento suele ser GC, por lo tanto, utilice las opciones de JVM para recopilar y registrar información de GC. Deberá postprocesar los datos.

Este es un ejercicio no trivial: ¡buena suerte!

+0

Por favor revise los comentarios. Especifiqué que 10 millones de usuarios en DB y 150 usuarios concurrentes. – Daemonthread

+0

Lo siento, lo perdí. Entonces es importante que cree su carga de trabajo correctamente para acceder a todos oa un subconjunto de usuarios en función de lo que pretende. – shanti

3

Hay dos tipos de pruebas de carga: identificación de cuello de botella y rendimiento. La pregunta me lleva a pensar que se trata de cuellos de botella, por lo que la cantidad de usuarios es una especie de arenque rojo, en cambio el objetivo es encontrar áreas que se puedan mejorar para aumentar la concurrencia.

Los cuellos de botella de la aplicación generalmente se dividen en tres categorías: base de datos, pérdida de memoria o algoritmo lento. Encontrarlos implica poner la aplicación en cuestión bajo estrés (es decir, carga) durante un período prolongado de tiempo, al menos una hora, tal vez hasta varios días. Jmeter es una buena herramienta para este propósito. Una de las cosas a considerar es ejecutar la misma prueba con el manejo de cookies habilitado (es decir, Jmeter conserva las cookies y las envía con cada solicitud posterior) y deshabilitado; a veces se obtienen resultados muy diferentes y esto es importante porque este último es efectivamente una simulación de lo que algunos los rastreadores lo hacen a tu sitio. Los detalles de cuello de botella seguimiento de detección:

base de datos

Tablas sin índices o sentencias SQL que implican varias combinaciones son los cuellos de botella de aplicaciones frecuentes. Todos los servidores de bases de datos con los que he tratado, MySQL, SQL Server y Oracle, tienen alguna forma de iniciar sesión o identificar sentencias SQL de ejecución lenta. MySQL tiene el registro lento de consultas, mientras que SQL Server tiene vistas de administración dinámica que rastrean el SQL de ejecución más lenta. Una vez que tenga en sus manos las declaraciones lentas, use un plan de explicación para ver lo que el motor de la base de datos intenta hacer, use cualquier característica que sugiera índices, y considere otras estrategias, como la desnormalización, si esas dos opciones no resuelven el cuello de botella .

pérdida de memoria

Encienda el registro detallado de recolección de basura y un puerto de supervisión JMX. Luego use jConsole, que proporciona gráficos mucho mejores, para observar las tendencias. En particular, las filtraciones generalmente aparecen como llenando los espacios de la Gen vieja o Perm Gen. Las fugas son un cuello de botella con el que la JVM pasa cada vez más tiempo intentando recolectar basura sin éxito hasta que se produce un error OOM.

Perm Gen implica la necesidad de aumentar el espacio como un parámetro de línea de comandos para la JVM. Mientras que Old Gen implica una fuga en la que debe detener la prueba de carga, generar un volcado de pila y luego usar la herramienta de análisis de memoria de Eclipse para identificar la fuga.

Algoritmo lenta

Esto es más difícil de localizar. Los delincuentes más frecuentes son la sincronización, la comunicación entre procesos (por ejemplo, RMI, servicios web) y la E/S de disco. Otro problema común es el código que utiliza bucles anidados (¡mire el rendimiento de mamá O (n^2)!).

La mejor manera que he encontrado para encontrar estos problemas, a falta de un conocimiento más profundo es la generación de rastros de pila. Estos le dirán qué están haciendo todos los hilos en un punto determinado en el tiempo. Lo que está buscando son hilos BLOQUEADOS o varios hilos que acceden al mismo código. Esto generalmente apunta a cierta lentitud dentro de la base del código.

0

que empecé a usar JMeter plugins.
Esto me permite recopilar las métricas de las aplicaciones disponibles en JMX para utilizarlas en mi Prueba de carga.

Cuestiones relacionadas