특정 애플리케이션을 실행하면 메모리가 완전히 고갈된다는 사실을 알게 되었다. 이 애플리케이션은 시스템에서 실행 중인 유일한 프로세스였다. 또한, 서버에서 응답이 없어서 제한 시간이 자주 초과되었기 때문에 수동으로 트랜잭션을 처리해야 하는 문제점이 있었다.
처음에는 애플리케이션 때문에 메모리가 고갈된다고 생각했다. 그러나 성능 분석 도구를 사용하고 나서 이 생각이 바뀌었다.
인도 신화에는 Sanjeevini라고 하는 의학의 대가가 나오는데 그는 거의 모든 병을 치료할 수 있었다. topas는 모든 시스템 자원에 대한 개요를 제공하며 성능 분석을 시작하는 시점에서 사용되기 때문에 성능 분석 도구의 Sanjeevini라고 할 수 있다. 이 기사의 시나리오에서는 문제를 해결하기 위한 첫 번째 단계로 먼저 이러한 성능 분석 도구를 사용했다. 이 문제점을 처음 발견했을 때, 컴퓨터에서 사용 중인 총 메모리의 백분율이 topas에 99%로 표시되었다. 또한, 이 때가 바로 팀에서 트랜잭션을 수동으로 처리하다가 문제점을 발견했을 때였다. 팀에서는 단지 하나의 애플리케이션과 관련된 시험작동을 수행 중이었다.
그래서 검사를 위한 다음 단계로 애플리케이션을 중지하였으며 다시 topas를 사용하여 컴퓨터에서 사용 중인 메모리의 상태를 확인했다. 이번에는 컴퓨터에서 사용 중인 메모리가 78%였고 기타, 애플리케이션과 관련 없는 알람 기능이 실행 중이었으며 이 때문에 원인을 다시 생각해 보게 되었다.
이러한 검사 과정에서 유용하게 사용할 수 있는 다른 도구로는 svmon과 vmstat, vmo를 들 수 있다.
svmon 명령은 가상 메모리의 스냅샷을 캡처하여 분석하는 성능 측정 도구이다.
svmon -G 명령을 실행하면 다음과 같은 글로벌 메모리 보고서가 표시된다. 이 보고서에는 시스템에서 사용 중인 실제 메모리와 가상 메모리의 크기와
사용 가능한 크기가 표시된다.
svmon -G |
그림 1. svmon 글로벌 메모리 보고서
이 메모리 보고서에는 총 메모리 1998848페이지(페이지 크기 = 4K) 중 1996881페이지가 사용 중이고 1967페이지가 사용 가능하다고 표시되어 있다.
그러나 위 보고서에서 사용 가능 페이지의 수가 1967로 표시되었다고 해서 이것이 메모리 관련 제한조건이나 메모리 병목을 의미하지는 않는다. 왜냐하면 애플리케이션이나 커널에서 메모리를 명시적으로 요청하지 않는 한 AIX®에서는 I/O 성능을 개선하기 위해 사용 가능한 메모리를 최대한 사용해서 파일을 캐시하려고 하기 때문이다. 더욱이 이 보고서에는 3145728페이지의 총 페이징 공간 중에서 사용 중인 페이지 공간은 99556페이지라고 표시되어 있다.
svmon -P 명령을 실행하면 모든 프로세스의 메모리 사용량 통계가 표시된다.
svmon -P |
그림 2. 프로세스 메모리 사용률 보고서
프로세스 메모리 사용률 보고서에는 Java™ 프로세스가 166690페이지의 메모리를 사용하고 있다고 표시되어 있다. 이 보고서를 통해 모든 프로세스에서 사용 중인 메모리를 확인하자, 여러 가지 프로세스에서 사용 중인 메모리의 총 합계가 이 시스템의 총 메모리보다 훨씬 적다는 사실을 알았다. 또한, 이러한 사실로부터 메모리가 제한 요인이 아니라는 점을 알 수 있었다.
또 다른 성능 모니터링 도구인 vmstat는 커널 스레드와 가상 메모리, 디스크, CPU 활동에 관한 통계를 보고하는 데 사용된다.
# vmstat 2 10 |
그림 3. vmstat 보고서
이 vmstat 보고서에는 사용 가능한 메모리가 약 114MB로 표시되어 있다. 또한, 페이지 아웃은 없는 것으로 보고되었다. 그러나 마지막 다섯 개 항목을 통해 하나의 스레드가 블록되었고 시스템에서 일부 I/O가 대기 중이라는 사실을 알 수 있다.
또한, vmo 명령을 사용하여 성능 매개변수를 확인할 수 있다. vmo 명령을 실행하여 가상 메모리 관리자 매개변수를 표시하고 조정할 수 있다.
vmo –a |
그림 4. vmo 명령의 출력
vmo 명령의 출력을 확인하는 과정에서 lgpg_regions와 lgpg_size가 각각 256과 16777216(또는 64MB)으로 설정되어 있다는 것을 알았다. AIX는 대용량 페이지를
고정된 메모리로 처리하며 대용량 페이지에 대한 페이징을 지원하지 않는다. 대용량 페이지를 기반으로 하는 애플리케이션의 데이터는 애플리케이션이 완료될
때까지 실제 메모리에서 유지된다. 이 기사에 있는 사례에서는 64MB 크기의 256페이지가 고정되어 예약되어 있다.
다시 그림 1로 돌아가서 svmon -G의 출력을 살펴보면 크기가 16MB인 대용량 페이지의 경우, 풀의 크기는 256이고 대용량 페이지를 사용하는 경우에는 메모리가 고정되어 있기 때문에 16MB의 256페이지를 각각 페이지 아웃할 수가 없다는 점을 확인할 수 있다. 그림 2에서 svmon -P 명령의 출력을 살펴보면 출력의 첫 번째 행에 이름이 16MB인 컬럼이 있으며 그 값이 'N'이라는 것을 알 수 있다. 이는 PID가 266372인 프로세스가 16MB 페이지를 사용하고 있지 않다는 것을 의미한다. 다시 말해서 애플리케이션은 vmo 명령을 통해 예약된 대용량 페이지를 사용하고 있지 않은 것이다. 마찬가지로 실행 중인 다른 프로세스를 같은 보고서에서 확인해 보면 대용량 페이지 지원을 사용하는 애플리케이션이 없다는 사실을 확인할 수 있다. 따라서, 256*16 = 4096MB가 불필요하게 블록되었으며 실행 중인 모든 프로세스에서 이 메모리를 사용할 수 없다.
그림 3에서 실제 메모리가 총 7808MB라는 사실을 확인할 수 있다. 위에 있는 분석 결과에서 명확히 알 수 있는 바와 같이 실제 메모리 중 4096MB는 대용량 페이지를 위해 예약되어 있다. 따라서 실행 중인 모든 애플리케이션은 단지 7808 - 4096 = 3712MB의 메모리만을 사용할 수 있다. 대용량 메모리 청크가 블록되어 사용되지 않는 상태로 남아있었기 때문에 메모리가 완전히 고갈되었던 것이었다.
따라서, 대용량 페이지용 메모리를 블록하지 말거나 애플리케이션에서 이 메모리를 제대로 활용할 수 있도록 해야 한다.
애플리케이션이나 시스템을 대용량 페이지를 사용하도록 구성할 수 있다.
ldedit 명령을 blpdata 플래그와 함께 사용하면 실행 파일에서 대용량 페이지를 요청할 수 있다. 이와 관련된 자세한 사항은 참고자료 섹션에서 확인할 수 있다.
기본적으로 시스템은 메모리를 대용량 페이지 실제 메모리에 할당하지 않는다. vmo 명령을 lgpg_regions와 lgpg_size 옵션과 함께 사용하면 대용량 페이지 실제 메모리 풀의 크기를 구성할 수 있다.
LDR_CNTRL 환경 변수를 사용하면 애플리케이션 데이터와 힙 세그먼트에서 대용량 페이지를 사용하게 할 수 있다.
대용량 페이지와 LDR_CONTROL 변수를 구성하기 위한 vmo 명령의 사용법과 관련된 자세한 세부사항은 참고자료 섹션에서 확인할 수 있다.
위에 있는 사례 연구에서 lgpg_regions 값을 명목 값으로 변경하고 애플리케이션에서 대용량 페이지를 사용하도록 하면 메모리 문제를 해결할 수 있으며 전체 시스템 성능도 높일 수 있다.
lgpg_regions 값이나 성능과 관련된 조정 매개변수 값에는 일반적인 권장사항이 없다. 그러나 명목 값은 시스템에서 워크로드를 확인하여 결정할 수 있다. 위에 있는 사례 연구에서는 LDR_CNTRL 변수를 내보내었을 때 애플리케이션에서 대용량 페이지를 사용하기 시작했다. 이렇게 한 다음, vmstat 명령을 다시 사용했다.
# vmstat –l 10 |
이 명령을 실행하면 대용량 페이지 섹션과 관련된 통계가 10초 간격으로 표시된다.
그림 5. 대용량 페이지 통계
이 보고서에는 대용량 페이지와 관련된 자세한 통계를 제공하는 대용량 페이지 섹션이 있다. alp와 flp 필드는 각각 활성화된 대용량 페이지와 사용 가능한
대용량 페이지에 해당한다. 이 사례 연구에서는 alp 값이 80을 넘지 않았다. 따라서 메모리를 활용하려면 lgpg_regions 값을 256에서 100 정도로
낮추는 것이 현명하다. 이렇게 하면 상당한 메모리 청크를 4K 메모리의 풀로 돌려보낼 수 있다. 이렇게 함으로써 실행 중인 다른 애플리케이션에서 사용할 수 있는
메모리를 늘릴 수 있으며 따라서 시스템의 전체 성능이 개선된다. 간단히 말해서 시스템의 워크로드를 확인한 다음 매개변수를 조정하는 것이 시스템 자원을
효과적으로 활용하기 위한 핵심이다.
대용량 페이지를 사용하는 기본 목적은 대용량 가상 메모리를 사용하면서 메모리 액세스를 많이 하는 애플리케이션이나 고성능 컴퓨팅 애플리케이션의 시스템 성능을 개선하는 데 있다. 대용량 페이지는 유용하지만 특정 시나리오에서 사용해야 한다. 대용량 페이지는 특정 목적으로 성능을 개선하기 위한 기능이며 일반적인 용도로 사용하기에는 적합하지 않다.
교육
-
성능 관리 안내서에서 AIX의 대용량 페이지에 관한 정보를 확인할 수 있다.
- AIX Performance Tools Handbook에서 다양한 AIX 성능 분석 도구를 확인할 수 있다.
- AIX 6.1 Information Center에서 AIX 운영 체제에 관한 기술 정보를 확인할 수 있다.
-
AIX와 UNIX developerWorks 영역에는 모든 AIX 시스템 관리 분야와 관련된 다양한 정보와 UNIX 기술을 발전시킬 수 있는 다양한 정보가 있다.
-
AIX와 UNIX 입문 AIX와 UNIX 입문 페이지에서 자세한 정보를 볼 수 있다.
-
기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.
토론
-
developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.
-
다음과 같은 AIX 및 UNIX 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- PowerVM Forum
- 기타 AIX and UNIX Forums