24 개의 코어가있는 서버에서 Linux [2]에서 실행되는 JVM [1]은 하나의 커다란 힙 (최대 240GB이지만,이 실행 단계의 대부분은 20-40GB 범위). 우리는 외부 실행 파일 &에 의해 처리되어야하는 수만 개의 객체를 가지고 있으며, 그 실행 파일에 의해 생성 된 데이터를 다시 JVM으로로드합니다. 각 실행 파일은 약 0.5 메가 바이트의 데이터를 디스크에서 생성합니다.이 데이터는 프로세스 완료 후 바로 읽을 때 더 커집니다.Java에서 프로세스 생성 속도 저하?
첫 번째 구현에서는 각 실행 파일이 단일 개체 만 처리하도록했습니다. 이것은 우리가 객체를 가졌던 것보다 두 배나 많은 실행 파일을 생성하는 것과 관련이 있습니다 (실행 파일을 호출 한 쉘 스크립트라고 부르기 때문에). CPU 사용률은 높지만 반드시 100 %는 아니지만 천천히 악화됩니다. 우리가 무엇이 일어나고 있는지 측정하기 시작하면서 프로세스 생성 시간 [3]이 지속적으로 느려짐을 발견했습니다. 초초부터 시작하여 결국 1 분 이상이 걸릴 것입니다. 실행 파일에 의해 수행되는 실제 처리는 보통 10 초 이내에 완료됩니다.
다음으로 생성 된 프로세스의 수를 줄이기 위해 처리 할 개체 목록을 취하도록 실행 파일을 변경했습니다. 배치 크기가 수백 (현재 샘플 크기의 1 %)이면 프로세스 생성 시간은 약 2 초에서 시작하여 &은 약 5-6 초로 증가합니다.
기본적으로 실행이 계속되면서 이러한 프로세스를 만드는 데 오랜 시간이 걸리는 이유는 무엇입니까?
[1] 오라클 JDK 1.6.0_22
[2] 레드햇 엔터프라이즈 리눅스 고급 플랫폼 5.3은 ProcessBuilder를 객체의 리눅스 커널 2.6.18-194.26.1.el5 # 1 SMP
[3] 창조, 오류 스트림을 리디렉션하고 시작합니다.
@ oconnor0 : omg ... 같은 문제가 있습니다. 리소스를 공개하는 것을 잊어 버리거나 어딘가에 버그가 있습니까? ** 많은 외부 프로세스를 인스턴스화하고 시간이 지남에 따라 느려지고 느려진다는 것을 알았습니다. 오류 (있는 경우)를 발견하면 여기에 다시 신고 해 주시겠습니까? +1하고 즐겨 찾기 ... (나를 위해 btw 이것은 OS X 10.4, 10.5 및 10.6에서 발생). – SyntaxT3rr0r
프로세스에서 생성 한 Input/OutputStream을 닫고 있는지 확인할 수 있습니까? –
@Mike Q : 제 경우에는 외부 프로세스가 모든 단일 출력을 파일 (stdout 및 stderr 포함)로 리디렉션하므로 아무 것도 생성되지 않습니다. – SyntaxT3rr0r