2013-09-22 2 views
1

성능 문제를 분석 중이며 잠재적으로 최대 500 개의 작업 스레드가있을 수 있으며 CPU 사용량은 그리 높지 않습니다. 컨텍스트 스위치로 높은 CPU가 발생할 수 있습니까? 즉, CPU 사용률이 높지 않으므로 여기서는 컨텍스트 전환 (500 스레드)이 문제가되지 않습니다.컨텍스트 스위치로 높은 CPU가 발생할 수 있음

+0

이 질문은 너무 광범위하여 유용하지 않습니다. 문제를 해결하기 위해 무엇을 더 자세하게 설명 할 수 있습니까? 이것은 이론적 인 학문적 문제입니까? – chrylis

+0

이것은 우리가 개발 한 실제 성능 문제입니다. 두 개의 스레드와 컨텍스트 전환으로 인해 성능 문제가 발생할 수있는 경우 사람들은 의심스러워합니다. 그래서 CPU가 높지 않은지 알고 싶습니다. 문맥 전환이 자주 발생하지 않는다고 말할 수 있습니까? – goodier

+1

한마디로, 빈번한 문맥 전환은 비용이 많이 들지만, 그 사실을 알고있었습니다. 여기서 구체적으로 알아볼 필요가 있습니다. – EJP

답변

3

프로그래밍이 과도한 컨텍스트 전환을 강제하는 경우에만. 운영 체제의 스케줄러는 성능 향상에 유리하다고 생각되면 컨텍스트 전환 만 수행합니다. 스케줄러는 매우 똑똑하고 가능한 경우 성능에 부정적인 영향을주지 않도록 컨텍스트 스위치 수를 제한합니다.

그러나 프로그래밍이 좋지 않으면 스케줄러가 수행 할 수 없으므로 과도한 컨텍스트 전환이 발생할 수 있습니다.

예를 들어 코어 1 개와 스레드 500 개가 있다고 가정 해보십시오. 각각의 500 개 스레드가 많은 작업을 시도하면 스케줄러는 컨텍스트 스위치의 총 오버 헤드가 현저히 높지 않도록 합당한 시간 동안 각 스레드를 실행하게합니다. 이러한 스레드 중 일부는 매우 높은 대기 시간을 볼 수 있지만 각 스레드는 컨텍스트 스위치가 성능을 저하시키지 않을 정도로 오래 실행됩니다.

하지만 스케줄러가 첫 번째 스레드 스케줄을 작성한 다음 몇 가지 지침 만 수행하면 스레드가 더 이상 실행할 준비가되지 않는다고 가정 해보십시오. 이제 스케줄러는 컨텍스트를 전환 할 수 밖에 없습니다. 다음 스레드가 매우 짧은 시간 동안 만 다시 실행되고 더 이상 실행할 준비가되지 않으면 다른 컨텍스트 전환이 강제됩니다. 그러면 성능이 저하됩니다.

강제 컨텍스트 전환이 잘못되었습니다. 컨텍스트 스위치는 수행하도록 스케줄러를 선택하는 것이 좋습니다.

+0

David 많은 분들께 감사드립니다. 귀하의 의견은 매우 유익합니다. – goodier

1

예, 컨텍스트 스위칭 일 수 있으므로 성능 문제가 발생하지만 적절한 디자인으로 인해 문제가되지 않을 수 있습니다. 일반적으로 말하자면, 코어를 사용할 수있는 것보다 "실행 가능한"스레드를 한 번에 여러 개 갖는 것이 대단히 효율적이지는 않습니다. 여러 스레드가 발생하는 것을 차단하면 성능이 향상 될 수 있습니다 (I/O는 일반적인 예입니다) 하지만 많은 수의 작업을 완료하려는 경우 코어 당 한 번에 하나의 작업 만 실행하면 더 효율적입니다 (컨텍스트 스위치가 줄어들고 메모리 오버 헤드가 줄어 듭니다). 따라서 ExecutorService은 유용합니다. 모든 작업을 대기열로 보내고 스레딩의 메커니즘에 대해 걱정할 필요가 없습니다.

관련 문제