Назад | Перейти на главную страницу

Tomcat чрезмерное потребление памяти

У меня есть свежий сервер под управлением Ubuntu 11.04 (Natty) (64-разрядная версия). Я начал с установки openjdk и tomcat6. Когда сервер Tomcat запускается, он сразу использует 480+ МБ памяти. Это кажется несоразмерным, и мне интересно, есть ли у кого-нибудь решение, позволяющее использовать Tomcat 200-300 МБ (или меньше) памяти.

я использовал memtop чтобы увидеть это: (Примечание: я удалил все записи, кроме больших. Запись размером 499 МБ - это 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 %

Кроме того, вы можете увидеть, какие пакеты JDK и Tomcat я установил:

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

Сценарий запуска для Tomcat устанавливает Xmx к 128 млн:

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

Есть ли у кого-нибудь идеи, что я могу сделать, чтобы снизить потребление памяти до чего-то более разумного? Я не понимаю, почему JVM и Tomcat вместе должны потреблять столько памяти.

РЕДАКТИРОВАТЬ

Черт возьми, я скачал Tomcat 6 напрямую и запустил сценарий запуска. Имейте в виду, что нет Xmx значение было установлено на этот раз. При запуске этого memtop показывает, что Tomcat использует 737 МБ стоит памяти!

Это заставляет меня думать, что есть проблема с openjdk используя серьезный объем памяти для JVM.


Я попробовал то же самое с новой загрузкой .zip файла Tomcat 7 - та же проблема. Он использовал 740 МБ памяти.


Я установил Sun JRE / JDK. Потребление памяти упало примерно до 400 МБ (по сравнению с почти 500 МБ). Это по-прежнему больше использования памяти, чем я бы предпочел!

(солнце-java6-bin, солнце-java6-jdk, солнце-java6-jre)


Когда я бегу top, Я получаю это:

  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

Я понимаю и ожидаю, что 64-битная машина / JVM будет использовать больше памяти, но я не ожидал, что она будет такой большой. Я работаю на виртуальной машине, которая гарантирует мне только 512 МБ.

---- Отредактировано, чтобы предоставить пример, поскольку точка не встречается ----

Запускается процесс и запрашивает 1 ГБ памяти.

Затем этот процесс запускает восемь потоков (каждый из которых имеет доступ к выделенному 1 ГБ памяти).

Кто-то запускает инструмент, чтобы определить, сколько памяти используется. Инструмент работает следующим образом:

  1. Найдите каждый запланированный элемент (каждый поток).
  2. Посмотрите, сколько памяти у него есть.
  3. Добавьте это воспоминание вместе
  4. Сообщите сумму.

Инструмент сообщит, что процесс использует 9 ГБ памяти, когда (надеюсь) очевидно, что существует восемь порожденных потоков (и поток для исходного процесса), использующих один и тот же ГБ памяти.

Это дефект в том, как некоторые инструменты сообщают о памяти; однако это нелегко исправить (поскольку для его устранения потребуется изменить вывод некоторых очень старых (но важных) инструментов). Я не хочу быть тем, кто переписывает top или ps, это сделало бы ОС не-POSIX.

---- Исходный пост следует ---- Некоторые версии инструментов отчетов о памяти (например, top) ошибочно путают потоки (все они имеют доступ к одной и той же памяти) с процессами. В результате экземпляр tomcat, который порождает пять потоков, неверно сообщит о потреблении памяти в пять раз.

Единственный способ убедиться в этом - перечислить процессы с учетом их потребления памяти по отдельности, а затем прочитать память для одного из потоков (который отображается в списке как процесс). Таким образом вы узнаете истинное потребление памяти приложением. Если вы полагаетесь на инструменты, которые делают это за вас, вы переоцените объем памяти, фактически используемый количеством потоков, ссылающихся на одну и ту же общую память.

У меня были коробки с 2 ГБ памяти (и 1 ГБ подкачки), в которых сообщалось, что раньше использовалось ~ 7 ГБ памяти для приложения с особенно тяжелыми потоками.

Чтобы лучше понять, как многие инструменты сообщают о памяти, Смотри сюда. Если код Python анализирует текст одного из этих инструментов или получает эти данные из одних и тех же системных вызовов, то он подвержен тем же ошибкам при переполнении памяти.