메모리 조회
root # cat /proc/meminfo
used mem = mem total - mem free
free
/proc/meminfo
$ cat /proc/meminfo
메모리 동작 원리
- OS 시간에 배우다 시피, CPU는 프로세스들이 사용하는 가상 메모리 주소->실제 물리 주소로 바꾸는 MMU를 보유하고 있다.
- 커널은 프로세스에 의해 사용된 메모리를 페이지(Page)라고 하는 작은 단위로 분리해 MMU를 도와준다.
- 커널은 페이지 테이블 (본인 블로그 추가 링크)을 가지고 프로세스가 보고 있는 가상 메모리 주소를 실제 페이지 주소로 매핑하는 기능을 갖고 있다.
페이지테이블을 MBR을 쓰든, GPT를 쓰든 여튼 디스크의 일정 섹터에 페이지 테이블을 심어둔다.
이런 페이징에는 on-demand paging, demand paging 방식이 있다.
Page Fault
- Page fault: 프로세스가 페이지를 사용하려는데, 메모리에 페이지가 준비되지 않았을 경우
사소한(minor) fault
- 요구되는 페이지가 RAM에 있지만, MMU가 그 위치를 파악하지 못하는 경우
- 원인
- 프로세스가 더 많은 메모리 요청
- MMU가 프로세스의 모든 페이지를 위한 장소를 저장할 만큼 충분한 공간이 없을 때
- 해결
- 커널은 MMU에 페이지에 대해 전달
- 프로세스는 계속되도록 함
중대한(Major) fault:
- 요구되는 페이지가 RAM에 없.을.때
- 원인
- 디스크로 부터 '프로그램'을 처음 로딩 했을 때!! (demand paging) --> 치명적이지 않음
- 당연히 코드내용이 RAM에 올려져있지 않아서
- 커널은 페이지를 캐시에도 저장할 것임(Policy에 따라 다름)
- 물리 RAM공간이 부족해서 SWAP이 계속 일어날 경우 --> 치명적
- 문제
- 빈번한 '중대한 Page fault'는 시스템이 교착상태에 빠질 수 있다.
- 해결
- 커널은 디스크로 부터 페이지 내용 로드
- 물리 RAM공간이 부족해서 swap이 너무 자주 발생하면, RAM을 더 대용량으로 사거나......
Page fault 검토법
ps
, top
, /usr/bin/time
명령으로 각 프로세스에 대한 페이지 폴트를 검색할 수 있다.
$ /usr/bin/time
$ /usr/bin/time <CMD, PROC>
- 예를 들어
cal
명령을 가지고 페이지 폴트를 살펴본다.
- 1major : 1개의 중대한 page fault
- 처음 프로그램을 디스크로 부터 로드할 땐, RAM에 내용이 없으니까 Major Page Fault 발생
- 97minor: 97개의 사소한 page fault
top
- top에서 프로세스별 Page Fault를 볼 수 있다.
- top에서 통계 변경은, top 실행 중
f
키를 누른다.
$ ps -o pid,min_flt,maj_flt,cmd
$ ps -o pid,min_flt,maj_flt,cmd [PID]
$ pidstat -r
: 프로세스 별 메모리 정보