2010-04-08 2 views
3

인 메모리 데이터 모델을 시작하고 생성 한 다음 입력 세트 및 해당 데이터 모델에 대해 여러 문자열 검사 알고리즘을 실행하는 (명령 줄에서 지정한) 스레드 수를 작성하는 프로그램이 있습니다. 작업은 입력 문자열 세트의 스레드 사이에서 나누어지고 각 스레드는 동일한 메모리 내 데이터 모델 인스턴스를 반복합니다 (다시 업데이트되지 않으므로 동기화 문제가 없습니다).내 멀티 스레드 Java 프로그램이 내 컴퓨터의 모든 코어를 초과하지 않는 이유는 무엇입니까?

저는 쿼드 코어 프로세서 2 개가 장착 된 Windows 2003 64 비트 서버에서이 작업을 수행하고 있으며, Windows 작업 관리자를 보면 최대 초과 작업이 수행되고 있지 않으며 (특히 세금이 부과 된 것처럼 보이지 않습니다) 내가 10 개의 스레드를 실행할 때. 이것은 정상적인 행동입니까?

7 개의 스레드가 모두 유사한 양의 작업을 완료하는 것으로 보입니다. 대신 7 개의 스레드로 실행하는 것이 좋습니다.

더 많은 스레드로 실행해야합니까? ... JVM이 스레드간에 더 많은 컨텍스트 전환을 수행하므로 이것이 해로울 수 있다고 가정합니다.

또는 적은 수의 스레드로 실행해야합니까?

또는 이것을 측정하는 데 사용할 수있는 가장 좋은 도구는 무엇입니까? ... 프로파일 링 도구가 여기에서 나를 도와 주겠습니까? 실제로 병목 현상을 감지하는 데있어 여러 가지 프로파일러 중 하나입니다 (여기에 하나 있다고 가정) 나머지보다?

참고로 서버는 SQL Server 2005도 실행 중이지만 (관련성이있을 수도 있고 그렇지 않을 수도 있음) 프로그램을 실행할 때 그 데이터베이스에서 아무런 변화가 없습니다.

또한 스레드는 문자열 일치 만 수행하고 기다리는 데 필요한 I/O 또는 데이터베이스 작업을 수행하지 않습니다.

+3

정말 쿼드 코어입니까, 아니면 HT가있는 4 개의 논리 프로세서입니까 (각각 2 개의 스레드가있는 2 개의 코어)? – Lucero

+0

@Lucero, 어떻게 알 수 있습니까? 이 서버는 2 개의 Xeon E5320 1.86 GHz 칩이 장착 된 IBM X3400입니다. 나는 그들이 쿼드 코어라고 믿고, 나는 또한 위키 백과 (http : //en.wikipedia)를 보았습니다.org/wiki/Xeon - 그걸 확인해 봤지만 다행스럽게 입증 될 것 같아. –

+1

그 사람들이 E5320이라면 HT 지원이없고 내 의견은 중요하지 않다. HT를 사용하면 CPU는 기본적으로 코어 당 두 개의 스레드 컨텍스트를 유지하므로 스레드가 멈 추면 (예 : 메모리 액세스 등) 다른 구성 요소의 코어를 사용할 수 있으며 HT 구성의 순수한 계산 능력이 두 개의 실제 코어 – Lucero

답변

2

실제 코드를 보지 않고 적절한 조언을하는 것은 어렵습니다. 그러나 스레드가 공유 리소스에 대해 잠금을 설정하지 않도록하십시오. 그러면 자연스럽게 모든 리소스가 가능한 효율적으로 작동하지 않을 수 있습니다. 또한, 그들이 어떤 io도하지 않는다고 말하면 입력을 읽지 않거나 출력을 쓰지 않습니까? 이것은 또한 병목 일 수 있습니다.

CPU 집약 스레드와 관련하여 실제 코어보다 많은 스레드를 실행하는 것은 일반적으로 좋지 않지만 이와 같이 제어되지 않는 환경에서 동시에 실행되는 다른 큰 응용 프로그램과 마찬가지로 단순히 테스트하는 것이 좋습니다. 최적의 스레드 수를 얻을 수 있습니다.

+0

@ kasperjj - 충분히 간단합니다, 코드는 간결한 예제를 보여주기 위해 분리하기가 약간 어렵습니다. 스레드는 결국 개별 출력에 파일을 작성합니다 스레드 당 파일),하지만 이것은 매우 적은 IO입니다. 내가 지정한 명시 적 동기화없이 스레드가 공유 리소스를 잠글 수있는 메커니즘이 있습니까? –

+1

공유 결과 파일과 같은 것을 특별히 생각하고 있었지만 분명히 covered :-) Vect와 같은 동기화 된 데이터 구조를 사용하지 않도록 할 수도 있습니다 또는. – kasperjj

+0

덕분에, 배열, Sets 및 ArrayLists를 사용할 수 있습니다. –

5

내 생각에 앱이 메모리 액세스에서 병목 현상이 발생하는 것 같습니다. 즉 CPU 코어가 데이터를 메인 메모리에서 읽을 때까지 기다리는 데 대부분의 시간을 소비합니다. 나는 프로파일 러가 이런 종류의 문제를 얼마나 잘 진단 할 수 있는지 확신하지 못한다. (프로파일 러 자체가 그 행동에 상당한 영향을 줄 수있다.) 아주 작은 데이터 세트에서 여러 번 반복되는 작업을 코드가 반복하도록함으로써 추측을 확인할 수 있습니다.

이 추측이 맞으면 메모리 대역폭이 더 많은 서버를 얻는 것 외에는 할 수있는 일은 캐시를보다 효율적으로 사용하기 위해 메모리 액세스의 지역성을 높이는 것입니다. 가능하지 않을 수도있는 응용 프로그램의 세부 사항에 따라 다릅니다. 실제로 캐시 메모리를 공유하는 코어로 인해 더 많은 스레드를 사용하면 성능이 저하 될 수 있습니다.

+0

B 씨와 마찬가지로, 당신은 나에게 약간 생각하고 소화 할 무언가를 주셨습니다. 감사합니다! –

+0

@Michael이 경우 스레드가 메모리를 공유 할 수있는 유일한 지점은 공유 데이터 세트입니다. 문자열을 각 스레드에 배열 목록으로 제공 할 때 문자열을 복제하면 (또는 상수 풀에서 동일한 참조가 아닌지 확인하기 위해 'new String (inputString)'을 수행 했더라도) 병목 현상을 제거 할 수 있습니까? –

+0

@James B : 아니요. 그러면 스레드가 서로의 데이터 세트 복사본을 캐시 밖으로 밀어 내면 문제가 악화됩니다. 동기화가 필요하지 않는 한 공유 데이터 세트는 * good *입니다. –

관련 문제