성능 문제를 분석 중이며 잠재적으로 최대 500 개의 작업 스레드가있을 수 있으며 CPU 사용량은 그리 높지 않습니다. 컨텍스트 스위치로 높은 CPU가 발생할 수 있습니까? 즉, CPU 사용률이 높지 않으므로 여기서는 컨텍스트 전환 (500 스레드)이 문제가되지 않습니다.컨텍스트 스위치로 높은 CPU가 발생할 수 있음
답변
프로그래밍이 과도한 컨텍스트 전환을 강제하는 경우에만. 운영 체제의 스케줄러는 성능 향상에 유리하다고 생각되면 컨텍스트 전환 만 수행합니다. 스케줄러는 매우 똑똑하고 가능한 경우 성능에 부정적인 영향을주지 않도록 컨텍스트 스위치 수를 제한합니다.
그러나 프로그래밍이 좋지 않으면 스케줄러가 수행 할 수 없으므로 과도한 컨텍스트 전환이 발생할 수 있습니다.
예를 들어 코어 1 개와 스레드 500 개가 있다고 가정 해보십시오. 각각의 500 개 스레드가 많은 작업을 시도하면 스케줄러는 컨텍스트 스위치의 총 오버 헤드가 현저히 높지 않도록 합당한 시간 동안 각 스레드를 실행하게합니다. 이러한 스레드 중 일부는 매우 높은 대기 시간을 볼 수 있지만 각 스레드는 컨텍스트 스위치가 성능을 저하시키지 않을 정도로 오래 실행됩니다.
하지만 스케줄러가 첫 번째 스레드 스케줄을 작성한 다음 몇 가지 지침 만 수행하면 스레드가 더 이상 실행할 준비가되지 않는다고 가정 해보십시오. 이제 스케줄러는 컨텍스트를 전환 할 수 밖에 없습니다. 다음 스레드가 매우 짧은 시간 동안 만 다시 실행되고 더 이상 실행할 준비가되지 않으면 다른 컨텍스트 전환이 강제됩니다. 그러면 성능이 저하됩니다.
강제 컨텍스트 전환이 잘못되었습니다. 컨텍스트 스위치는 수행하도록 스케줄러를 선택하는 것이 좋습니다.
David 많은 분들께 감사드립니다. 귀하의 의견은 매우 유익합니다. – goodier
예, 컨텍스트 스위칭 은 일 수 있으므로 성능 문제가 발생하지만 적절한 디자인으로 인해 문제가되지 않을 수 있습니다. 일반적으로 말하자면, 코어를 사용할 수있는 것보다 "실행 가능한"스레드를 한 번에 여러 개 갖는 것이 대단히 효율적이지는 않습니다. 여러 스레드가 발생하는 것을 차단하면 성능이 향상 될 수 있습니다 (I/O는 일반적인 예입니다) 하지만 많은 수의 작업을 완료하려는 경우 코어 당 한 번에 하나의 작업 만 실행하면 더 효율적입니다 (컨텍스트 스위치가 줄어들고 메모리 오버 헤드가 줄어 듭니다). 따라서 ExecutorService
은 유용합니다. 모든 작업을 대기열로 보내고 스레딩의 메커니즘에 대해 걱정할 필요가 없습니다.
- 1. 메모리 누수가 발생할 수 있음
- 2. 컨텍스트 스위치로 사용할 수있는 모드 스위치가 있어야합니까?
- 3. 드라이브 API 호출에서 예외가 발생할 수 있음
- 4. 버퍼 오버플로 문제가 발생할 수 있음
- 5. Talend 작업에서 잠금 문제가 발생할 수 있음
- 6. PostgreSQL 텍스트 열의 고유 인덱스 - 높은 CPU로드가 발생할 수 있습니까?
- 7. C 프로그래밍으로 처리되지 않은 win32 예외가 발생할 수 있습니다 (strlen 함수에서 발생할 수 있음).
- 8. 유휴 ServiceHost의 높은 CPU가 Azure 서비스 버스 릴레이에 연결됨
- 9. AccountManager의 계정 추가로 교착 상태가 발생할 수 있음
- 10. 일반 JSP 사이트에서 메모리 누수가 발생할 수 있음
- 11. windows에서 파일을 복제 할 때 슬래시가 발생할 수 있음
- 12. AutomationElement 클래스를 사용하는 동안 메모리 누수가 발생할 수 있음
- 13. 스마트 포인터를 사용하여 메모리 누수가 발생할 수 있음
- 14. MPMoviePlayerController 비디오를 반복 할 때 스레드 문제가 발생할 수 있음
- 15. iOS에서 압축 sqlite 데이터베이스를 동기화하여 앱 거부가 발생할 수 있음
- 16. 활성 모니터에서 QPixmap 누수가 발생할 수 있음 Mac OS X
- 17. 디스크에서 여러 번 읽는 중 병목 현상이 발생할 수 있음
- 18. 배열에서 일치하는 단어로 인해 일부 취약점이 발생할 수 있음
- 19. 비동기 연결 완료 핸들러에서 dispatch_async로 교착 상태가 발생할 수 있음
- 20. Entity Framework에서 많은 메모리를 사용합니다 (메모리 누수가 발생할 수 있음)
- 21. 비트 맵을 생성 할 때 메모리 누수가 발생할 수 있음
- 22. 거래 응용 프로그램 (Django)에서 보안 문제가 발생할 수 있음
- 23. Python 패키지 (PyMySQL3)에서 MySQL 인증 문제가 발생할 수 있음
- 24. 임의로 값 분포가 발생할 가능성이 있음
- 25. amazon AWS RDS에서 언제 높은 메모리와 CPU가 필요합니까?
- 26. 높은 CPU, 컨텍스트 전환으로 인한 것일 수 있습니까?
- 27. 클래스 컨텍스트 내의 call_user_func ($ this가 정의되어 있음)
- 28. 라우터를 "순수한"스위치로 사용할 수 있습니까?
- 29. 스위치로 간신히 네트워크를 구성 할 수 있습니까?
- 30. getopts를 사용하여 문자열을 스위치로 사용할 수 있습니까?
이 질문은 너무 광범위하여 유용하지 않습니다. 문제를 해결하기 위해 무엇을 더 자세하게 설명 할 수 있습니까? 이것은 이론적 인 학문적 문제입니까? – chrylis
이것은 우리가 개발 한 실제 성능 문제입니다. 두 개의 스레드와 컨텍스트 전환으로 인해 성능 문제가 발생할 수있는 경우 사람들은 의심스러워합니다. 그래서 CPU가 높지 않은지 알고 싶습니다. 문맥 전환이 자주 발생하지 않는다고 말할 수 있습니까? – goodier
한마디로, 빈번한 문맥 전환은 비용이 많이 들지만, 그 사실을 알고있었습니다. 여기서 구체적으로 알아볼 필요가 있습니다. – EJP