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.
Mi objetivo es apoyar a al menos 10 millones de usuarios. – Daemonthread
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
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