У меня есть две виртуальные машины с, казалось бы, одинаковой конфигурацией (созданные из одного и того же шаблона виртуальной машины, и различие в папке Tomcat не дало никакой разницы, кроме конфигурации имени хоста).На обеих машинах развернуты одни и те же веб-приложения.
Одна машина работает нормально.На другом компьютере я получаю ошибки, потому что классы не найдены.Я перезапустил tomcat 3 раза, и всегда получаю разные ошибки, также в разных приложениях.Одна из таких ошибок заключается в следующем:
java.lang.NoClassDefFoundError: org/springframework/web/context/request/ServletRequestAttributes
org.springframework.web.context.request.RequestContextListener.requestInitialized(RequestContextListener.java:64)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
java.lang.Thread.run(Thread.java:662)
В каждом случае этой ошибки до сих пор отсутствующий класс (например, ServletRequestAttributes
) находится в том же банке, что и класс, который нуждается в нем (например, RequestContextListener
).
Я использую CentOS, Apache 2.2.3, Tomcat 6.0.30 и Oracle JDK 1.6.0_24 на обеих машинах.Tomcat сконфигурирован с большим количеством кучи и разрешенного пространства (также идентичных на обеих машинах).
Похоже, что Tomcat 6 "теряющих" классов в рабочей среде является аналогичной проблемой, нопока без решения.
Одной из возможных названных здесь проблем является «возможно, вы достигли максимального числа дескрипторов открытых файлов в ОС».Имея базовые знания Linux, мне удалось выполнить некоторые команды, найденные в Интернете, которые говорят мне, что
- max файловых дескрипторов 6815744 на обеих машинах (
cat /proc/sys/fs/file-max
), - currentпри сбое - 10710, на правильной машине - 10200 (
cat /proc/sys/fs/file-nr
), максимальное количество дескрипторов файлов - на процесс - 1024 (
ulimit -n
), - текущее использование Tomcat - 641сбой и 686 на правильной машине (
lsof -p <TOMCAT-PID> | wc -l
).
ОБНОВЛЕНИЕ: Я перезапустил сбой Tomcat и сразу открыл все приложения в браузере.Использование файлов Tomcat продолжалось до 1926 года. Теперь я вижу ошибку NoClassDefFoundError почти в каждом приложении, и я также вижу это сообщение в одном файле журнала:
2011-12-12 18:38:36,225 ERROR [TP-Processor3] [rplansecurity] org.jasig.cas.client.validation.Cas20ServiceTicketValidator java.net.SocketException: Too many open files
java.net.SocketException: Too many open files
at java.net.Socket.createImpl(Socket.java:397) ~[na:1.6.0_24]
Я сделал то же самое для правильного Tomcat, иэто тоже не удалось.Похоже, что здесь нет никакой разницы в двух машинах: обе они открывают слишком много файлов.