2011-01-27 4 views
4

제 질문은 JVM의 공유가 스레딩 또는 ProcessBuilder의 성능을 한 달 이상 정상적으로 사용할 수있는 프로세스와 관련된 일종의 리소스입니까? 모든 앱에 java 6 update 21 사용.Solaris의 Java ProcessBuilder 성능에 대한 도움이 필요하십니까?

지난 수개월 동안 데이터 센터의 단일 서버 (Solaris 10을 실행하는 Sparc M4000)가 문제없이 약 6-8 주가 소요될 수 있다는 것을 알았습니다. 그러나 ProcessBuilder 클래스를 사용하여 스크립트를 실행하는 응용 프로그램의 성능은 처리 성능에 큰 영향을줍니다. ProcessBuilder.start는 가끔씩 돌아 오는데 1 분 이상 걸립니다. 재부팅 후 몇 주 동안 정상 복귀 시간은 10 초 또는 100 밀리 초 범위입니다.

5 개의 스레드를 생성하는 별도의 작은 응용 프로그램을 작성했으며 각 스레드는 ProcessBuilder를 사용하여 10 번 직렬로 'ls'명령을 실행 한 다음 원래 문제를 모니터링하기 위해 통계를 수집합니다. 이 응용 프로그램은 각 실행 후에 종료되며 cron에서 한 시간에 한 번만 실행됩니다. 대개 1 ~ 2 초 정도 걸립니다.

지난 밤, 45 분의 가동 시간과 정상적인 작동 후에도 ProcessBuilder 시간은 각 ProcessBuilder.start 호출에 대해 1 분 이상으로 급증했습니다.

상단에는 메모리 또는 CPU hog가 표시되지 않습니다. 테스트 응용 프로그램에서 jstack을 시도했지만 'thread_db 에이전트를 만들 수 없습니다'오류가 발생했습니다.

아이디어가 있으십니까?

+0

내 생각에 뭔가 어슬렁 거리고 GC가 열심히 일하고 있습니다. verbosegc 로그가 있습니까? –

+1

ProBression이 각 ProcessBuilder간에 선형인지 알 수 있습니까? –

+0

좀비 프로세스를 떠나고 있습니까? 이것은 일어나지 않아야하지만 시스템에 수 천 개의 좀비 프로세스가 있는지 확인하는 것이 좋습니다. –

답변

4

Linux에서 실행되는 우리 응용 프로그램에서도 비슷한 문제가있었습니다. Linux JVM 코드는 포크를 사용합니다. 즉, exec 할 때마다 주소 공간이 매핑되고 복사됩니다. 우리는 많은 짧은 단기간의 프로세스를 수행하고있었습니다. 앱과의 가장 큰 차이점은 비교적 큰 힙 (약 240GB)이 있었기 때문에 영향을 미쳤다는 것입니다. 우리는 JNI와 posix 스폰를 사용하여 자체 생성 코드를 구현했습니다. 질문/답변에 대한 링크는 다음과 같습니다. Slowing process creation under java

관련 문제