IBM JVM의 경우 UNIX / LINUX 환경과는 달리 Windows 환경에서 Native 메모리로 인한 문제가 자주 발생합니다.
이는 어플리케이션에서 기인하는 Leak 이나 High Heap Usage 가 아닌 Windows O/S 의 특성과 IBM JVM의 특성에서 기인하는 문제로 어플리케이션이 아닌 WAS 와 JVM Parameter 를 수정하는 방향으로 접근하여야 합니다.
증상
- GC 수행내역은 정상적이나 외부적인 요인으로 인해 OutOfMemory Exception 발생
- Windows 작업관리자를 통해 보는 Java Process 메모리 사용량이 비정상적으로 높음 (예: Xmx=1024m 을 설정한 상태지만 Process 메모리가 2 ~ 3G 씩 사용되는 경우)
환경
- WebSphere 6.0.2, 6.1, 7.0 on Windows OS
처리방안
1. 32bit JVM 의 경우 Max Heap Size 를 1280m 이상 사용하지 말것, 이 이상 필요한 경우 64bit OS 와 64bit JVM 을 사용해야 함
- 32bit Windows 의 경우 하나의 Process가 핸들 할 수 있는 최대의 메모리가 2G 이며, 이를 넘는 경우 문제가 발생하므로 64bit OS 및 JVM 사용을 권장
2. WebContainer DirectByteBuffer 사용
- WebSphere 의 경우 파일 다운로드, 대용량 이미지 전송시에 WebContainer Buffer 를 Native Memory에 저장하므로 Nativer Memory 사용률을 줄이기 위해 DirectByteBuffer 를 사용할 것을 권장
- http://www-01.ibm.com/support/docview.wss?uid=swg21317658
Servers -> Application Servers -> serverName -> Web Container Settings -> Web Container -> Custom Properties:
Press New:
Add the following pair:
Name: com.ibm.ws.webcontainer.channelwritetype
Value: sync
Press OK, and then save the configuration.
The application server must be recycled to pick up the property.
3. Asynchronous Input/Output 사용하지 않음
- AIO 기능은 대량의 Native Memory리 사용을 필요로 하므로 Native Memory Issue 가 있는 경우 이 기능을 사용하지 않도록 권장
- http://www-01.ibm.com/support/docview.wss?uid=swg21366862
install_root/bin 에서
move ibmaio.dll ibmaio.dis
move ibmaiodbg.dll ibmaiodbg.dis
4. WAS Thread Pool 수치를 최소값, 최대값을 동일하게 설정
- Thread Pool을 생성하고 해제하는 과정에서 ThreadLocal leak 및 native memory leak 을 유발할 수 있으므로 최소, 최대 Thread Pool 수를 동일하게 설정
- Native Memory Leak 문제가 없는 경우에는 권장하지 않음.
- http://www-01.ibm.com/support/docview.wss?uid=swg21368248
Web container thread pool:
In the administrative console click Servers > Application Servers > server_name.
Near the bottom of the page, open Additional Properties, Thread Pools.
Click on WebContainer.
Change the Minimum Size field to whatever the Maximum is set to, probably 50.
Ensure that the "Allow thread allocation ?" checkbox is not checked.
Click OK and then save the configuration.
The application server will need to be restarted for the setting to take effect.
Default thread pool:
In the administrative console click Servers > Application Servers > server_name.
Near the bottom of the page, open Additional Properties, Thread Pools.
Click on Default.
Change the Minimum Size field to whatever the Maximum is set to, probably 30.
Ensure that the "Allow thread allocation ?" checkbox is not checked.
Click OK and then save the configuration.
The application server will need to be restarted for the setting to take effect.
댓글 없음:
댓글 쓰기