본문 바로가기
일/개발, IT정보

WAS DB OS 메모리 Min/Max 동일한 값으로 설정 시

[주제]

- Application의 Min/Max 메모리를 동일한 값으로 설정하는 이점

 

 

[환경]

- WAS (Web Application Server), DB, OS 등…


 

[Preview]

1.     거의 모든 Application(OS, WAS, DB, SOLUTION 등)은 구현 및 성능을 위해 물리메모리(RAM)의 용량 일부분을 할당하여 사용하고 있습니다.

2.     Application은 필수데이터나 빈도가 높은 데이터들을 보조기억장치(Disk, SSD)에서 할당된 주기억장치(RAM)로 적재하여 실행 및 운영을 하고 있습니다.

3.     Application은 할당하는 메모리의 값을 정하는 값 Min(or Initial)과 Max를 설정하도록 되어 있습니다.

4.     Application마다 Default된 Min/Max 값은 다르지만, Max보다 Min이 작게 설정되어 있습니다.

5.     Min/Max 설정 값을 동일하게 설정했을 때 이점을 WAS를 예시로 공유하고자 합니다.

 

 

[개요]

DB와 WAS 같은 Application에서 메모리는 다양한 용도로 사용되지만 그 중 Client에서 요청한 값을 저장하는 공간으로도 활용됩니다. 

 

Client가 요청한 명령을 WEB à WAS à DB 순으로 하달되어 DB에서 관련된 값을 추출하며 

추출된 데이터는 다시 DB à WAS à WEB 순으로 상달되어 Client에 보여주게 됩니다.

 

DB에서 추출된 값은 그 값을 저장하는 공간이 필요하며, 그것이 DB에 할당된 메모리에 저장하게 되고 

프로세스가 진행되면 그 데이터를 WAS에 넘기면서 WAS에 할당된 메모리에 적재되어 집니다.

 

여기서 중요한 점은 요청된 데이터 전체가 할당된 메모리보다 용량이 크면 메모리 공간이 부족하게 되고, 

그로 인해 한계점이 넘어가게 되면 장애가 발생하면서 Application이 종료됩니다. (OutOfMemoryError) 

 

그렇기에 1차적으로 중요한 것은 Application의 메모리 크기를 얼마만큼 설정할지 결정하는 것이 중요합니다

 

시스템의 규모와 데이터 특징 등을 고려해서 메모리 크기를 결정한 후, 본문의 주제를 알아보기 위해 두가지 방법으로 설정한다고 가정해봅시다.

 

1.     설정할 메모리 4GB

A.     Min 4GB, Max 4GB

B.      Min 100MB, Max 4GB

 

 

[메모리 할당 및 할당 해제]

두 가지 사례는 모두 최대 4GB의 용량을 확보할 수 있습니다. 

 

다만 차이점은 Application 시작 시 A의 경우 처음부터 4GB를 확보를 하고 B의 경우는 우선 100MB만 확보합니다.

이전 얘기에 메모리에는 요청된 데이터를 적재한다고 하였습니다. 

만약 적재된 데이터가 100MB 이상이 되어 버리면 어떻게 될까요? 

 

A은 현재 여유 있는 용량으로 인해 아무 문제없지만, 

B의 경우 100MB만 할당된 메모리의 용량을 늘리는 작업을 진행합니다. 

이것은 어플리케이션 성능에 영향을 줄 수 있습니다.

 

또한 어플리케이션은 자원 절약을 위해 일정기간 지난 후 할당을 해제합니다. 

즉, 데이터를 위해 늘렸던 메모리 용량을 사용하지 않으면, 자원절약을 위해 메모리 용량을 축소시킵니다. 

그 작업 또한 성능에 영향을 줍니다.

 

위의 두 가지 작업(할당 및 할당해제)이 성능에 영향을 주게 됩니다. 

아래는 각 시나리오에 대한 메모리 할당 그래프입니다.

 

-       A Min/Max 동일 시 메모리 할당 상태

-       B Min/Max 다를 시 메모리 할당 상태

 

위 그래프처럼 A는 동일한 값을 유지 중이나, 

B는 할당과 할당해제를 반복하며 불필요한 리소스 및 오버헤드가 발생하고 있습니다. 

불필요한 오버헤드를 줄이기 위해 동일하게 설정을 권고합니다.

 

 

[GC 중지 시간 영향]

WAS에는 GC(Garbage Collection)라는 작업이 있습니다. 

GC는 할당된 메모리 내의 데이터 중 불필요한 데이터를 정리하는 작업입니다. 

 

GC 작업으로 인해 부족한 메모리 공간을 확보할 수 있지만, GC의 횟수와 걸리는 시간은 성능과 큰 연관이 있습니다. 

GC가 실행되면 애플리케이션이 일시 중지되어 프로세스가 멈추게 됩니다. 

 

아래는 메모리 설정에 따른 GC 성능결과를 보여줍니다.

 

 

GC 처리량과 GC 일시중지 시간에 약간의 저하가 있음을 확인했습니다. 

 

시나리오 #1에서 GC 처리량은 96.59%인 반면 시나리오 #2에서는 GC 처리량이 약간 더 나은 97.83%였습니다. 

 

마찬가지로 시나리오 #1에서 Max GC의 최대 일시 중지 시간은 5.23초인 반면 시나리오 #2에서는 1.65초에 불과했습니다. 

시나리오 #1이 시나리오 #2에 비해 약 4초간 시스템이 더 멈췄음을 알 수 있습니다.

 

 

[애플리케이션 구동 시간]

초기 메모리 크기를 최대 메모리 크기와 동일하게 설정하면 애플리케이션의 시작 시간도 더 좋아집니다. 

 

다음은 Oracle 설명서에서 발췌한 것입니다.

 

“초기 메모리가 너무 작으면 JVM이 메모리가 적당한 크기로 커질 때까지 자주 GC를 수행해야 하므로 Java 애플리케이션 시작 속도가 느려집니다. 

 최적의 시작 성능을 위해 초기 메모리 크기를 최대 메모리 크기와 동일하게 설정하십시오.”

 

 

[결론]

 이제까지 WAS의 예시로 Min/Max 메모리 설정이 성능에 어떤 영향을 주는지 알아보았습니다.

 

1.     Min/Max의 차이나는 설정은 메모리 할당 작업으로 인해 성능에 영향을 줍니다.

2.     WAS 경우 GC의 성능에도 영향을 줍니다. (WAS)

3.     처음 시작 시에도 메모리 할당 문제로 시작 시간에 영향을 줍니다.

 

물론 Min/Max 설정을 동일하게 했을 시 설정한 값만큼 무조건 Application에 할당되기에 메모리의 유연한 활용이 어려울 수도 있습니다. 

그러나 서버에서의 단일 시스템 및 성능을 고려하였을 때 Min/Max의 동일 설정을 권고 드립니다.