본문 바로가기
카테고리 없음

리눅스 Swap Memory

by simongs 2020. 7. 4.

SWAP

개요

물리 메모리가 부족하면 메모리 부족 (OOM) 상태가 된다.
리눅스에서는 메모리 부족에 대응하는 장치가 있는데 가상 메모리 방식을 응용한 SWAP 이다.

SWAP은 저장 장치 일부를 일시적으로 메모리 대신에 사용하는 방식이다.
구체적으로 시스템의 물리 메모리가 부족한 상태가 되어 물리 메모리를 획득할 때에,
기존에 사용하던 물리 메모리의 일부분을 저장 장치에 저장하여 빈 공간을 만들어 낸다.
이때 메모리의 내용이 저장된 영역을 SWAP 영역이라고 한다.
시스템 구축 시점에 시스템 관리자가 만들어 둡니다.

시나리오 1 - 물리메모리가 부족할때 SWAP을 통한 매모리 확보 시나리오

  1. (프로세스 B) 아직 물리메모리를 할당하지 않은 가상메모리에 접근하려고 시도
  2. (프로세스 B) 가상메모리에서 물리메모리를 할당하려고 시도
  3. (프로세스 B) 물리메모리가 부족한 상황
  4. (프로세스 A) 커널에서 사용중인 물리메모리 일부를 SWAP영역에 임시 보관 => SWAP OUT 이라고 부른다.
    4-1. (프로세스 A) 다른 프로세스의 일부 가상주소를 SWAP OUT된 주소 정보로 변경
    4-2. (프로세스 A) 커널의 알고리즘에 의해서 "앞으로 한동안 사용되지 않을 듯한" 부분을 결정한다.
  5. (프로세스 B) 신규로 확보된 물리메모리 공간을 1번 가상메모리에 할당

시나리오 2 - 시나리오 1 이후에 물리메모리에 여유가 생기는 시나리오

  1. 물리메모리에 여유자원이 확보가 됨.
  2. (프로세스 A) 사용자에 의해서 프로세스 A의 SWAP OUT된 메모리에 접근 시도
  3. 즉각적으로 가상메모리에 매핑된 물리메모리 정보가 존재하지 않으므로 "Page Fault" 발생
  4. 해당 가상메모리가 SWAP 영역에 존재하므로 SWAP 영역의 정보를 물리메모리로 다시 가져온디 => SWAP IN 이라한다.

SWAP IN, SWAP OUT

이렇게 물리메모리와 SWAP영역의 정보를 교환하는 작업을 SWAPING 이라고 합니다. (SWAP IN + SWAP OUT)
리눅스에서는 SWAP의 단위가 페이지 단위이므로 페이징(PAGING)이라고도 부릅니다. (PAGE IN + PAGE OUT)

SWAP의 동작방식은 시스템이 사용할 수 있는 메모리 양이 "물리 메모리 + SWAP 영역" 으로 보이게 합니다.
그러나 여기에는 맹점이 있는데 두 영역의 접근 속도 차이는 아주 큰 차이가 있습니다.

시스템의 메모리 부족이 일시적인 현상이 아니라 만성적으로 부족하다면 메모리에 접근할 때마다
SWAPING이 일어나게 되고 SWAP OUT, SWAP IN 이 반복되는 Thrashing (스래싱) 상태가 됩니다.

스래싱이 발생하면 시스템은 사용자 입력을 받을수 없게 되다가 결국 컴퓨터가 멈추고 메모리 부족이 일어납니다.

리눅스 명령어

SWAPON

  • 시스템의 스왑 영역을 확인한다.

FREE

  • 메모리 정보 확인
  • 아래 예제에서는 "1048572" 킬로바이트 단위가 스왑영역 사이즈
❯ docker pull centos:latest
latest: Pulling from library/centos
6910e5a164f7: Pull complete
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

❯ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
centos                          latest              831691599b88        2 weeks ago         215MB

> docker run -i -t centos /bin/bash
 -i : 사용자가 입출력을 할 수 있는 상태로
 -t : 가상 터미널 환경을 에물레이션 함
 -d : 컨테이너를 백그라운드 형태로 계속 실행하게 함.

[root@64cae3fc39b4 /]# free
              total        used        free      shared  buff/cache   available
Mem:        2036900      293556     1174448         800      568896     1593548
Swap:       1048572           0     1048572

sar -W 1

  • 스와핑이 발생하고 있는지를 확인한다.
[root@ec25381fcdb8 sbin]# yum install sysstat
- sar를 이용하기 위한 package 설치

[root@ec25381fcdb8 sbin]# sar -W 1
Linux 4.19.76-linuxkit (ec25381fcdb8)     07/04/20     _x86_64_    (6 CPU)

13:25:25     pswpin/s(SWAP-IN) pswpout/s (SWAP-OUT)
13:25:26         0.00      0.00
13:25:27         0.00      0.00
13:25:28         0.00      0.00
13:25:29         0.00      0.00
13:25:30         0.00      0.00
13:25:31         0.00      0.00

Major Fault vs Minor Fault

스와핑과 같이 저장 장치에 대한 접근이 발생하는 페이지 폴트를 Major Fault 라고 하며
반대로 저장 장치에 대한 접근이 발생하지 않은 페이지 폴트를 Minor Fault 라고 합니다.
둘 중에는 Major Fault가 영향력이 큽니다.

Reference

  • 실습과 그림으로 배우는 리눅스 구조 중 5장 메모리 관리 일부

댓글