가상메모리
: 메모리 부족 현상을 방지하기 위해 보조 기억장치인 디스크 공간을 주 기억 장치로 활용하는 것
: 프로세스에서 필요한 부분만 메모리로 적재하고 나머지 부분은 가상메모리 영역에 적재
: 가상메모리 부분은 하드디스크의 공간
- 가상주소공간과 메모리 블록
: 가상 메모리는 실제 존재하는 물리적인 메모리 개념과 사용자의 논리 메모리 개념을 분리
: 접근이 어려운 물리 메모리를 가상으로 재구성하여 배열로 추상화
: 모든 프로그램은 추상화된 배열로 된 가상주소공간을 부여 받음
: 효율을 위해 4kb의 메모리 블록으로 분할하여 사용
> 페이지 혹은 세그먼트
메모리 관리 기법
- 페이징 (paging)
: 프로그램 전체를 연속된 공간에 적재하지 않고 일정 크기의 단위로 나누어서 분산 하여 적재
: 물리 메모리를 일정한 크기인 Frame으로 분할
: 가상 메모리도 같은 크기의 Page로 분할
: 프로세스에는 페이지 번호와 offset 정보가 포함되어 있어 메모리 상의 프로그램 page와 frame을 찾을 수 있음
- 세그먼테이션 (segmentation)
: 프로그램의 주소 공간을 논리적 단위로 분할
: 변수, 함수, 스택, 객체 등 논리적인 단위로 프로그램을 나누어 메모리에 적재
: 세그먼트 테이블을 통해 세그먼트 번호와 오프셋을 지정
: 페이지와 달리 크기가 일정하지 않음
가상 메모리와 힙 / 스택
: code, data, heap, stack 등의 영역은 논리적인 영역으로, 가상 메모리에 할당되는 부분
: 가상 메모리는 프로세스 마다 하나씩 갖고 있는 고유한 영역으로 각 영역이 heap과 stack 등의
논리적인 메모리 공간을 가짐
: 실제 물리 메모리에는 현재 프로그램 실행을 위해 필요한 부분들이 적재되고,
당장 실행에 필요없는 부분이 발생할 경우, 가상메모리에 적재하여 필요할때 사용
- 가상메모리의 가변성
: 가상메모리는 CPU의 MMU에 의해서 관리됨
: 물리 메모리가 꽉찼을때 일부 프로세스를 스왑 영역으로 보내고 (swap out)
작업을 마친 프로세스가 있는 경우 스왑 영역의 프로세스를 물리 메모리로 가져옴 (swap in)
※ swapping에서의 프로세스의 저장 방향
- swap in
: 디스크 > 메모리
- swap out
: 메모리 > 디스크
- 메모리 누수가 발생하는 부분
: 메모리 누수가 발생하면 가상메모리 사용량과 물리 메모리 사용량이 함께 증가
: 실행이 끝나고 가비지 컬렉터에 의해 회수되지 않은 객체가 있는 경우 가상메모리에 쌓이게 됨
: 즉, 실행을 위해 물리메모리에 먼저 적재되었다가 가상메모리로 적재가 되는 것
리눅스 서버에서 NodeJS 프로그램 메모리 누수 여부 확인 방법
1) 프로세스 PID 조회
: ps -ef | grep 프로세스이름
: 메모리 사용량도 확인 가능
2) 프로세스 PID로 메모리 사용량 확인
- cat /proc/PID/status
: 프로세스가 사용하는 가상메모리 용량 확인
: vmRSS를 확인 (프로세스가 사용하는 가상메모리 총량)
- top -d 1 -p PID
: 1초 간격으로 프로세스의 메모리 사용량 확인 (가상 메모리 및 물리 메모리)
: RSS와 VSZ를 확인
3) cat /var/log/syslog
: OOM (out of memory)가 발생하여 OS에서 프로세스를 종료시켰을 때 시스템 로그를 확인
: VSZ (virtual memory size)로 프로세스가 사용했던 가상 메모리 크기 확인
: RSS (resident set size)로 프로세스가 사용하고 있는 물리적 메모리 크기를 확인
: 메모리 사용 표에 있는 로그의 용량은 페이지 당 크기이므로 페이지 크기인 4096을 곱한 뒤 계산
※ OOM (out of memory)
: 프로세스의 메모리 사용량이 과대하여 리눅스 커널에서 프로세스를 SIGTERM으로 종료시키는 것
Refference
'Programming > NodeJS' 카테고리의 다른 글
Express HTTP 에러 핸들링 (0) | 2023.04.24 |
---|---|
express의 구조 (0) | 2023.02.13 |
NodeJS와 메모리 1 - V8 엔진 (0) | 2022.09.12 |
NodeJS --inspect (NodeJS 디버깅 / 힙 스냅샷 생성하고 분석 하기) (0) | 2022.09.01 |
클러스터링을 이용한 멀티쓰레드 IPC (0) | 2022.08.31 |