문제

나는 여러 프로세서에서 조각을 조각하고 다른 스레드에서 각 조각을 실행하여 여러 프로세서에서 일련의 과학적 계산을 수행하기위한 Java 프로그램이 있습니다. 문제는 사소하게 분할 할 수 있으므로 스레드간에 경합이나 의사 소통이 없습니다. 그들이 액세스하는 유일한 공통 데이터는 액세스에 동기화 할 필요가없는 일부 공유 정적 캐시와 하드 드라이브의 일부 데이터 파일입니다. 스레드는 또한 디스크에 지속적으로 쓰기를하지만 파일을 분리합니다.

내 문제는 때때로 프로그램을 실행할 때 속도가 매우 좋으며 때로는 똑같은 일을 실행할 때 매우 느리게 실행된다는 것입니다. 천천히 실행되고 ctrl-c가 다시 시작되고 다시 시작되면 일반적으로 다시 빠르게 실행되기 시작합니다. 실행 초기에 느린 모드 또는 빠른 모드로 설정하고 모드간에 전환하지 않는 것 같습니다.

나는 그것을 jconsole에 연결했고 메모리 문제가 아닌 것 같습니다. 천천히 실행했을 때 프로파일 러를 연결하려고 시도했지만 프로파일 러는 연결되지 않습니다. 나는 -xprof로 달리기를 시도했지만 느린 달리기와 빠른 달리기 사이의 덤프는 크게 다르지 않는 것 같습니다. 나는 메모리 공간의 여러 부분의 다른 쓰레기 수집기와 다른 성형을 사용해 보았습니다.

내 기계는 줄무늬 공습 파티션이있는 Mac Pro입니다. CPU 사용량은 느리게 또는 빠르게 실행 되든 스레드가 디스크에서 읽는 데 너무 많은 시간을 차단하는 경우에 예상 할 수 있으므로 디스크 읽기 문제가 될 수 있다고 생각하지 않습니다.

내 질문은 내 코드에 어떤 문제가 발생할 수 있습니까? 아니면 이것이 OS 문제 일 수 있습니까? Windows A 컴퓨터에서 복제 할 수 없었지만 비슷한 RAID 설정이있는 Windows 시스템이 없습니다.

도움이 되었습니까?

해결책

끝없는 루프로 들어간 스레드가있을 수 있습니다.

VisualVM에 연결하고 스레드 모니터를 사용해보십시오.

https://visualvm.dev.java.net

문제가 발생하기 전에 연결해야 할 수도 있습니다.

다른 팁

나는 당신이 스레드보기를보고 프로파일 러로 그것을 수행해야한다는 것 - 스레드 수, 어떤 상태인지 등의 상태가 될 수 있습니다. 프로파일 러 후크 (둔화를 일으키는)로 클래스를 계측하고 레이스 조건을 정렬하면 프로파일 러가 첨부 된 상태에서 속도가 느려지는 경우도 마찬가지입니다.

살펴보세요 이 게시물, 캐시 경합 문제가 언급 된 경우, 또는 오히려 답변.

매번 같은 실을 뿌리고 있습니까? 그 숫자가 플랫폼에서 사용 가능한 스레드 수를 적거나 같습니까? 그 숫자는 공정한 정확도로 확인하거나 게스트 화 될 수 있습니다.

FINIDNGS를 게시하십시오!

CPU 온도를 측정하는 도구가 있습니까? OS는 온도 문제를 처리하기 위해 CPU를 조절하고있을 수 있습니다.

귀하의 프로그램이 때때로 디스크에 대한 페이징 될 수 있습니까? 이 경우 운영 체제의 메모리 사용량을 프로그램이 아닌 전체로 살펴 봐야합니다. 경험에서 메모리가 지속적으로 디스크와 뒤로 페지 될 때 런타임 성능에 큰 차이가 있다는 것을 알고 있습니다.

나는 OSX에 대해 많이 모르지만 Linux에서 "무료"명령은이 목적에 유용합니다.

이 속도가 느려질 수있는 또 다른 문제는 로그 파일입니까? 로그 파일이 커짐에 따라 시스템을 점차적으로 느리게하는 로깅 코드를 적어도 알고있었습니다. 스레드가 크기가 커지는 로그 파일에 동기화 될 수 있으며 프로그램을 다시 시작하면 다른 로그 파일이 사용됩니다.

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