2011-10-12 1 views
2

큰 파일을 청크로 나누고 청크를 정렬하여 최종 정렬 된 파일로 병합하는 프로그램이 있습니다. 응용 프로그램은 파일로드/저장을 위해 하나의 스레드를 실행하며 하나의 스레드 만 I/O 작업을 수행합니다. 또한 청크 데이터를 받고, 정렬 한 다음, I/O를 수행하는 스레드로 정렬 된 데이터를 다시 보내는 두 개의 스레드가 있습니다.Java 응용 프로그램에 의한 다중 코어 CPU 사용

따라서 일반적으로 주 스레드, 데이터를로드/저장하는 스레드 및 데이터를 정렬하는 두 개의 스레드가 실행 중입니다.

실행하는 동안 CPU 시간을 사용하지 않는 1 개의 대기 스레드 (주)와 각각 1 개의 CPU 코어를 사용하는 3 개의 활성 스레드가 있다고 생각했습니다.

듀얼 6 코어 프로세서 머신에서 하이퍼 스레딩 (24 CPU)으로이 프로그램을 실행하면 24 개의 CPU가 모두 100 %로드됩니다!

처음에는 정렬 알고리즘이 mutithreaded라고 생각했지만 자바 소스를 살펴본 결과, 그렇지 않은 것으로 나타났습니다.

내가 데이터를 정렬하는 간단한은, Collections.sort (LinkedList의)를 사용하고 있습니다 ... 여기

은 몇 가지 세부 사항은 다음과 같습니다 I 프로세서 부하를 모니터링하는 nmon을 사용하고 있었다

 
# java -version 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 

# uname -a 
Linux 2.6.32-28-server #55-Ubuntu SMP Mon Jan 10 23:57:16 UTC 2011 x86_64 GNU/Linux 

.

나는이 사건의 설명과 나는이 특정 작업을 다른 응용 프로그램

[업데이트] 내가 스레드를 계산하는 jvisualvm을 사용

CPU 시간을 두지 않는 CPU 부하를 제어하는 ​​방법에 대한 조언을 부탁드립니다 - 내가 아는 쓰레드들만 보여줍니다. 또한 I는 한 주 스레드를 실행하는 간단한 테스트 프로그램 (아래 참조)를 만들었고, 정확히 같은 결과를 얻었다 - 모두 (24 개) 프로세서는 코드 실행시에 거의 100 %의 바쁜 가

는 [UPDATE] 여기서

public class Test { 

    public void run(){ 
     Random r = new Random(); 
     int len = r.nextInt(10) + 5000000; 
     LinkedList<String> list = new LinkedList<String>(); 
     for (int i=0; i<len; i++){ 
       list.add(new String("test" + r.nextInt(50000000))); 
     } 
     System.out.println("Inserted " + list.size() + " items"); 
     list.clear(); 
    } 

    public static void main(String[] argv){ 
     Test t = new Test(); 
     t.run(); 
     System.out.println("Done"); 
    } 
} 
http://imageshack.us/photo/my-images/716/cpuload.png/

+1

코드를 확인해야합니다. 내 생각 엔 생각보다 많은 스레드를 사용하고있는 것 같습니다. –

+0

jvisualvm을 사용하여 스레드 수를 계산했습니다. 알고있는 스레드 만 표시합니다. 또한 하나의 메인 스레드 만 실행하고 정확히 같은 결과를 얻는 간단한 테스트 프로그램을 만들었습니다. 문제의 내 업데이트를 확인하십시오. –

+0

4 개의 스레드가 6 개의 코어를 100 % 사용하지 못합니다. 스레드가 많거나 측정 값이 잘못되었습니다. –

답변

1

내가 제안이 그것을 해결하기 위해, 내가 제공하는 top 명령에 들여다 봐도 것 자바 질문보다는 nmon을이다 : 위의 프로그램 (nmon을 사용)을 실행하는 동안 스크린 샷은 내가 만든 프로세스 당 CPU 사용량에 대한 정보. 나는 다음과 같은 결과를 예측한다 : 100 % cpu-time 근처에서 하나의 자바 쓰레드를 볼 수있다. (정상적인 프로세스 당 퍼센티지가 하나의 (가상) 코어에 비례 함) 어쩌면 두 번째와 세 번째 자바 쓰레드가 많이있다. 적은 CPU 사용량 (I/O 스레드). gc의 선택에 따라 하나 이상의 gc-Threads를 발견 할 수도 있지만 20보다 훨씬 적습니다.

HotSpot은 순차적 인 작업을 자체적으로 병렬 처리하지는 않습니다.

+0

"top -H"가있는 응용 프로그램을 검사했으며 java가 소유 한 많은 스레드. 그런 다음 실행 중에 "jstack"을 사용하여 응용 프로그램을 검사하여 gc 스레드가 많다는 것을 확인했습니다. "GC task thread # 0" .... "GC task thread # 14" 그래서 nmon에 의해 보여지는 것은 GC 쓰레드에 의해 생성되었다. GC를 제어하는 ​​방법에 대해 자세히 알아 보겠습니다. GC 아이디어로 돌아 가셔서 조나단 감사합니다. –

+0

-XX : ParallelGCThreads를 사용하여 스레드 수를 제어하고 nmon-4 애플리케이션 스레드에서 4 코어를 사용하여 정확히 예상 된 결과를 얻었습니다. @ Johnatan 다시 한번 감사드립니다! –