문제

프로덕션 환경에 약 1000~2000개의 스레드가 있는 멀티 스레드 웹 애플리케이션이 있습니다.

CPU 사용량은 다음과 같을 것으로 예상됩니다. w3wp.exe 하지만 System Idle Process CPU를 먹습니다.왜?

도움이 되었습니까?

해결책

유휴 프로세스는 실제로 실제 프로세스가 아니며 CPU 시간을 "먹지 않음"하지 않습니다.옆에있는 % CPU는 실제로 사용되지 않는 % CPU (다소도)

응용 프로그램의 불량품 성과가 발생한 이유는 2000 개의 스레드로 인해 가장 가능성이 큽니다.Windows (또는 실제로 모든 운영 체제)는 한 번에 많은 스레드를 실행할 수 없었습니다.대부분의 시간을 낭비하고 있습니다. ~ 30 초 (15ms * 2000= 30sec !!!!!!!)마다 2 밀리 초의 처리 시간을 얻는 것만으로 대부분의 시간을 낭비합니다.

응용 프로그램을 다시 린크합니다.

다른 팁

유휴 프로세스는 프로그램이 필요할 때까지 프로세스 시간을 보유하고 있으며, 실제로 모든 사이클을 먹지 않는 것이 아닙니다.시스템 유휴 시간을 '사용 가능한 CPU'로 생각할 수 있습니다

System Idle Process가 실제 프로세스가 아니며 사용되지 않는 프로세서 시간을 나타냅니다.

이것은 앱이 프로세서를 완전히 사용하지 않는다는 것을 의미합니다. 이는 메모리 바인딩 또는 CPU 바인딩 일 수 있습니다.아마도 스레드가 서로를 기다리거나 외부 자원을 기다리고 있습니까?컨텍스트 전환 오버 헤드는 또한 2000 코어가없는 경우에도 스레드가 실제로 실제로 모두 실행되지 않지만 작업 스케줄러에 의한 시간 조각이 할당 된 시간이 아닙니다.

자세한 내용을 알려주지 않으셨기 때문에 현재로서는 추측만 할 수 있을 뿐입니다.나는 대부분의 스레드가 아무것도 하지 않을 가능성이 높다고 말하고 싶습니다.무언가를 하고 있는 것은 아마도 IO 바운드일 것입니다. 즉, 외부 리소스의 응답을 기다리는 데 대부분의 시간을 소비하고 있다는 뜻입니다.

이제 "1000~2000 스레드"에 대해 이야기해 보겠습니다.그렇게 많은 스레드를 갖는 것이 좋은 경우는 거의 없습니다(아마도 없을 수도 있습니다).현재 문제가 그 이유에 대한 완벽한 예라고 생각합니다.대부분의 스레드는 (어쨌든) 자원 낭비만 하고 있습니다.여러 작업을 병렬로 처리하려는 경우, 특히 IO 바인딩된 경우 다음과 같은 풀링된 리소스를 활용하는 것이 좋습니다. ThreadPool 또는 작업 병렬 라이브러리.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top