2

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

내 문제는 때로는 프로그램을 실행할 때 아주 좋은 속도를 얻고 때로는 똑같은 것을 실행하면 매우 느리게 실행된다는 것입니다. 느리게 실행되고 Ctrl-C가 표시되고 다시 시작되면 일반적으로 다시 실행되기 시작합니다. 그것은 실행 중 초기에 느린 모드 나 빠른 모드로 설정되어 모드간에 절대로 전환하는 것처럼 보입니다.

jconsole에 연결했는데 메모리 문제가없는 것 같습니다. 천천히 실행되면서 프로파일 러에 연결을 시도했지만 프로파일 러가 연결되지 않습니다. 나는 -Xprof를 사용하여 실행을 시도했지만 느린 실행과 빠른 실행 사이의 덤프는별로 다르게 보이지 않는다. 나는 다른 가비지 콜렉터를 사용하고 메모리 공간의 여러 부분을 다르게 시도했다.

내 컴퓨터는 스트라이프 RAID 파티션이있는 Mac Pro입니다. 쓰레드가 디스크에서 읽는 데 너무 많은 시간을 소비한다면 CPU 사용량이 천천히 또는 빠르게 실행되는지 여부가 결코 떨어지지 않으므로 디스크 읽기 문제 일 수 있다고 생각하지 않습니다.

내 질문에 내 코드의 어떤 유형의 문제가 발생할 수 있습니까? 아니면 이것이 OS 문제 일 수 있습니까? Windows 컴퓨터에서 복제 할 수 없었지만 유사한 RAID 설정을 사용하는 Windows 컴퓨터가 없습니다.

+0

"java -server"로 실행 해 봅시다. 아마 JIT를 사용하지 않기로 선택했을 수도 있습니다. 다른 스레드가 다른 프로세서/코어에서 실행되는지 어떻게 확인할 수 있습니까? –

+1

@Piligrim, 그는 기본적으로 64 비트 Java 6이 포함 된 Mac OS X Snow Leopard를 사용하고 있으며 이미 서버 버전을 사용하고 있습니다. JVM이 무작위로 JIT를 사용하지 않기로 결정한다면 실제로 이상 할 것입니다. – Jesper

+0

그래, 분명히 서버를 대체하는 -d64를 사용하고 있습니다. – javajustice

답변

1

무한 루프가 된 스레드가있을 수 있습니다.

VisualVM으로 연결하고 스레드 모니터를 사용하십시오.

https://visualvm.dev.java.net

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

+0

Im은 프로그램이 천천히 실행될 때에도 여전히 끝내고 올바른 출력을주기 때문에 무한 루프에 빠지지 않을 것이라고 확신합니다. – javajustice

+0

하지만 시각적 인 VM을 시도하고 어떤 것이 있는지 확인해 주셔서 감사합니다. – javajustice

+0

나는 visualvm의 쓰레드를 살펴 보았고, 그들 중 어느 것도 블로킹을 시도하지 않았다. 그들은 모두 잘 돌아가고 있다고 말한다. CPU 프로파일 링을 수행하면 결과가 이상합니다 ..이 프로그램은 산발적으로 만 업데이트되며 프로그램이 빠르든지 느리게 실행되는지에 관계없이 무의미한 결과를 제공합니다. cpu 프로파일 러를 실행하면 항상 "느린 모드"에서 프로그램을 노크 할 수 있습니다. – javajustice

1

스레드 뷰를보고있는 프로파일 러 (스레드 수, 상태, 등등)를 사용하여 수행해야하는 작업보다 두 번째로 어려운 상황이 발생할 수 있습니다. 프로파일 러 후크 (느려짐의 원인이되는)를 사용하여 클래스를 계측하고 경쟁 조건을 분류하면 첨부 된 프로파일 러에서 속도 저하가 보이지 않을 수도 있습니다./

this post을 보거나 대답, 거기에 언급 된 캐시 경합 문제가 있습니다.

매번 동일한 스레드 수를 산란합니까? 이 숫자는 플랫폼에서 사용할 수있는 스레드 수보다 작거나 같습니까? 이 숫자는 공정한 정확성을 가지고 점검되거나 게스트 될 수 있습니다.

finidngs를 게시하십시오!

+0

프로그램은 n 차원 매개 변수 공간을 입력으로 가져 와서 각 스레드에 대해 상수 주어진 청크 수로 나눕니다. 이 경우 16 개의 논리 프로세서가 있으므로 15 개의 청크를 사용합니다. 스레드는 거의 완전히 독립적입니다. 그들은 동일한 데이터 파일 세트에서 읽지 만 각자는 자체 채널을 가지고 데이터 파일을 별도로 작성합니다 (매개 변수 공간의 각 포인트마다 하나씩). 유일한 공유 메모리는 초기화되지 않은 일부 정적 정적 배열입니다. 스레드 중 하나가 상수를 찾으려고 할 때 먼저 스레드가 상수인지 확인합니다 ... – javajustice

+0

... 계산되고 그렇지 않으면 배열을 계산합니다. 그래서 여기에 여러 스레드가 동시에 배열에 액세스 할 것이지만 액세스가 동기화되지 않고 배열에 대한 모든 수정 사항이 원자 적입니다. 필자는 편의상 15 개의 개별 프로세스에서 실행할 수있는 프로세스를 하나의 프로세스로 실행하고 있습니다. – javajustice

1

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

+0

재미 있습니다. 새로운 Nehalem 칩에서 TurboBoost와 관련이있을 수 있습니까? 그것은 매우 이상한 속도로 느려지는 동안 여전히 동일한 수준의 CPU 사용량을 보여줍니다. – javajustice

+0

온도가 낮아서 조절이 어려워 지긴하지만, 때로는 빠르게 실행되는 프로세스가 느려지거나 그 반대의 경우가 발생하기도합니다. 이것은 결코 일어나지 않는다. 프로세스는 항상 처음부터 빠르거나 느려지므로, visualvm을 연결하고 cpu 프로파일을 시작하면 느린 모드를 빠져 나올 수 있습니다. – javajustice

1

가끔 프로그램이 디스크로 페이징되는 경우가 있습니까? 이 경우 프로그램이 아닌 운영 체제의 메모리 사용량을 전체적으로 살펴볼 필요가 있습니다. 나는 경험을 통해 메모리가 지속적으로 디스크에 페이징되고 돌아올 때 런타임 성능에 커다란 차이가 있음을 안다.

OSX에 대해서는 많이 알지 못하지만 리눅스에서는 "무료"명령이이 목적에 유용합니다.

이 속도 저하를 일으킬 수있는 또 다른 문제는 로그 파일입니까? 적어도 로그 파일이 증가함에 따라 시스템 속도가 느려지는 일부 로깅 코드를 알고 있습니다. 크기가 커지는 로그 파일에서 스레드가 동기화되고 프로그램을 다시 시작할 때 다른 로그 파일이 사용되는 경우 일 수 있습니다.

+0

나는이 문제를 의식하려고 노력했다. 내 컴퓨터는 32G의 메모리를 가지고 있으며 프로세스를 16G의 최대 힙을 사용하는 것으로 제한하고 프로세스는 일반적으로 8G를 초과하지 않는다. 따라서 페이징하지 않아야하지만, 다음 번에 스왑 사용을 모니터링 할 무언가를 찾을 버그를 재현합니다. – javajustice

+0

나는이 문제를 reporduced했고, 적어도 mac os 활동 모니터에 따르면, 페이지 파일을 치는 것이 분명하지 않다. – javajustice

관련 문제