2008-10-18 8 views
23

Java에서는 CPU가 얼마나 많은 동시 스레드를 지원하는지 프로그래밍 방식으로 확인할 수 있습니까? 내게는 '정보의 일부를 제공프로세서 당 스레드

명확히하기 위해 업데이트, 나는 스레드 CPU를 망치려고하고 있지 않다 내가 Runtime.getRuntime() 알고있다. availableProcessors를() 함수, 내가 찾고있어. 나는 1 살 서버에서 실행하고있어 경우

  • , 나는 2 개 스레드 수 (1 실 :

    나는 조정이 스레드 풀의 크기 있도록하는 자동 방법이 있는지 확인하려면 CPU 당 x 임의 배수 2)

  • 2 년 후 Intel i7 쿼드 코어로 전환하면 (코어 당 2 개의 스레드 지원), 16 개의 스레드 (CPU 당 2 개의 논리적 스레드 x 4 개의 CPU x)를 얻을 수 있습니다 2의 승수).
  • 대신 코어 당 8 개의 스레드를 지원하는 8 코어 Ultrasparc T2 서버를 사용하는 경우 128 스레드 (CPU 당 8 개의 스레드 x 8 개의 임의의 승수 x 2)를 얻습니다.
  • 서로 다른 30 대의 컴퓨터 클러스터에서 동일한 소프트웨어를 구입했는데, 다른 해에 구입했을 경우 CPU 사양을 읽고 각 옵션마다 구성 옵션을 설정할 필요가 없습니다.

답변

1

CPU는 일반적으로 스레드 수에 제한을 두지 않으며, Java 자체가 스폰 할 원시 (커널) 스레드 수에 제한이 없다고 생각합니다.

런타임 클래스에 availableProcessors() 메소드가 있습니다. 그게 당신이 찾고있는거야?

+0

32k의 범위에 (Java가 부과하는) 하드 제한이있는 곳을 읽었습니다. 현실적으로 앱은 오래 전에 중단 될 것입니다. –

+0

네, 아마도. Java는 수천 개의 스레드를 사용하도록 설계되지 않았습니다. – JesperE

+0

한계를 말하면 실제 하드웨어 동시성과는 달리 에뮬레이션 된 동시성을 말합니다. 그렇지 않은가요? – Leo

19

비 하이퍼 스레딩 단일 CPU 코어는 항상 하나의 스레드를 실행할 수 있습니다. 많은 스레드를 생성 할 수 있으며 CPU가 스레드를 전환합니다.

최상의 숫자는 작업에 따라 다릅니다. CPU 사용량이 많고 I/O (pi, 소수 등 계산)가 필요하지 않은 작업 인 경우 CPU 당 1 개의 스레드가 가장 적합 할 것입니다. 작업이 더 많은 I/O 바운드 인 경우. 디스크에서 정보를 처리하는 것처럼 CPU 당 스레드가 두 개 이상 있으면 성능이 향상됩니다. 이 경우 CPU가 이전 디스크 읽기의 정보를 처리하는 동안 디스크 액세스가 발생할 수 있습니다.

상황에 따른 성능이 CPU 코어 당 스레드 수와 어떻게 비례하는지 테스트하고 그 결과에 따라 결정할 것을 제안합니다. 그런 다음 응용 프로그램이 실행되면 availableProcessors()을 확인하고 생성해야하는 스레드 수를 결정할 수 있습니다. 하이퍼 스레딩을 사용하면 단일 코어가 운영 체제 및 모든 응용 프로그램 (예 : availableProcessors())을 2 CPU로 간주하므로 응용 프로그램에서 하이퍼 스레딩을 사용할 수있는 경우 이점을 얻을 수 있습니다. 그렇지 않다면 성능은 다소 저하되지만 아마도 가치있는 서비스를 제공하기에 충분한 노력을하지는 못할 것입니다.

+0

이미 availableProcessors를 사용하여 CPU 수를 얻고 있습니다. 인텔의 HT 또는 다른 멀티 스레딩 기술을 사용할 수있는 경우이를 활용할 수 있도록 내 스레드 풀의 크기를 조정하는 것이 좋습니다. – Leo

+5

Intel HT는 availableProcessors에서 반환 된 값으로 표시됩니다. HT가있는 듀얼 코어 CPU를 사용하는 경우 availableProcessors는 4를 반환합니다. – pipTheGeek

+0

사용 가능한 프로세서에 대한 유료 투표는 코어가 아닌 스레딩 경로의 수를 반환합니다.OS 도구조차도 사용 내역에서 Windows 작업 관리자를 확인하고 하이퍼 스레딩이있는 2 개의 코어에 대해 4 개의 CPU가 있음을 알 수 있습니다. 리눅스에서 동일한 정보를 볼 수 있으며 JVM은 네이티브 스레드를 사용하므로 (거의 모든 구현에서) Java는 OS와 동일한 것으로 생각할 것입니다. – PSIXO

0

이것은 VM이 아니라 CPU의 기능입니다. 스레드 당 소비되는 힙의 양과 관련이 있습니다. 힙 공간이 부족하면 완료됩니다. 다른 포스터와 마찬가지로, 스레드 수 때문에 힙 공간을 초과하면 앱이이 시점 이전에는 사용할 수 없게 될 것으로 판단됩니다.

이 부분은 discussion을 참조하십시오.

1

기본 사항 : 메모리에로드 된 응용 프로그램은 프로세스입니다.프로세스에 적어도 스레드이 있습니다. 원하는 경우 프로세스에서 원하는만큼 스레드를 생성 할 수 있습니다 (이론적으로). 따라서 스레드 수는 사용하는 알고리즘과 알고리즘에 따라 다릅니다.

스레드 풀을 사용하는 경우 스레드 생성은 리소스를 소비하므로 스레드 풀은 스레드 풀을 관리한다는 의미입니다. 스레드 풀은 스레드를 재활용합니다. 즉, 많은 논리적 쓰레드가 하나의 물리적 쓰레드 내에서 하나씩 실행될 수 있습니다.

스레드 수 알고리즘을 개로 생각하지 않아도 스레드 풀 알고리즘으로 관리됩니다. 스레드 풀은 서버 및 데스크탑 컴퓨터 (OS)에 대해 서로 다른 알고리즘을 선택합니다.

EDIT1가 : 당신은 명시 적으로 스레드을 사용할 수 있습니다 당신이 스레드 풀은 당신이 가지고있는 자원을 사용하지 않는 생각합니다. 이 경우 명시 적으로 스레드 수를 관리 할 수 ​​있습니다.

+0

코어 당 2 개의 논리적 스레드 (Sun T2의 경우 코어 당 8 개의 스레드)를 인텔 ® i7이 요구한다고해서 멀티 코어 하드웨어가 제공하는 것 이상으로 멀티 스레드 응용 프로그램에 어떠한 이점도 제공하지 못합니까? 이것이 모든 CPU 제조업체에게 해당되는 경우 availableProcessors() 만 있으면됩니다. – Leo

+0

코어 시스템 당 8 스레드에서 실행될 때 내 응용 프로그램이 코어 당 2 스레드만으로 해결 될 것이라고 생각하기 어렵습니다. – Leo

+0

스레드 수를 고려해야합니다. 대부분의 스레드 풀 (많은 응용 프로그램 서버, 기본 제공 Java ExecutorService)은 상위 스레드 바인딩을 명시 적으로 구성해야합니다. – erickson

1

각 프로세서 또는 프로세서 코어는 한 번에 정확히 한 가지 작업을 수행 할 수 있습니다. 하이퍼 스레딩을 사용하면 상황이 조금씩 달라 지지만 대부분 여전히 그렇습니다. HT 기계가 거의 50 %를 넘지 않으며, 100 % 일 때도 한 번에 두 배의 처리 속도를 내지 못합니다 .

각 CPU에서 실행할 스레드 수를 결정하기 위해 배포 할 공통 아키텍처에 대한 테스트를 수행하면됩니다. I/O가 많은 것을 기다리고 있다면 스레드를 1 개만 사용하면 속도가 너무 느려질 수 있습니다. 많은 스레드를 실행하면 프로세서가 스레드를 더 자주 전환해야하기 때문에 작업 속도가 느려지므로 비용이 많이 듭니다. 얼마나 많은 스레드를 실행할 수 있는지에 대한 하드 코딩 된 제한이 있는지 확실하지 않지만 모든 종류의 하드 제한에 도달하기 전에 응용 프로그램이 너무 많은 스레드 전환에서 크롤링 될 가능성이 있습니다. 궁극적으로, 구성 파일에 옵션으로 남겨 두어 실행중인 프로세서에 맞게 응용 프로그램을 쉽게 조정할 수 있습니다.

+0

코어 당 두 개의 스레드를 지원한다고 주장하는 CPU에서 실제로 2 개의 Java 스레드를 동시에 실행할 수 없다면 이상한 점이 있습니다. CPU 제조업체의 주장에 대한 나의 이해가 잘못 되었습니까? – Leo

4

Java에서 CPU 코어 당 지원되는 스레드 수를 얻는 표준 방법은 없습니다. 최선의 방법은 프로세서 정보를 제공하는 Java CPUID 유틸리티를 얻은 다음 프로세서가 "실제"컨텍스트 전환없이 관리하는 코어 당 스레드 수를 생성해야하는 테이블과 비교하는 것입니다.

-Adam

+0

내가하고있는 모든 인터넷 검색에서 사실 그럴 것 같습니다. ( CPUID 유틸리티 아이디어에 감사드립니다. 이상적이지는 않지만 원하는대로 충분히 근접합니다. – Leo

23

Runtime.availableProcessors 논리 프로세서의 수 (즉, 하드웨어 스레드) 물리적 인 코어를 반환한다. CR 5048379을 참조하십시오.

+0

아 완벽한 사이트! 그냥 내 하루를 만들었습니다 :) – Leo

+10

@ 레오 그때 그의 대답을 수락 ... – rana

관련 문제