2013-05-01 1 views
0

단일 코어 시스템이 단일 스레드 만 실행할 수 있다는 가정하에 시작합니다. 이제 Java/Spring 기반의 junit 테스트를 작성하여 20 개의 스레드를 생성하고 BigDecimal을 사용하여 많은 수의 계승을 계산했습니다.jvm이 실행 가능한 상태의 많은 스레드를 처리하는 방법

Visual VM에서 junit를 모니터링했는데 20 개의 스레드 모두가 작동하고 시각적 VM에서 실행 중임 (녹색)으로 표시되는 것을 볼 수 있습니다. 내가 알다시피, jvm은 마치 그들이 모두 실행중인 것처럼 보이게하지만 아주 세분화 된 수준에서 각 스레드는 CPU 사이클을 위해 진행될 것입니다. 시각적으로나 숫자로 모든 스레드가 서로 간섭하고 CPU가 한 스레드에서 다른 스레드로 전환하는 방식이나 도구가 있습니까? 또는 다른 말로하면 주어진 함수를 수행하는 주어진 스레드 수, CPU의 극단적 인 컨텍스트 전환으로 인한 포화 점 또는 감소하는 리턴 수를보고 싶습니다.

해결해야 할 실제 문제는 대형 Java 응용 프로그램에서 스레드를 조정하는 것입니다. 샘플 실행에서 스레드 경합이 표시되지 않으면 큰 응용 프로그램에서도 스레드 경합이나 악용 사례를 볼 수 없습니다.

답변

0

모든 스레드가 서로 간섭하고 CPU가 한 스레드에서 다른 스레드로 전환한다는 것을 시각적으로나 숫자로 증명할 수있는 방법이나 도구가 있습니까?

짧은 대답은 "아니오"입니다. Linux 시스템에서 출력되는 복제 된 프로세스를 보면 어떤 스레드가 실제로 작동하는지 확인할 수 있지만 그 정보를 작성하는 데 필요한 해상도를 얻을 수 있는지는 의심 스럽습니다. 유능한. 그렇다면 Hiezenberg의 문제는 샘플링 속도가 빠르면 모니터링하려는 박스의 성능에 큰 영향을 미칠 수 있다는 것입니다. CPU 시간이 문맥 전환 오버 헤드를 포함 할지라도 각 스레드가 사용되는 CPU 시간을보고 결정을 내릴 수 있습니다.

스레드가 애플리케이션에 무엇인지 알아 내려고한다면 다양한 스레드 풀 크기의 최적 처리량을 결정하기 위해 많은 테스트를 수행하는 것이 좋습니다. 물론 아키텍처를 전환하면 CPU, 코어, 메모리 등에 매우 의존하기 때문에 테스트를 다시 실행해야합니다.

관련 문제