2012-06-14 2 views
0

"충분한 공간이 없음"이라고 주장하는 IOException을 던지는 원격 Solaris 컴퓨터에서 Tomcat에 Java 웹 앱 (WAR)을 배포했습니다. 문제를 조사하는 데 며칠을 보낸 후 필자는 솔라리스가 시스템 스왑 공간에 부모/자식 프로세스를 배치해야하는 몇 가지 프로세스를 코드에서 수행하는 것을 보았습니다. 그리고 언제나 스왑 공간이 충분하지 않습니다. 두 프로세스를 모두 포함합니다. Here은 내가 할 수있는 것보다 더 웅변/지능적으로 어떤 일이 일어나는지 설명하는 기사입니다. 그러나 그 범인은 틀림 없습니다.JConsole을 사용하여 스왑 공간을 프로파일하는 방법

그래서 스왑 공간을 늘리기 위해 시스템 관리자와 티켓을 넣어야하지만, 필요한 공간이 얼마나되는지 알아 내려고했습니다. JConsole을 사용하여 서버의 메모리 사용량을 프로파일 링 할 수 있지만 VM Summary 탭에서는 JConsole이 시작될 때 스왑 공간이 사용/사용 가능한 정보 만 읽혀지고 새로 고쳐지지 않습니다. 이렇게하면이 forking/memory 문제를 재현하는 동안 JConsole을 사용하여 실시간 스왑 사용을 볼 수 없게됩니다.

내가 액세스 할 수있는 유일한 서버 모니터는 prstat (나는 topnmon에 익숙합니다.)입니다.

시스템에 특정 번호를 부여해야합니다 (예 : ) myserver.net의 스왑 공간을 250M 등으로 늘리십시오. 이 번호는 어떻게 얻을 수 있습니까? 서버가 Java 1.6u25에서 실행 중이므로 내가 모르는 Java 도구가 있거나 사용 가능한 일부 Solaris 프로파일/모니터가있을 수 있습니다.

답변

0

현재 RAM 및 스왑 크기, 실행중인 JVM 수, 힙 크기 및 가상 메모리 사용량 및 이러한 포크 프로세스의 예상 동시 처리 수준과 같은 정보를 제공하면 도움이됩니다. prstat -Z 출력도 도움이됩니다.

어쨌든 swap -s 명령을 사용하여 가상 메모리 사용을 모니터링하고 마지막 값 (... k available)이 항상 충분히 큰지 확인하십시오.

일반적인 신빙성에도 불구하고 스왑 크기가 너무 커야 아무 문제가 없으므로 첫 번째 방법으로 현재 스왑 영역 크기를 두 배로 늘리는 것이 좋습니다.

swap -l 명령으로 현재 스왑 영역 크기를 얻었습니다.

Here은 도움이 될 수있는 Solaris 응용 프로그램 메모리 관리에 관한 기사입니다.

1

종종 스왑 공간을 주 메모리 크기만큼 크게 만듭니다. 따라서 16GB 컴퓨터에는 16GB의 스왑이있을 수 있습니다. (스왑은 주 메모리 크기의 여러 배였습니다.)

Java의 경우 "오프 힙"메모리는 제외하고 모두 물리 메모리에 있어야합니다. 예를 들어 GC를 수행하면 모든 메모리가 검사되고 일부가 스왑 된 경우 응용 프로그램이 한 번에 몇 초 또는 몇 분 동안 중단되기 때문입니다.

응용 프로그램이 더 많은 스왑 공간을 필요로하는 경우 실제로 필요한 것은 더 많은 메인 메모리입니다.

+0

감사합니다. @Peter - 내가 언급 한 기사에 대한 귀하의 의견은 무엇입니까? Thuds는 Hudson 팀에서 곧바로 스왑 공간/VM이 문제가되는 것을 명확하게 지정합니다 ... – IAmYourFaja

+0

스왑 부족으로 인해 오류가 발생합니다. 유휴 프로세스가 많으면 스왑을 늘리는 것이 전부입니다. 대부분의 프로그램을 메모리에 실제로 필요로하고 스왑을 늘리면 오류가 발생하지만 실제 문제는 주 메모리가 부족합니다. –

+0

네, 그렇지만 @Peter는 단순히 내 질문을 강화했습니다! 스왑 공간이 문제라는 것을 이미 알고 있습니다. 추가 할 필요가있는 스왑 크기를 결정하는 방법을 묻습니다. 그리고 티켓을 요청해야하기 때문에 다른 금액을 시험해 볼 수있는 위치에 있지 않습니다. 유사한 "조정"유형 요청이 많은 경우 시스템이 싫어합니다. 계산을 한 번 수행하고 올바르게해야합니다. – IAmYourFaja

관련 문제