이 글에서는 Linux 환경에서 C++를 사용하여 프로그램의 메모리 사용량 통계를 확인하는 방법을 소개합니다.
프로세스의 메모리 관련 세부 정보는 /proc/self/stat 파일에서 모두 얻을 수 있습니다. 이 파일에는 현재 실행 중인 프로세스에 대한 다양한 커널 통계가 기록되어 있으며, 여기서는 그중 가상 메모리(Virtual Memory) 크기와 상주 집합 크기(Resident Set Size, RSS) 두 가지 값을 추출하는 방법을 다룹니다.
- 가상 메모리(vsize): 프로세스에 할당된 전체 가상 주소 공간의 크기
- RSS(rss): 실제 물리 메모리(RAM)에 올라와 있는 페이지의 수
예제 코드
#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void mem_usage(double& vm_usage, double& resident_set) {
vm_usage = 0.0;
resident_set = 0.0;
// proc 디렉터리에서 프로세스 정보 가져오기
ifstream stat_stream("/proc/self/stat", ios_base::in);
// 정보를 담을 변수들 선언
string pid, comm, state, ppid, pgrp, session, tty_nr;
string tpgid, flags, minflt, cminflt, majflt, cmajflt;
string utime, stime, cutime, cstime, priority, nice;
string O, itrealvalue, starttime;
unsigned long vsize; // 가상 메모리 크기 (바이트)
long rss; // 상주 집합 크기 (페이지 수)
stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
>> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
>> utime >> stime >> cutime >> cstime >> priority >> nice
>> O >> itrealvalue >> starttime >> vsize >> rss; // 나머지 값은 무시
stat_stream.close();
long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // 시스템 페이지 크기 (KB 단위)
vm_usage = vsize / 1024.0; // 바이트 → KB 변환
resident_set = rss * page_size_kb; // 페이지 수 × 페이지 크기(KB)
}
int main() {
double vm, rss;
mem_usage(vm, rss);
cout << "Virtual Memory: " << vm << "\nResident set size: " << rss << endl;
}실행 결과
Virtual Memory: 13272 Resident set size: 1548
코드 핵심 포인트
/proc/self/stat 파일은 공백으로 구분된 여러 필드로 구성되어 있으며, 각 필드에는 PID, 명령 이름, 프로세스 상태 등의 정보가 순서대로 담겨 있습니다. 필요 없는 앞부분의 필드들은 문자열 변수로 받아 흘려보내고, 실제로 필요한 vsize와 rss 값만 숫자형으로 읽어 들입니다.
sysconf(_SC_PAGE_SIZE) 함수를 호출하면 시스템의 메모리 페이지 크기를 바이트 단위로 얻을 수 있습니다. 이 값을 1024로 나누면 KB 단위 페이지 크기가 되고, 여기에 RSS(페이지 수)를 곱하면 실제 물리 메모리 사용량을 KB 단위로 계산할 수 있습니다.