메모리 관리
Linux 프로세스가 사용하는 가상 주소와 실제 RAM의 양은 같은 지표가 아니다. 커널은 페이지 테이블을 통해 주소를 연결하고, 파일 캐시·익명 메모리·공유 페이지 등을 관리한다. 큰 가상 주소 공간을 예약했다는 사실만으로 같은 크기의 RAM을 즉시 사용했다고 판단할 수 없다.
free 숫자만 보면 오해하기 쉽다
Linux에서 다음 값을 확인한다.
grep -E '^(MemTotal|MemFree|MemAvailable|Cached|SwapTotal|SwapFree):' /proc/meminfo
MemFree는 현재 사용하지 않는 메모리이고, MemAvailable은 스왑 없이 새 작업에 제공할 수 있는 양의 추정치다. 파일 캐시처럼 회수 가능한 영역 때문에 둘은 다르다. free가 작다는 이유만으로 캐시를 강제로 비우는 것은 적절한 첫 진단이 아니다.
Cached를 전부 즉시 회수 가능한 메모리라고 취급해서도 안 된다. 공유 메모리, dirty page, 커널의 회수 조건 등이 함께 영향을 준다.
프로세스 단위로 보기
ps -o pid,rss,vsz,comm -p "$$"
procps의 ps에서 RSS와 VSZ는 KiB 단위다. RSS는 현재 RAM에 상주하는 양, VSZ는 가상 주소 공간의 크기를 나타낸다. 여러 프로세스의 RSS를 더하면 공유 페이지를 중복 계산할 수 있다.
메모리 압박이 생기면 커널은 회수·writeback·스왑 등을 시도할 수 있고, 조건에 따라 OOM 처리가 발생한다. 컨테이너의 메모리 제한 때문에 호스트에 여유가 있어도 해당 작업이 실패할 수 있다. “RAM이 충분해 보인다”와 “이 프로세스가 사용할 수 있다”를 구분한다.