윈도우의 메모리 사용률을 MRTG 그래프로 모니터링하는 방법을 설명한다. 실제 메모리(Physical Memory)와 할당된 메모리(Commit Charge)의 차이를 살펴보고, 각 항목의 OID를 찾는다. 디스크 용량을 예로 들어 OID의 단위와 크기를 읽는 방법을 익힌 뒤, 메모리 사용률을 계산해 mrtg.cfg에 적용하고 그래프로 출력한다.
윈도우 시스템 메모리 관리와 MRTG 활용
장기간 가동되는 윈도우 시스템에서는 메모리 상태를 꾸준히 살펴볼 필요가 있다. 메모리 사용량이 계속 늘어나거나 사용 가능한 메모리가 부족해지면 프로그램의 응답이 느려지고, 심한 경우 시스템이 다운되어 버린다. 특히 윈도우 11의 경우 파일 탐색기의 메모리 누수로 가용 메모리가 빠르게 줄어든다.
불필요한 메모리를 정리하는 가장 빠르고 확실한 방법은 시스템을 재부팅하는 것이다. 하지만 장시간 운영하는 시스템을 무작정 자주 재부팅할 수는 없는 노릇이다. 때문에 시스템의 메모리 사용 상태를 파악해 적절한 재부팅 일정을 잡고 평소에도 메모리 상태를 모니터링해 장애가 발생하기 전 필요한 조치를 취할 수 있어야 한다.
이처럼 시스템의 상태를 지속적으로 감시하는 도구를 NMS(Network Management System)라고 부른다. 본래 NMS는 네트워크 장비의 상태를 감시하는 시스템을 가리켰으나 그 의미가 확장되면서 여러 장비와 서비스의 상태를 감시하는 관제 시스템 전반을 가리키는 용어가 되었다.
그중 MRTG(Multi Router Traffic Grapher)는 수집한 수치를 그래프로 보여주는 도구다. 본래 라우터나 스위치의 트래픽을 살펴보는 용도였으나, 메모리 사용량과 같은 다른 수치도 그래프로 표시할 수 있다.
물론 다른 모니터링 도구도 많다. 그럼에도 MRTG는 오랜 기간 축적된 활용 사례를 가진 무료 도구라는 장점이 있다. 본 글에서는 윈도우 시스템의 메모리 관련 데이터를 SNMP로 읽어와, 실제 메모리와 가상 메모리의 사용률을 MRTG 그래프로 표시하는 과정을 설명한다.
사전 지식: SNMP, OID, 윈도우 시스템의 메모리 구조
MRTG로 윈도우 시스템의 메모리 사용률을 그래프로 표시하려면 먼저, 데이터를 가져오는 방법과 윈도우 메모리의 구성, 메모리 수치의 의미를 알아야 한다.
SNMP와 OID
윈도우 시스템을 비롯한 여러 장비는 자신의 상태를 외부에서 조회할 수 있는 SNMP(Simple Network Management Protocol) 기능을 제공한다. SNMP는 모니터링 시스템과 대상 장비가 정보를 주고받을 때 사용하는 통신 규약이다. MRTG는 SNMP를 통해 대상 시스템의 수치를 읽어올 수 있다.
SNMP로 제공되는 디스크 용량, CPU 사용률, 네트워크 트래픽 등의 항목에는 각각 식별자가 있다. 이를 OID(Object Identifier)라고 한다. 모니터링 시스템인 SNMP 매니저가 특정 OID의 값을 요청하면, 대상 시스템의 SNMP 에이전트가 해당 값을 응답한다.
윈도우 시스템에도 제공할 수 있는 데이터들에 OID 값이 할당되어 있다. 즉, 메모리를 모니터링하려면 메모리에 해당하는 OID를 알고 있어야 한다.
실제 메모리와 할당된 메모리

윈도우 시스템의 메모리 상태를 살펴볼 때는 실제 메모리(Physical Memory)와 할당된 메모리(Commit Charge)를 구분할 필요가 있다. 각각의 의미를 간단히 정리하자면 다음과 같다.
- 실제 메모리
- 시스템에 장착된 물리적인 메모리로, 흔히 ‘램이 몇 기가예요?’라고 할 때의 RAM을 의미한다. 실제 메모리 사용량은 이 RAM 중 현재 사용 중인 양이다.
- 할당된 메모리(Commit Charge)
- RAM과 페이지파일을 포함해 윈도우가 제공한 모든 메모리의 총량이다. 이 값이 커밋 한도(Commit Limit)에 도달하면 윈도우가 새 메모리를 할당하지 못하게 된다. 즉, 실제로 윈도우가 사용중인 메모리의 크기를 의미하며 메모리 부족의 기준이 된다.
상황과 관리자의 성향에 따라 선택할 수 있겠으나, 윈도우 시스템의 메모리 관리를 위해서는 보통 이 두 가지를 모니터하게 되며, 둘 중에서 하나만 선택한다고 하면 할당된 메모리(커밋 차지)를 선택하는 것이 일반적이다.
윈도우 시스템의 메모리 OID
윈도우 시스템에서 메모리는 저장소(Storage) 중 하나로 분류되며, 저장소와 관련된 OID는 1.3.6.1.2.1.25.2.3.1 아래에 위치하고 있다. 해당 OID를 SNMPWALK로 확인해 보면 아래의 표와 비슷한 목록이 나올 것이다.
| Name/OID | Value | Type |
|---|---|---|
| 1.3.6.1.2.1.25.2.3.1.1.1 | 1 | Integer |
| 1.3.6.1.2.1.25.2.3.1.1.2 | 2 | Integer |
| 1.3.6.1.2.1.25.2.3.1.1.3 | 3 | Integer |
| 1.3.6.1.2.1.25.2.3.1.1.4 | 4 | Integer |
| 1.3.6.1.2.1.25.2.3.1.2.1 | 1.3.6.1.2.1.25.2.1.4 | OID |
| 1.3.6.1.2.1.25.2.3.1.2.2 | 1.3.6.1.2.1.25.2.1.7 | OID |
| 1.3.6.1.2.1.25.2.3.1.2.3 | 1.3.6.1.2.1.25.2.1.3 | OID |
| 1.3.6.1.2.1.25.2.3.1.2.4 | 1.3.6.1.2.1.25.2.1.2 | OID |
| 1.3.6.1.2.1.25.2.3.1.3.1 | C:\ | OctetString |
| 1.3.6.1.2.1.25.2.3.1.3.2 | Z:\ | OctetString |
| 1.3.6.1.2.1.25.2.3.1.3.3 | Virtual Memory | OctetString |
| 1.3.6.1.2.1.25.2.3.1.3.4 | Physical Memory | OctetString |
| 1.3.6.1.2.1.25.2.3.1.4.1 | 4096 | Integer |
| 1.3.6.1.2.1.25.2.3.1.4.2 | 0 | Integer |
| 1.3.6.1.2.1.25.2.3.1.4.3 | 65536 | Integer |
| 1.3.6.1.2.1.25.2.3.1.4.4 | 65536 | Integer |
| 1.3.6.1.2.1.25.2.3.1.5.1 | 55528047 | Integer |
| 1.3.6.1.2.1.25.2.3.1.5.2 | 0 | Integer |
| 1.3.6.1.2.1.25.2.3.1.5.3 | 299700 | Integer |
| 1.3.6.1.2.1.25.2.3.1.5.4 | 260788 | Integer |
| 1.3.6.1.2.1.25.2.3.1.6.1 | 11428996 | Integer |
| 1.3.6.1.2.1.25.2.3.1.6.2 | 0 | Integer |
| 1.3.6.1.2.1.25.2.3.1.6.3 | 107504 | Integer |
| 1.3.6.1.2.1.25.2.3.1.6.4 | 109841 | Integer |
1.3.6.1.2.1.25.2.3.1.1.X(적색)- SNMP에서 저장소로 인식한 장치들에 대한 인덱스 번호이다. 뒤에 이어지는 OID들의 X 부분에는 여기서 표시된 인덱스 번호를 적용하면 된다. 예의 그림에서는 1부터 4까지 총 4개의 저장소가 있음을 알 수 있다.
1.3.6.1.2.1.25.2.3.1.3.X(등색)- 저장소 설명(Storage Description) 영역으로, 저장소의 타입과 인스턴스를 표기하는 OID이다. 인덱스 번호 1은 C드라이브, 2는 Z드라이브, 3은 가상 메모리, 4는 실제 메모리로, 우리가 관심을 가질 인덱스는 3, 4임을 알 수 있다.
1.3.6.1.2.1.25.2.3.1.4.X(황색)- 저장소 할당 단위(Storage Allocation Units) 영역이다. 인덱스 번호 1의 C드라이브는 4096Byte 단위로 할당됨을 알 수 있다. 메모리의 경우 65536Byte가 기본 할당 단위이다. 이 숫자는 저장소의 실제 크기를 계산하는 데 필요하다.
1.3.6.1.2.1.25.2.3.1.5.X(녹색)- 저장소 크기(Storage Size) 영역이다. 해당 저장소의 전체 크기가 몇 단위(Unit)인가 나타낸다.
1.3.6.1.2.1.25.2.3.1.6.X(청색)- 저장소 사용량(Storage Used) 영역이다. 해당 저장소의 현재 사용량이 몇 단위(Unit)인가 나타낸다.
예를 들어 C드라이브의 전체 용량과 사용 중인 용량을 알고 싶다면 이렇게 계산할 수 있겠다.
OID의 스토리지 인덱스에서 알 수 있듯이, 메모리의 인덱스 번호는 리스트 마지막에 위치한 경우가 많다. 이 말은, 만약 시스템에 다른 저장소가 더 있을 경우(하드가 더 달려 있는 경우) 인덱스 번호가 뒤로 밀릴 수 있다는 말이다. 때문에 메모리의 인덱스 번호가 몇 번인지 OID value를 보고 잘 선택해야 한다.
메모리 사용률 계산
앞의 SNMP 응답에서 인덱스 4는 Physical Memory, 인덱스 3은 Virtual Memory로 표시된다. 각 항목의 사용량(hrStorageUsed)을 전체 크기(hrStorageSize)로 나눈 뒤 100을 곱하면 사용률을 구할 수 있다. 같은 항목의 두 값은 할당 단위가 같으므로, 백분율을 계산할 때는 바이트로 환산하지 않아도 된다.
사용한 OID: 1.3.6.1.2.1.25.2.3.1.6.4 ÷ 1.3.6.1.2.1.25.2.3.1.5.4 × 100
사용한 OID: 1.3.6.1.2.1.25.2.3.1.6.3 ÷ 1.3.6.1.2.1.25.2.3.1.5.3 × 100
백분율이 아니라 용량을 바이트로 구하려면, 앞에서 C드라이브 용량을 계산한 것처럼 해당 항목의 단위 수에 hrStorageAllocationUnits 값을 곱하면 된다.
MRTG에 메모리 사용률 적용하기
이제 어떤 OID에서 값을 읽고 어떻게 사용률을 계산하는지 알게 되었다. 남은 작업은 윈도우의 SNMP 서비스를 준비하고, MRTG 서버에서 해당 값을 수집하도록 설정하는 것이다. 먼저 다음 작업을 완료한다.
준비가 끝났다면 mrtg.cfg에 타깃을 추가한다. 아래의 예시는 위에서 확인한 인덱스 3과 4를 사용한다. 실제 환경에서는 자신의 SNMP 응답에서 찾은 인덱스, 커뮤니티 문자열, 대상 IP 주소로 바꿔야 한다.
MRTG는 OID 값에 대한 산술계산이 가능하다. Target 부분을 주의 깊게 보기 바란다.
Options[_]: growright,gauge,nopercent
Target[SVR_RAM]: 1.3.6.1.2.1.25.2.3.1.6.3&1.3.6.1.2.1.25.2.3.1.6.4:public@192.168.123.123:::::2 / 1.3.6.1.2.1.25.2.3.1.5.3&1.3.6.1.2.1.25.2.3.1.5.4:public@192.168.123.123:::::2 * 100
MaxBytes[SVR_RAM]: 100
SetEnv[SVR_RAM]: MRTG_INT_IP="No Ip" MRTG_INT_DESCR="VMEM"
Unscaled[SVR_RAM] : yd yw ym yy
Title[SVR_RAM]: SVR Memory Usage
YLegend[SVR_RAM] : Percent
LegendI[SVR_RAM] : VMEM Usage
LegendO[SVR_RAM] : PMEM Usage
Legend1[SVR_RAM] : Virtual Memory Usage
Legend2[SVR_RAM] : Physical Memory Usage
ShortLegend[SVR_RAM] : %
...(생략)...
1.3.6.1.2.1.25.2.3.1.5.3- 전체 가상 메모리(Unit) 값이다. hrStorageSize에 해당하며, 인덱스 3은 가상 메모리를 뜻한다.
1.3.6.1.2.1.25.2.3.1.6.3- 사용 중인 가상 메모리(Unit) 값이다. hrStorageUsed에 해당한다.
1.3.6.1.2.1.25.2.3.1.5.4- 전체 물리 메모리(Unit) 값이다. 인덱스 4는 실제 메모리를 뜻한다.
1.3.6.1.2.1.25.2.3.1.6.4- 사용 중인 물리 메모리(Unit) 값이다.
&- MRTG에서 입력(IN)과 출력(OUT)을 구분하는 연산자이다. 앞(OID)은 IN, 뒤(OID)는 OUT에 매핑된다.
public@192.168.123.123:::::2- 타겟 호스트의 IP 주소와 커뮤니티 이름
* 100- 백분율로 나타내기 위해 100을 곱해준다.
즉, 입력 그래프에는 사용 중인 가상 메모리를 전체 가상 메모리로 나눈 값을 표시해 주고, 출력 그래프에는 사용 중인 물리적 메모리를 전체 물리적 메모리로 나눈 값을 표시해 주는 설정이다. 정상적으로 진행되었다면 아래의 그래프와 같이 윈도우 시스템의 메모리 사용률을 MRTG를 통해 모니터할 수 있게 된다.

mrtg.cfg의 다른 설정 항목과 사용 방법은 MRTG 설정 파일 안내를 참고하기 바란다.
마무리
NMS는 구축해 놓는 것으로 끝나지 않는다. 평소 그래프의 모습을 눈에 익혀 둬야, 메모리 사용량이 평소와 다를 때 알아차릴 수 있다.
SNMP와 MRTG를 활용하면 별도의 비용 없이 윈도우 시스템의 메모리 사용 추이를 기록할 수 있다. 특히 오래 가동하는 서버나 시스템의 점검 시점을 판단하는 데 유용하다. 사용률이 계속 올라간다면 작업 관리자에서 어떤 프로세스의 메모리 사용량이 증가하는지 살펴보아야 한다.
본 필자도 메모리 누수가 발생하는 프로그램을 실행하는 윈도우 시스템은 이 방법으로 상시 모니터링하고, 필요한 경우 재부팅하고 있다. 윈도우 11 시스템들은 파일 탐색기 프로세스를 한 달 간격으로 정리하기도 한다. 이처럼 그래프를 평소 관리 작업과 연결해 활용하는 것이 중요하다.
윈도우 시스템 관리 때문에 골치를 썩고 계신 독자 제위께 본 글이 작은 도움이 되기를 바라는 바이다.
FAQ
- SNMP로 윈도우 시스템에서 어떤 데이터를 가져올 수 있는가?
- 운영체제 정보, 시스템 가동 시간(Uptime), 네트워크 인터페이스 상태를 비롯해 CPU 사용량, 물리 및 가상 메모리 크기, 디스크 파티션별 전체 및 사용 중인 용량 등 다양한 시스템 리소스 정보를 가져올 수 있다.
- 윈도우 시스템의 메모리와 관련된 OID는 무엇인가?
- 표준 HOST-RESOURCES-MIB 내의
hrStorageTable(1.3.6.1.2.1.25.2.3.1) 영역을 사용하며, 저장소 설명(.3.X)에서 ‘Virtual Memory’와 ‘Physical Memory’로 지정된 인덱스를 찾아 전체 크기와 사용량을 조회한다. - 윈도우 시스템의 디스크 사용량과 관련된 OID는 무엇인가?
- 메모리 OID와 동일한
hrStorageTable(1.3.6.1.2.1.25.2.3.1) 영역을 사용하며, 저장소 설명(.3.X)에 표시되는 드라이브 문자(예:C:\)의 인덱스를 기반으로 전체 크기(.5.X)와 사용량(.6.X) OID를 매핑하여 조회한다. 바이트 단위의 사용량은 여기에hrStorageAllocationUnits를 곱해 구한다. C:\의 인덱스는 1인 경우가 많다. - 윈도우의 실제 메모리란 무엇인가?
- 시스템에 장착된 물리적인 RAM을 말한다. 실제 메모리 사용량은 그 RAM 중 사용 중인 양이며, 프로그램과 시스템에 커밋한 메모리의 총량인 Commit Charge와는 다른 지표다.
- 윈도우의 가상 메모리가 커밋 한계(Commit Limit)와 같은 개념인가?
- 엄밀히는 다르지만 밀접하게 연관되어 있다. 가상 메모리 아키텍처 중 프로그램들이 실제로 쓰겠다고 승인받은 총량을 ‘할당된 메모리(Commit Charge)’라 부르며, 이것이 도달할 수 있는 물리 RAM과 페이지 파일의 최대 합계 한도가 바로 ‘커밋 한계(Commit Limit)’이다.
- 실제 메모리 대신 할당된 메모리(Commit Charge)를 모니터링해야 하는 이유는 무엇인가?
- 윈도우 시스템에서 메모리 부족(OOM)으로 인한 장애는 물리 RAM 부족이 아니라 커밋 한계 도달 시점에 발생하므로, 시스템의 실제 자원 고갈 위험을 진단하는 데 훨씬 정확한 기준이 된다.
- 커밋 사용량과 커밋 한도는 무엇인가?
- 커밋은 프로그램이 윈도우 커널에 요청해 확보한 가상 메모리 사용량이고, 커밋 한계는 시스템이 제공할 수 있는 최대 커밋 용량이다. 이 커밋 한계에 도달하면 윈도우는 더 이상 메모리를 할당하지 못해 프로그램이 강제 종료되거나 오류가 발생한다.
- MRTG 설정에
Options[_]: gauge가 필요한 이유는 무엇인가? - 메모리 사용률은 측정 시점의 상태값이기 때문이다.
gauge를 지정하지 않으면 MRTG는 기본적으로 값을 누적 카운터로 취급해 이전 측정값과의 차이를 계산하므로, 의도한 사용률 그래프가 나오지 않는다. - 서버에 하드디스크를 추가하면 메모리 OID의 인덱스 번호가 바뀌는가?
- 바뀔 가능성이 있다. 저장소 구성이나 SNMP 에이전트의 응답이 달라진 뒤에는
hrStorageDescr에서 Virtual Memory와 Physical Memory의 현재 인덱스를 다시 확인해야 한다. - 메모리 사용률을 계산할 때 할당 단위를 곱해야 하는가?
- 백분율만 구할 때는 곱하지 않아도 된다. 같은 저장소 항목의
hrStorageUsed를hrStorageSize로 나누면 할당 단위가 서로 상쇄된다. 용량을 바이트로 표시할 때는hrStorageAllocationUnits값을 곱한다. - MRTG에 메모리 그래프가 표시되지 않으면 무엇을 확인해야 하는가?
- 먼저 MRTG 서버에서 윈도우 SNMP 에이전트의 값을 조회할 수 있는지 확인한다. 다음으로 커뮤니티 문자열, IP 주소, SNMP 버전과 실제 메모리 인덱스를
Target설정과 대조한다. 마지막으로 사용량과 전체 크기 OID가 모두 수치로 응답하는지, 전체 크기가 0은 아닌지 확인한다.
갱신 내역
- — 최초 게시
- — 수정 및 주소 이전 (https://www.DectENG.com/)
- — 수정 및 주소 이전 (https://www.EQMaker.kr/)