2009-03-17 2 views
3

우리는이 JBoss 서버 문제를 꽤 오랫동안 디버깅했습니다. 약 10 시간의 작업 후, 서버는 100 % CPU 공황 상태에 빠지며 그냥 멈 춥니 다. 이 시간 동안 새 프로그램을 실행할 수 없기 때문에 kill -quit도 스택 추적을 얻을 수 없습니다. 이 높은 100 % SYS CPU로드는 지난 10-20 초 동안 지속되고 몇 분마다 반복됩니다.내 JBoss 서버가 Linux에서 100 % SYS CPU를 조회합니다. 무엇이 이것을 일으킬 수 있습니까?

우리는 꽤 오랫동안 작업 해 왔습니다. 우리는 그것이 GC와 관련이 있다고 생각하지만, 더 작은 프로그램으로는 확인할 수 없습니다. 우리는 -clientParNew GC을 사용하여 i386 32 비트, RHEL5 및 Java 1.5.0_10을 실행 중입니다.

여기에 우리가 지금까지 시도 무엇 : 우리가 실제로 서버를 사용할 수 있도록

  1. 우리는 CPU 선호도를 제한 할 때 높은 부하 안타. strace을 사용하면 SIGSEGV의 무한 루프가 표시되고 시그널이 반환됩니다.

  2. 우리는 이것을 Java 프로그램으로 재현하려고했습니다. SYS CPU %가 WeakHashMap 또는 null 포인터에 액세스 할 때 높게 올라가는 것은 사실입니다. 문제는 fillStackTrace이 많은 사용자 CPU %를 사용했기 때문에 우리는 결코 100 % SYS CPU에 도달하지 못했습니다.

  3. 스트레스가 10 시간이 지나면 GC가 열리고 전체 GC가 때로는 5 초 걸리는 경우가 있습니다. 그래서 우리는 그것이 메모리와 관련이 있다고 가정합니다.

  4. jstack 그 기간 동안 모든 스레드가 차단 된 것으로 나타났습니다. 그 시간 동안 pstack은 가끔 MarkSweep 스택 추적을 보여 주었기 때문에 이에 대해서도 확신 할 수 없었습니다. SIGQUIT을 전송하면 아무것도 생성되지 않았습니다. SYS %로드 기간이 끝난 후 Java에서 스택 추적을 덤프했습니다.

이제 우리는 Sun에 문의 할 수 있도록 코드의 작은 조각으로이 문제를 재현하려고합니다.

무엇이 문제인지 알면 알려 주시기 바랍니다. 우리는 아이디어에 열려 있고 우리는 단서 있습니다. 어떤 아이디어라도 환영합니다. :)

시간 내 주셔서 감사합니다.

+0

JBoss가이 문제로 유휴 상태로 실행되거나 실제로 응용 프로그램을 실행하고 있습니까? – Mork0075

+0

3 년 후 ... 이제 Maven 빌드와 JDK 1.7.0_07, 커널 3.6.2와 똑같은 것을 실행하고 있습니다. 동일한 JVM을 사용하는 이전 커널은이 문제를 표시하지 않습니다. 기묘한. – Raman

답변

1

도움을 주신 모든 분들께 감사드립니다.

결국 우리는 (자바 서버의 절반 만) JDK 1.6으로 업그레이드했고 문제는 사라졌습니다. 그냥 1.5.0.10 :

우리는 단지 널 포인터에 액세스하여이 문제를 재현하는 관리 사용하지 않는 것은 (대신 미국의 SYS을 향상하고, 전체 리눅스를 죽인다.)

을 다시 모두에게 감사를.

0

프로파일 링 응용 프로그램을 사용해 보셨습니까? 프로덕션 서버에서 실행할 수있는 좋은 프로파일 링 응용 프로그램이 있습니다. GC가 문제를 일으키고 어떤 객체를 가지고 있는지 알려줄 것입니다.

0

작년에 JBoss (JBoss 4, Linux 2.6)에서 비슷한 문제가있었습니다. 나는 결국 응용 프로그램 버그와 관련이 있다는 것을 알았지 만, 알아 내기가 정말 어려웠습니다. 나는 프로세스에 'kill -3'을 보내고 스택 추적을 얻고 무엇이 차단되는지 알아 내려고 노력할 것입니다. 어쩌면 로깅 구문을 추가하여 설정을 파악할 수 있는지 확인할 수 있습니다. 'lsof'를 사용하여 열려있는 파일을 확인할 수 있습니다. 메모리 이외의 리소스가 누출되면 알려줍니다.

또한 왜 -server 대신 -client를 사용하여 JBoss를 실행하고 있습니까? (이 경우에는 도움이 될 것이라고 생각하지는 않지만 일반적인 질문입니다.)

+0

-server 대신 -client를 사용합니다. 나는 그것을 서버로 변경하려고 노력하고 있지만, 서버에서도 마찬가지입니다. 나는 체크했다. -server는 널 포인터에 접근 할 때 SIGSEGV를 전송하지 않는다. 우리는 40 % SYS에서 kill -quit을 시도했으나 nonblocking : 아무것도 찾지 못했습니다. ( – gilm

+0

스레드가 잠금에서 차단 되었습니까? (다른 스레드가 잠금을 기다리는 중입니까?) 또는 IO에서 차단 되었습니까? – Avi

1

당신은 (그리고 소리 당신의 설명에 따라 좋아는 않음), 다음 -XX 추가 GC는 문제가 있음을 확신하는 경우 : JBoss의 설정 + HeapDumpOnOutOfMemoryError 플래그 것이 도움이 될 수 있습니다 (JBOSS_HOME에서/빈/run.conf).

이 플래그에 대한 자세한 내용은 here을 참조하십시오. 원래 Java 6에 추가되었지만 나중에 Java 1.5.0_07에 back-ported이되었습니다.

기본적으로 OutOfMemoryError가 발생하면 "덤프 파일"이 생성되어 다양한 프로파일 링 도구에서 열 수 있습니다. 우리는 Eclipse Memory Analyzer으로 행운을 빌었습니다.

이것은 "무료"답변을주지는 않지만 참으로 메모리 누수가있는 경우 찾을 수 있습니다.

0

GC 및 힙 크기를 표준 출력으로 출력해야하는 -verbose : gc 명령 줄 옵션을 추가해보십시오. pipe stdout을 파일로 보내고 높은 CPU 시간이 주요 GC와 정렬되어 있는지 확인하십시오.

Windows에서 JBoss와 비슷한 문제가 있음을 기억합니다. 주기적으로 cpu는 100 %가 될 것이고 Windows는 mem 사용량이 갑자기 JBoss를 돌릴 수있는 것보다 훨씬 작고 2.5MB 정도 떨어지게 될 것이라고보고하고 몇 초 후에 스스로를 백업합니다. 마치 전체 서버가 내려 와서 다시 시작한 것처럼 말입니다. 결국 Apache Commons에서 만료되지 않는 준비된 명령문 캐시로 내 문제를 추적했습니다.

메모리 문제가있는 것 같으면 정기적으로 힙 덤프를 가져 와서 비교하거나 JProbe Memory Profiler와 같은 것을 사용하여 모든 것을 추적 할 수 있습니다.

관련 문제