Estoy pensando en cómo hacemos un monitor de memoria JVM en una forma de baja sobrecarga en el entorno de producción, incluso en hora punta.
Supongamos que tengo dos servidores de aplicaciones tomcat en producción, con el equilibrio de carga configurado detrás de ellos. Si puedo ver las estadísticas de la memoria jvm, puedo decirle al balance de carga que deje de enviar la solicitud al servidor, lo que generará un problema de OOM. ¿Tiene esto sentido? Jconsole o VisualVM consumen más recursos de rendimiento no es mi elección.
java
performance
memory
Vance
fuente
fuente
Respuestas:
JMX sería la respuesta (Jolokia es una interfaz JMX).
Es posible que desee ver también: /programming/242958/best-tools-to-monitor-tomcat
fuente
Otros han proporcionado sugerencias sobre cómo monitorear el uso de la memoria ...
Algo así como. Pero no es necesariamente la mejor manera de resolver su problema.
Retrocedamos a la raíz del problema ... los OOME. En el contexto de Tomcat, es probable que los OOME sean causados por uno de los siguientes:
Para resolver su problema, primero debe averiguar cuál de estos está sucediendo ... porque la solución es diferente para cada uno de ellos.
1) Para ver si se trata de una pérdida de memoria, debe usar una herramienta de análisis de memoria para examinar los patrones de uso de memoria a largo plazo. Esto probablemente mostrará un patrón de diente de sierra ... que es normal. Lo que debe buscar es el nivel de la parte inferior de los "dientes" que tiende hacia arriba con el tiempo. Eso indica que algo está creando basura que no se puede recolectar; es decir, una pérdida de memoria.
Si tiene una pérdida de memoria, la mejor solución es averiguar qué parte de su código es responsable y solucionarlo. Cualquier otra cosa ... incluido el equilibrio de carga ... es una solución de bandaid y podría conducir a problemas peores en el camino.
2) Después de eliminar las pérdidas de memoria, debe averiguar si el problema es que está procesando demasiadas solicitudes a la vez. No estoy seguro de la mejor manera de hacerlo, pero si este es el problema (o sospecha que lo es), entonces hay algunas soluciones posibles:
Ajuste la configuración del servidor Tomcat para reducir la cantidad de subprocesos de trabajo.
Si sus solicitudes están vinculadas a E / S, entonces otra posibilidad sería mirar el soporte de manejo de solicitud asíncrono disponible en versiones recientes de la especificación de Servlet; consulte http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Pero eso será más trabajo.
3) Si el problema resulta ser que ciertas solicitudes están usando demasiada memoria, entonces necesita descubrir cómo detectar esas solicitudes de antemano y "tratarlas". Detectar y manejar estas solicitudes podría ser difícil ... y es difícil asesorar sin detalles de su aplicación. Pero un par de soluciones pragmáticas son:
Reenvíe las solicitudes anómalas a otro servidor con un gran montón ... donde los OOME no interferirán con las solicitudes "normales".
Aumenta el tamaño del montón. Si tiene suficiente memoria física, ejecutar con un montón más grande en realidad podría hacer que sus servidores Tomcat sean más eficientes ... así como evitar OOME.
En resumen, en lugar de tratar de equilibrar la carga para evitar OOMEs, le sugiero que descubra por qué está recibiendo OOMEs ... y trate de tratar la causa de los OOMEs directamente.
fuente
Tal vez vale la pena echarle un vistazo a jvmtop .
Le muestra de manera "top-like" sobre una base por jvm monitoreando métricas como consumo de memoria, utilización de CPU, conteos de hilos, etc.
fuente