2011-12-12 8 views
1

동일한 VM 템플릿에서 생성 된 겉보기와 동일한 구성을 가진 두 개의 가상 시스템이 있고 Tomcat 폴더를 diff'ing하면 호스트 이름 구성과 다른 점이 없습니다. 두 컴퓨터 모두 동일한 웹 응용 프로그램이 배포됩니다.Tomcat이 기존 클래스를 찾지 못함

하나의 기계가 정상적으로 작동합니다. 다른 컴퓨터에서는 클래스를 찾을 수 없으므로 오류가 발생합니다. 나는 tomcat을 3 번 재시작했고, 항상 다른 응용 프로그램에서 다른 오류를 얻습니다. 누락 된 클래스 (예 ServletRequestAttributes) 정보 (예컨대 RequestContextListener)을 필요로하는 클래스와 동일한 용기에 존재하는, 지금까지의 모든 에러에 선두로부터

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) 

: 하나의 이러한 에러는이된다.

두 컴퓨터에서 CentOS, Apache 2.2.3, Tomcat 6.0.30 및 Oracle JDK 1.6.0_24를 사용하고 있습니다. Tomcat은 많은 양의 heap 및 perm gen 공간 (두 시스템 모두 동일)으로 구성됩니다.


Tomcat 6 "losing" classes in production이 비슷한 문제이지만, 지금까지 솔루션없이 것으로 보인다.

하나의 가능한 문제점은 "OS에서 열린 파일 핸들의 최대 수에 도달했을 수 있습니다."입니다. 기본적인 리눅스 지식, 나는 파일을 처리

  • 최대 두 기계 (cat /proc/sys/fs/file-max)에 6,815,744 것을 말해 인터넷에서 발견 된 일부 명령,
  • 현재 사용이 실패하고 10200에서 10710입니다 실행 관리 정확한 머신 (cat /proc/sys/fs/file-nr)에
  • 최대 파일 핸들은 프로세스 당 1,024 (ulimit -n) 톰캣
  • 전류 사용량에 실패한 641 정확한 머신 (lsof -p <TOMCAT-PID> | wc -l)에 686이다.

업데이트 : 나는 실패 Tomcat을 다시 시작하고 브라우저에서 한 번에 모든 응용 프로그램을 열었습니다. 톰캣의 파일을 사용하고 내가 거의 모든 응용 프로그램에서 NoClassDefFoundError를 참조 이제 1926 년까지 가서, 나는 또한 하나 개의 로그 파일에이 메시지가 표시 :

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] 

내가 올바른 톰캣에서 동일한했다, 그리고 그것은 실패 , 너무. 두 컴퓨터의 차이점은 다음과 같습니다. 둘 다 너무 많은 파일을 여는 것 같습니다.

+0

정확히 어떤 JDK를 사용하고 있습니까? Oracle 또는 OpenJDK 또는 GCJ? GCJ는 매우 버그가 있습니다. – BalusC

+0

바람둥이를 시작할 때이 항아리가 JVM 클래스 패스에 있는지 확인 하시겠습니까? "ps -ef | grep 'tomcat'"을 시도하거나 visualVM/jconsole과 연결하여 클래스 경로를 확인하십시오. 동일한 앱을 사용하는 것이 좋습니다. 두 클래스 패스를 비교하면됩니다. – dimitrisli

+0

@BalusC Oracle JDK를 사용하고 있습니다. –

답변

4

열려있는 파일의 최대 개수를 초과하면 내 생각이들 것입니다. 또한 'ulimit -n'은 프로세스별로가 아니라 사용자 당 최대 파일 핸들을 표시한다고 생각하지만 잘못된 것일 수 있습니다. Tomcat은 다른 사용자로도 실행될 수 있습니다.

'-verbose : class'를 시작하여 클래스를보고 어떤 위치에 패턴이 있는지를 확인하기 위해로드되는 위치를 확인하려고합니다.

+0

Tomcat 사용자로 전환하면'ulimit -n'은 같은 결과를 보게됩니다 : 1024.'-verbose : class' 옵션으로 Tomcat을 시작할 때로드되는 클래스가 많지만 실패 메시지는 표시되지 않습니다. –

+0

'ulimit -n 4096'으로 파일 제한을 늘리는 것이 도움이되는 것 같습니다. Tomcat을 다시 시작하고 브라우저에서 한 번에 모든 애플리케이션을 열었습니다. 단 하나의 클래스가 누락되지 않았습니다. 'lsof -p | wc -l'의 출력은 3305까지 올라간 다음 650으로 떨어집니다. –

+0

차가워서 제 분석이 바로 끝났습니다. catalina.sh 스크립트에 ulimit 호출을 추가 할 수 있습니다. – maximdim

관련 문제