큰 파일을 청크로 나누고 청크를 정렬하여 최종 정렬 된 파일로 병합하는 프로그램이 있습니다. 응용 프로그램은 파일로드/저장을 위해 하나의 스레드를 실행하며 하나의 스레드 만 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/
코드를 확인해야합니다. 내 생각 엔 생각보다 많은 스레드를 사용하고있는 것 같습니다. –
jvisualvm을 사용하여 스레드 수를 계산했습니다. 알고있는 스레드 만 표시합니다. 또한 하나의 메인 스레드 만 실행하고 정확히 같은 결과를 얻는 간단한 테스트 프로그램을 만들었습니다. 문제의 내 업데이트를 확인하십시오. –
4 개의 스레드가 6 개의 코어를 100 % 사용하지 못합니다. 스레드가 많거나 측정 값이 잘못되었습니다. –