2012-11-17 3 views
1

2GB의 RAM이있는 debian-lenny x64 서버에서 Apache 2.2의 012catmod_jk 1.2.26을 실행하고 있습니다.
나는 내 서버에 이상한 문제가있다 : 매시간마다 & 몇 분마다 부하가 걸리고, tomcat ajp 커넥터는 메모리 누수 오류로 일시 중지되지만이 오류는 시스템의 다른 부분에도 영향을 미친다 (예 : 일부 다른 실행중인 응용 프로그램도 작동을 멈 춥니 다. & 잠시 동안 문제를 해결하기 위해 서버를 재부팅해야합니다.
나는 며칠 동안 catalina.out을 확인했지만, 단지이 메시지와 AJP를 일시 중지하기 전에의 고유 한 오류 패턴이없는 것 :아파치, tomcat 및 mod_jk 및 mysql을 사용한 메모리 누수

Exception in thread "ajp-bio-8009-Acceptor-0" java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:597)... 
를 : 일시 중지하기 전에

INFO: Pausing ProtocolHandler ["ajp-bio-8009"] 

때때로이 메시지가

& 때로는이 하나

INFO: Reloading Context with name [] has started 
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:597) 
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5482) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:230) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3847) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1214) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1410) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1410) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1389) 
    at java.lang.Thread.run(Thread.java:619) 
java.sql.SQLException: null, message from server: "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug"... 

& 다른 배 outpu 프로그램의 다른 부분과 관련된 메시지.
내 응용 프로그램 소스 코드를 확인했습니다. & 문제가 발생하지 않는다고 생각합니다. 또한 jConsole을 사용하여 메모리 사용량을 확인했습니다. 방황하는 요점은 서버가 실패 할 때 힙 & 힙이 아닌 jvm 메모리 공간에 많은 양의 사용 가능한 메모리가 있다는 것입니다. 앞에서 말했듯이, 서버를 크래쉬 한 후에 많은 다른 어플리케이션들도 역시 실패 할 것이므로 & 자원을 일시적으로 사용할 수 없다는 메시지가 나타납니다 (limits.conf 파일도 점검했습니다).
그래서 나는이 심각한 문제와 많은 시간을 헷갈 렸습니다. & 나는 그것에 대해 더 이상 생각하지 못했습니다. 그래서, 아무도 나에게이 복잡한 문제를 해결하기 위해 어떤 제안을 해줄 수 있습니까? & 알 수없는 문제 ???
이 오류의 가능한 원인은 무엇입니까?

+0

아마도 serverfault.com을 살펴볼 수 있습니다. – Sietse

답변

0

마침내 문제가 발견되었습니다 : 실제로 메모리 누수가 아니지만 VPS의 허용 스레드 수 제한 때문에 문제가 발생했습니다. 내 서버는 256 스레드의 기본 제한이있는 Xen vps 였으므로 최대 허용 스레드에 도달하면 감독자가 실행중인 스레드 중 일부를 죽였습니다 (이는 실행중인 일부 프로세스를 중지시키는 원인이었습니다). 허용되는 스레드 수를 512로 늘림으로써 문제는 완전히 해결되었습니다 (물론 내가 tomcat 설정에서 maxThreads를 증가 시키면 문제가 다시 발생한다는 것이 명백 함).

0

프로세스 수에 대한 제한은 무엇입니까?

uname -a로 확인하고 최대 프로세스 수를 확인하십시오. 1024이면 증가 시키십시오.

또한 시작하기 위해 사용하는 사용자에게 동일한 것을 확인하십시오. 예를 들어, 아무 것도 사용하지 않는 사용자의 경우 su -c "ulimit -a"-s/bin/sh nobody를 실행하십시오. 실제로이 사용자가 한계로 보는 것을보십시오). 그것은 당신에게 문제를 보여 주어야합니다. (며칠 전이 문제를 완전히보고 싶었습니다.)

그 순간에 상황이 시작될 때 "ps -eLf | wc -l"을 사용하여 해당 사용자의 실행중인 모든 스레드 및 프로세스를 카운트 할 수 있습니다 (또는 rrdtool 또는 다른 것을 사용하여 모니터하는 것이 더 좋습니다). 시스템에서 실행중인 모든 프로세스와 스레드를 간단히 계산할 수 있습니다. 이 정보는 모든 특정 사용자의 제한 사항과 함께 사용자의 문제를 해결해야합니다.

0

jvm을 사용하여 jvm의 힙 사용을 확인하십시오. 일정 기간 동안 천천히 등반하는 것을 보면, 그것은 메모리 누출입니다. 때로는 메모리 누수가 단기적이어서 결국 다시 시작되고 다시 시작됩니다.

톱니 모양이 보이면 sawtooth의 피크 부근에서 힙 덤프를 가져오고 그렇지 않으면 jvm이 높은 위험과 OOM 오류가 발생할 정도로 오래 실행 한 후에 힙 덤프를 가져옵니다. 그런 다음 .hprof 파일을 다른 컴퓨터에 복사하고 Eclipse MAT (Memory Analysis Tool)를 사용하여 열어서 범인을 식별하십시오.데이터 구조에서 refs를 수행 한 후 약간의 시간을 할애해야하고 Javadoc을 읽는 것만으로도 통제 범위를 벗어나는 Hashmap이나 List를 사용하고 있는지 파악할 필요가 있습니다. 정렬 옵션은 가장 가능성이 높은 문제 영역에 집중하는 데 유용합니다.

쉬운 대답은 없습니다.

또한 힙 덤프를 트리거 할 수있는 SUN jvm에 포함 된 명령 줄 도구가 있습니다. 또한 메모리 누수가 일반적으로 자주 실행되는 코드에 있기 때문에 프로파일 러에서 핫스팟으로 표시되기 때문에 좋은 프로파일 러를 사용할 수도 있습니다.