2016-08-14 17 views
2

다른 웹 응용 프로그램과 함께 tc-server를 실행하는 6 개의 Java 프로세스가있는 Linux 서버에서 가끔씩 여러 서버가 작동을 멈 춥니 다. 이 오류로 인해 같은 시간) :java.lang.OutOfMemoryError : 새로운 네이티브 스레드 메시지를 작성할 수 없지만 실행중인 스레드가 많지 않음

Exception in thread "ajp-bio-9096-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:714) 
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) 
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:162) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:142) 
at org.apache.catalina.core.StandardThreadExecutor.execute(StandardThreadExecutor.java:169) 
at org.apache.tomcat.util.net.JIoEndpoint.processSocket(JIoEndpoint.java:531) 
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:234) 
at java.lang.Thread.run(Thread.java:745) 

이 하나 이상의 JVM의 작동을 중지 한 컴퓨터에서 실행되는됩니다. (동일한 시스템에서 6 대의 tc 서버를 실행 중입니다.) Linux 시스템의 최대 프로세스 수에 도달했습니다. 최대 스레드 수는 OS-level is about 31389 (ulimit -u)입니다. 내가 운영 체제를 보면하지만 우리는 프로파일 링 할 때

(ps -eLF | wc -l) 

을 실행하는 방법에 대한 1500 스레드가 리눅스 스레드의 과도한 수를 볼 수 없습니다 /를 tcserver을 모니터링하는 것은 자바 프로세스 당 스레드 수 사이에 통상 처리 50, 150 및 부하가있는 경우 http 스레드로 인해 이 350에 도달 할 수 있지만 프로세스는 최대 1000 개의 스레드 (이 시스템)에 도달하지 않습니다.

우리는 64 bit Java 1.7 런타임 환경을 사용하고 있으며 OS에는 항상 여유 메모리가 있습니다.

오늘 우리는 서버 시작 1 분 후에이 메시지를 받았습니다. jvm이 작동을 멈췄지만 os 프로세스는 계속 실행 중입니다. 이 프로세스의 스레드의 수를 볼 때 는 스레드의 최대 수에 도달처럼 51

(ps uH p <pid> | wc -l). 

그래서 보이는,하지만 우리는 실행 스레드를 많이 볼 수 없습니다.

+1

얼마나 많은 메모리가 사용되는지 알 수 있도록 '상단'캡쳐를 얻는 마음입니까? –

+0

다음과 같이 표시됩니다 : 작업 : 364 총, 1 실행 중, 363 자, 0 중지, 0 좀비 CPU : 9.7 % 우리, 5.9 % sy, 0.0 % ni, 83.4 % id, 0.2 % wa, 0.0 % 안녕, 0.835 % si, 0.0 % st Mem : 8057304k total, 7778672k used, 278632k free, 476752k 버퍼 스왑 : 총 1048572k, 0k 사용, 1048572k 무료, 1301448k 캐시 – Edwin

+0

시간에 메모리 사용 그래프를 보면 항상 실제 메모리와 스왑에서 사용 가능한 작은 부분 메모리. – Edwin

답변

4

문제의 원인을 발견했습니다.

나는 내 사용자와 함께 ulimit -u를 확인했습니다. 그게 31389로 돌아왔다. 그리고 나는이 한계에 도달 한 이유를 볼 수 없었다.

그러나 생산에

이러한 프로세스는 다른 사용자에서 실행, 1024

이 6 개 서버가 기본 상태 서버 당 50-150 스레드에있는 반환 -u 해당 사용자 는 ulimit 그래서 조금 임시있을 때 더 많은 스레드를로드하면 tcserver의 스레드 수는 1024 개로 제한됩니다.

리눅스에서는 프로덕션 사용자의 스레드 수를 늘렸으므로 이제는 정상적으로 실행됩니다.