Неожиданно заканчиваются сеансы Tomcat

Мы запускаем сервер приложений tomcat, который обрабатывает более 100 параллельных сеансов. За последние 2 месяца наиболее активные пользователи заметили, что иногда их запускают из системы.

Как я понял из сеанса log tomcat, срок действия истек без какой-либо причины.

Я не вижу проблем со стороны веб-приложения. Есть ли проблема с стороны tomcat?

Tomcat 6.0.18.

Ответ 1

Если не было никакой вероятности запуска кода, я бы посмотрел на использование памяти. Это может привести к тому, что Tomcat исчерпает память и отменяет сеансы для восстановления.

Если на всех возможных мониторах собирать мусор и/или включать наблюдение с помощью jconsole или jvisualvm.

Ответ 2

Возможная причина заключается в том, что вы помещаете в сеанс объект, который НЕ реализует интерфейс Serializable. Tomcat иногда пишет некоторые из сессий на диске. Если сеанс содержит несериализуемые объекты, он просто будет удален из контейнера (из-за исключения NotSerializableException). Если это происходит, вы должны увидеть Exception в файле журнала tomcat.

Ответ 3

Я бы увеличил мониторинг сервера в целом и сеансов.

Хорошее приложение для мониторинга лямбда-зонд - позволяет просматривать текущие сеансы и их данные. Я также добавлю HttpSessionListener для создания и уничтожения сеанса регистрации.

Edit

Возможно ли, что вы добавите некоторые несериализуемые объекты в сеанс, и Tomcat не сможет их пассивировать на диск?

Изменить 2

Лямбда-зонд кажется мертвым, и там есть гораздо лучшая вилка проекта над http://code.google.com/p/psi-probe/

Ответ 4

существует тайм-аут, который вы можете настроить в своем web.xml:

<web-app>
  ...
  <session-config>
    <session-timeout>-1</session-timeout> 
  </session-config>
</web-app>

использовать -1 для таймаута

Ответ 5

Увеличьте регистрацию сеансов, что может пролить свет на вашу проблему.

Страница конфигурации Tomcat Вход в Tomcat включает пример увеличения регистрации сеансов.

Ответ 6

Мы просто столкнулись с этим с tomcat 6_0_18 и ibm 1.5 jvm

оказывается, что это была проблема ibm jvm с атомными операциями.

В tomcats есть исправление, превышающее 6_0_19.

Это также не происходит в sun 1.5 jvm

вот еще несколько деталей

файл tomcat bugzilla

Ответ 7

Я видел подобные проблемы, когда существуют следующие предпосылки:

  • несколько экземпляров приложения tomcat установлены на нескольких JVM
  • балансировка нагрузки (между веб-сервером и JVM Tomcat) настроена неправильно.
  • Функция репликации сеанса Tomcat не включена

Из-за неправильной конфигурации балансировки нагрузки веб-сервер может случайно решить разорвать схожесть сеанса и отправить входящий запрос в JVM Tomcat, который ранее не видел сеанс. Tomcat JVM выпустит новый сеанс, и пользователь потеряет все свои предыдущие данные сеанса и начнет эффективно работать.

Ответ 8

Вы можете найти базу данных ошибок Tomcat, но лучше сначала взглянуть на ваше веб-приложение. Шансы на то, что с Tomcat что-то не так, очень низки.

Попробуйте выяснить, что вызывает недействительность сессии. Вы используете фильтры? Есть ли у вас кросс-контекстные запросы? Попытайтесь добавить информацию о регистрации для каждого запроса, чтобы узнать, когда именно сессия потеряна.

Ответ 9

Несмотря на то, что я не знаю причину проблемы, одним из возможных исправлений (которое я сделал в моем предыдущем проекте) было бы запуск приложения в кластере tomcat и восстановление сеанса. Сессии могут быть по умолчанию липкими, а когда один node опускается, здоровые узлы собирают сеансы, и все это прозрачно для конечного пользователя.