Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка памяти Tomcat 6.0.16 + SSL 
:(
    Опции темы
danilkus
Дата 30.4.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Привет всем!

Запускаю на томкате простой сервлет.
Вот часть его кода:
Код

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().write("post!!!");
            response.setStatus(200);
      }


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

<Connector port="8443"
        maxHttpHeaderSize="8192"
        connectionTimeout="60000"
        enableLookups="false"
        disableUploadTimeout="true"

        maxThreads="900"
        minSpareThreads="350"
        maxSpareThreads="700"
        acceptCount="700"

        protocol="HTTP/1.1"
        SSLEnabled="true"
        scheme="https"
        secure="true"
        clientAuth="false"
        sslProtocol="TLS"
        keystoreFile="/opt/.keystore"
        keystorePass="tomcat" />


Система работает под нагрузкой следующего рода. 40 потоков, каждый из которых шлет раз в секунду POST запрос.
Никаких необычных заголовков в запросе нет.
Томкату при старте выдаю 300Мб памяти.

После примерно трех часов работы он выдает OutOfMemoryError.

Анализ дампа показывает подозрительно большое количество инстансов com.sun.net.ssl.internal.ssl.SSLSessionImpl. Остальное вроде все в норме.
PM MAIL   Вверх
Maksym
Дата 30.4.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



danilkus
На сколько помню у Tomcat дефолтное время жизни сессии 30 минут. Если каждый запрос порождает новую сессию (открывает новое соединение) каждую секунду, то память вполне может закончится. Запусти Tomcat с ключем -verbose:gc и понаблюдай как будет расходоваться и очищатся память во время теста.
PM MAIL   Вверх
danilkus
Дата 30.4.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Пробовал ставить keepAliveTimeout в 0. По идее после этого сокет должен закрываться сразу после отправки ответа и HTTP сессия соответственно. Не помогло.

Во тут описывается точь в точь такая же проблема.
http://forum.java.sun.com/thread.jspa?thre...66&tstart=0
Судя по всему проблема в реализации JSSE.

Можно ли как-нибудь запустить томкат с другим провайдером SSL? Если кто-нибудь пробовал подскажите примерно как это делается.
PM MAIL   Вверх
Maksym
Дата 30.4.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(danilkus @  30.4.2008,  14:49 Найти цитируемый пост)
Пробовал ставить keepAliveTimeout в 0.

Где? Попробуй в web.xml именно твоего приложения поставить короткий таймаут сессии. 
Цитата(danilkus @  30.4.2008,  14:49 Найти цитируемый пост)
По идее после этого сокет должен закрываться сразу после отправки ответа и HTTP сессия соответственно. Не помогло.

Не факт, что сервлет контенер убивает сессионый объект сразу же. Скорее всего нет.


И все таки попробуй -verbose:gc, он же всю картину показывает.



PM MAIL   Вверх
danilkus
Дата 30.4.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата

Где?

в настройке томкат коннектора, через который идут все запросы.

Цитата

Попробуй в web.xml именно твоего приложения поставить короткий таймаут сессии.

попробую

Цитата

Не факт, что сервлет контенер убивает сессионый объект сразу же. Скорее всего нет.

ну а смысл держать объект если сокет закрыт. Все равно будут только новые сессии.

Цитата

И все таки попробуй -verbose:gc, он же всю картину показывает.

мониторил через JConsole. Видно что каждый раз fullGC освобождает меньше объектов из пула постоянных объектов  heap. И соответственно работать ему приходится все чаще. По дампу видно что есть куча инстансов SSLSessionImpl, которые держатся ссылками из Finalizer и именно их GC и не может подчистить. Больше ИМХО там увидеть ничего нельзя.
PM MAIL   Вверх
Maksym
Дата 30.4.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(danilkus @  30.4.2008,  15:29 Найти цитируемый пост)
Больше ИМХО там увидеть ничего нельзя. 

Согласен.

Цитата(danilkus @  30.4.2008,  15:29 Найти цитируемый пост)

ну а смысл держать объект если сокет закрыт. Все равно будут только новые сессии.

Может кривая реализация.

Тут тоже поднимается эта проблема. Без ответа.


PM MAIL   Вверх
danilkus
Дата 4.5.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Как можно заставить томкат работать по SSL без JSSE?
PM MAIL   Вверх
Alexandr87
Дата 4.5.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 6
Всего: 39



danilkus, можно поставить перед томкатом SSL акселератор. или какой-нибудь софт со схожими функциями.

Добавлено @ 11:42
А вообще надо будет посмотреть, может и возможно настроить Tomcat работать со сторонними реализациями JSSE. Мне кажется такое должно быть возможно.

Добавлено @ 11:51
PS. Кстати на сколько я помню, можно наладить взаимодействие между Apache (не Tomcat) серваком и Tomcat ом, чтобы Apache скармливал Tomcat у, обработку сервлетов и прочей java лабуды. Тогда SSL сервер можно будет поднять на Apache (не Tomcat) сервере, а запросы обрабатывать на Tomcat`е

Это сообщение отредактировал(а) Alexandr87 - 4.5.2008, 11:52
PM Jabber   Вверх
Alexandr87
Дата 4.5.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 6
Всего: 39



Можно подрубить openSSL
http://tomcat.apache.org/tomcat-6.0-doc/apr.html
PM Jabber   Вверх
danilkus
  Дата 4.5.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата

Можно подрубить openSSL
http://tomcat.apache.org/tomcat-6.0-doc/apr.html


Этот вариант как раз пробую сейчас 
PM MAIL   Вверх
COVD
Дата 4.5.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Когда визард нетбинса генерирует шаблон сервлета, то он дает такой код:

Код

PrintWriter out = reponse.getWriter();
try{
  out.println("...");
finally {
  out.close();
}


Может, вы не закрываете?
PM MAIL   Вверх
danilkus
Дата 5.5.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата

Может, вы не закрываете?


setStatus очищает буфер, поэтому там ничего копиться не может. Ссылка на out тоже помирает после ответа.
Тем более что если бы текло здесь проблема бы воспроизводилась и без SSL, а она не воспроизводится.
Хотя согласен, что такой код лучше.
PM MAIL   Вверх
danilkus
Дата 5.5.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата

Можно подрубить openSSL
http://tomcat.apache.org/tomcat-6.0-doc/apr.html


Если просто настроить использование openSSL, как указано тут, все равно используются классы JSSE и ситуация повторяется.
PM MAIL   Вверх
COVD
Дата 5.5.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

setStatus очищает буфер, поэтому там ничего копиться не может


setStatus не замена out.close(), т.е. не закрывает стрим и не освобождает ресурсы. Можно выполнить setStatus, а потом продолжать с успехом писать в out, что невозможно после выполнения close().    
PM MAIL   Вверх
danilkus
Дата 5.5.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата

setStatus не замена out.close(), т.е. не закрывает стрим и не освобождает ресурсы. Можно выполнить setStatus, а потом продолжать с успехом писать в out, что невозможно после выполнения close(). 


Согласен, дырка определенная тут есть. Но проблема топика к сожалению не в этом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.