entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Aplicacion Web en Java con Glassfish se cuelga luego de varios dias de uso

Tenemos un proyecto web en java de un sistema de gestión, con Struts2 y Spring, montado en un servidor glassfish.

el problema que estamos teniendo es que luego del uso de varios días, el sistema empieza a caerse mostrando una pagina en blanco y la forma de levantarlo es reiniciando el glassfish.

Vimos en el log del servidor que siempre antes de caerse aparecen los siguientes mensajes:

  1. visiting unvisited references
  2. ignoring WEB-INF/Logs/ because the containing archive recorded it as a pre-existing state file

por lo que creemos que se debe a los log que guardamos del sistema.

Dentro de WEB-INF estamos guardando en la carpeta Logs todos los log de los errores y acciones de usuario y sistema con lo que es normal que luego de varios días de uso el archivo alcance los 150 mb o mas. Además guardamos en la carpeta Temp dentro de WEB-INF los temporales de impresión que luego de un par de meses alcanza fácilmente los 1000 archivos.

Teniendo en cuenta esto creemos que la solución podría ser mover las carpetas Logs y Temp fuera de la carpeta del glassfish, con esto nos surgen las siguientes dudas:

  1. El motivo que hemos encontrado es correcto o además deberíamos tener en cuenta otras cosas para solucionar este tipo de error?
  2. Mover las carpetas Log y Temp fuera del proyecto puede traernos nuevos problemas, es conveniente?

Muchas Gracias

0voto

fsanchez comentado

¿Pudieron resolver este inconveniente?
A mi me pasa lo mismo con el GlassFish 4.1 corriendo sobre un jre 8
Saludos.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola Wilson,

me parece que el problema está en la propia arquitectura de la aplicación...

Un problema es el guardar los logs en un archivo de texto: cuando el archivo llega por ejemplo a los 100Mb, tu sistema tiene que abrir semejante archivo, poder mover el puntero al final, agregar un dato y cerrarlo. Esto es extremadamenet costoso en tiempos de acceso y recursos!

La solución es guardar los logs en una DB o tener una política de rotación de forma tal que cada log solo tenga los datos de 1 día. Si estás trabajando sobre alguna plataforma *nix, podrías usar el propio logrotate del sistema para hacer la rotación.

El otro problema son los temporales de impresión: es mucho más lento acceder a un archivo que está en un directorio que tiene 1000 archivos que si solo hay 10. Esto es por el funcionamiento del sistema de archivos.

La solución a esto es borrar los temporales inmediatamente después de que se usan o alternativamente correr un proceso que busque los viejos (por ej de + de 24hs) y los borre. Si por algún motivo tenés que mantener esos temporales, tendrías que almacenarlos en una estructura de directorios que los distribuya entre varios, como hacen las caché de disco y similares. Si los temporales son solo eso y una vez usados no sirven más: borralos!

Estas dos cosas van haciendo con el uso cada vez más lento al sistema, porque estás consumiendo mucho tiempo de acceso a disco, que es de las cosas más lentas que hay... en esa situación el server devolverá páginas en blanco cuando llegue al tiempo de expiración del proceso y no haya podido conseguir los datos.

Podrías sacarte la duda agragando a los logs un perfilado de cada llamada anotando el tiempo de respuesta que tiene: verás que a medida que se lee más del disco, más lento se pone todo, hasta que al final se cuelga el sistema porque hay N procesos a medio abrir semejantes archivos y leyendo temporales de un directorio superpoblado...

Saludos cordiales!

1voto

serrapos Puntos460

Yo sinceramente con glassfish no he trabajado, pero no es raro que una aplicación java se caiga después de unos días de uso. Una práctica recomendable es reiniciar el servicio cada 1 o 2 días, en las horas de menos tráfico, por ejemplo de noche para limpiar la memoria y todo eso.

Normalmente la caída se debe a que el GC no funciona correctamente y se llena la memoria, y cuando no puede más se queda colgado.

Dudo que sea un problema del log o del temp, pero ya te digo, a lo mejor con glassfish hay algún problema por ahí.

Saludos.

0voto

Wilson comentado

hemos visto tambien que cuando empieza a pasar, no alcanza no reiniciar el servicio del glassfish, si no que hay que reiniciar la pc del servidor si no se vuelve a colgar luego de unos minutos.
a que se puede deber de que el GC no funcione correctamente?
no se puede mejorar el uso del GC?

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta