7 votos

Consumo de memoria excesivo de Tomcat

Tengo un nuevo servidor con Ubuntu 11.04 (Natty) (64-bit). Empecé instalando openjdk y tomcat6. Cuando el servidor Tomcat que comienza, se utiliza de forma inmediata 480 MB de memoria. Esto parece fuera de proporción y me pregunto si alguien tiene una solución para conseguir Tomcat para uso 200-300 MB (o menos) de la memoria.

He utilizado memtop a ver esto: (Nota: he quitado todos, pero los grandes entradas. El 499MB entrada es Tomcat)

  user@xyz:~# python memtop-0.9.py
  PID |   private/writ. mem |command
      |  current | previous |(truncated)
19776 | 499.3 MB |    +++++ |/usr/lib/jvm/java-6-openjdk/bin/java-Djava.util.logging.config.file=/var/lib/tomcat6/conf/logging.properties-Djava.awt.headless=true-Xm
18082 | 148.6 MB |    +++++ |/usr/sbin/mysqld
 1385 |   3.6 MB |    ++    |pythonmemtop-0.9.py
RAM usage:  ==============================================  69.3 %

Además, usted puede ver lo JDK y Tomcat paquetes que tengo instalados:

user@xyz:~# dpkg --get-selections | grep jdk
default-jdk                                     install
openjdk-6-jdk                                   install
openjdk-6-jre                                   install
openjdk-6-jre-headless                          install
openjdk-6-jre-lib                               install

user@xyz:~# dpkg --get-selections | grep tomcat
libtomcat6-java                                 install
tomcat6                                         install
tomcat6-admin                                   install
tomcat6-common                                  install
tomcat6-user                                    install

La secuencia de comandos de inicio de Tomcat establece Xmx a 128M:

JAVA_OPTS="-Djava.awt.headless=true -Xmx128M"

¿Alguien tiene alguna idea sobre qué podía hacer yo para golpear el consumo de memoria a algo más razonable? Yo no entiendo por qué la JVM y Tomcat junto necesitaría consumir esta cantidad de memoria.

EDICIONES

Para la base de ella, he descargado Tomcat 6 directamente y se ejecutó el script de inicio. Tenga en cuenta que no Xmx valor se establece este tiempo. Cuando se ejecuta este, memtop muestra de que Tomcat está utilizando 737 MB de la pena de memoria!

Esto me lleva a creer que hay un problema con openjdk el uso de una cantidad importante de memoria de la JVM.


He intentado lo mismo con una nueva .descarga zip de Tomcat 7 -- el mismo problema. Fue el uso de 740 MB de memoria.


He instalado el Sun JRE/JDK. El consumo de memoria se redujo a alrededor de 400 MB (por debajo de los casi 500 MB). Esto es aún más el uso de memoria que lo prefiero!

(sun-java6-bin, sun-java6-jdk, sun-java6-jre)


Cuando ejecuto top, me sale esto:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
13749 tomcat6   20   0  481m  68m 9892 S    0  7.4   0:02.85 java

Me doy cuenta y esperar que una máquina de 64 bits/JVM va a utilizar más memoria, pero no me esperaba que sea tan alta. Estoy corriendo en una máquina virtual que es sólo garantizar me 512MB.

2voto

Edwin Buck Puntos 257

---- Editado para proporcionar un ejemplo como el punto de no venir a través de----

Se inicia un proceso y pide 1 GB de memoria.

Ese proceso se inicia ocho hilos (que todos tengan acceso a las asigna 1 GB de memoria).

Alguien ejecuta una herramienta para determinar la cantidad de memoria que está siendo utilizada. La herramienta funciona de la siguiente manera:

  1. Encontrar todos los scheduleable elemento (cada hilo).
  2. Ver la cantidad de memoria que puede tener acceso.
  3. Añadir que la memoria juntos
  4. Informe de la suma.

La herramienta de informe de que está utilizando el proceso de 9 GB de memoria, cuando es (ojalá) obvio que hay ocho generado hilos (y el hilo para el proceso original), todos con el mismo GB de memoria.

Es un defecto en cómo algunas de las herramientas de informe de la memoria; sin embargo, no es fácilmente corregible defecto (como la fijación requeriría cambiar la salida de algunos muy antiguos (pero importante) de las herramientas). No quiero ser el tipo que reescribe la parte superior o ps, sería hacer que el sistema operativo no POSIX.

---- Post Original de la siguiente manera---- Algunas versiones de la memoria de herramientas de reporting (como arriba) confunden erróneamente los hilos (que todos tienen acceso a la misma memoria) con los procesos. Como resultado, una instancia de tomcat que se genera a cinco hilos equivocado es el consumo de memoria por cinco veces.

La única manera de asegurarse de que es la lista de los procesos con su consumo de memoria de forma individual, y luego leer la memoria de uno de los hilos (que es conseguir que figuran como proceso). De esa manera usted sabe el verdadero consumo de memoria de la aplicación. Si usted depende de las herramientas que hacer la suma para usted, usted va a sobreestimar la cantidad de memoria utilizada por el número de hilos hace referencia a la misma memoria compartida.

He tenido cajas con 2 GB de memoria y 1 GB de swap) de presentación de informes que ~7 gb de memoria estaba en uso en particular un hilo de aplicación pesada antes.

Para una mejor comprensión de cómo se informa de la memoria por muchas herramientas, mira aquí. Si el código de python es analizar el texto de una de estas herramientas, o la obtención de los datos de la misma llamadas al sistema, entonces está sujeta a los mismos errores en los informes de memoria.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: