-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
60 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
## 개요 | ||
|
||
현재 운영중인 서비스가 메모리 4G의 클라우드 서비스 인스턴스에 올라가있습니다. 저희가 원래 8G램을 사용하다가 비용을 아끼기 위해 내린 것인데요. 하지만 아쉽게도 4G에서 빈번하게 OOM(Out Of Memory)가 발생하여 돈을 더 주고 다시 비싼 스펙으로 업그레이드를 했어야 했습니다...😭 그러던중, 사용하던 리눅스의 swap 영역이 0인것을 확인했습니다. 클라우드의 리눅스는 가상메모리를 사용안하나?라는 궁금증으로 정리하였습니다. | ||
|
||
## 목표 | ||
|
||
1. 메모리 이해하기 | ||
2. 스레싱 이해하기 | ||
3. 클라우드 환경에서의 swap 메모리 | ||
|
||
## 1. 메모리 개요 | ||
|
||
### 1) (메인)메모리란 | ||
|
||
- 주기억장치라고도 불림 | ||
- 모든 프로그램은 실행되기 위해 메모리에 위치되어야 함 -> 프로그램 실행을 위해 존재 | ||
- 주로 DRAM으로 구성 | ||
|
||
### 2) 메모리 보호 | ||
|
||
- 현재 대부분의 현대 운영체제는 `시분할기법`을 이용하여 여러 프로그램을 동시에 실행 | ||
- 따라서 메모리에는 여러 프로그램들이 동시에 나눠가져 공간을 차지함 | ||
- 만약 프로그램 A가 다른 프로그램 B의 영역에 침범하게 된다면 얘기치 않은 오류가 발생할 수 있음 | ||
- 이를 방지하기 위해 메모리 속 프로그램 간 경계를 침범하지 않도록 레지스터들을 이용하여 관리 | ||
- bound register(경계)는 시작 주소, limit register(한계)는 주소 범위를 저장 | ||
- CPU는 해당 작업이 `범위를 넘어서면 메모리 오류와 함께 인터럽트를 발생`시킴 | ||
|
||
### 3) Memory Manage Unit | ||
|
||
- MMU는 메모리 관리 유닛으로 메모리 관리를 담당함 | ||
- MMU는 fetch, placement, replacement를 통해 메모리를 관리 | ||
- fetch : 프로세스와 데이터를 메모리에 가져와 올림 | ||
- 요구 페이징 기법 : 메모리에 많은 프로세스들이 무작정 올라와져있으면 좀비 프로세스가 생성되거나 관리하기 복잡하게 됨. 현대 운영체제는 이 문제와 반응성을 고려하여, 사용자가 요구할 때 해당 페이지를 가져오는 방식을 사용 | ||
- placement : paging(고정 분할. 메모리를 일정하게 분리)이나 segmentation(가변 분할. 프로세스 크기에 맞게 배치)기법들을 사용하여 메모리에 프로세스 배치 | ||
- 세그멘테이션-페이징 혼용 기법 : 단편화 문제를 해결하기 위해 현대 운영체제는 이 기법을 사용 | ||
- 내부 단편화 : 페이징 기법을 통해 할당된 공간에 작은 크기의 프로세스가 들어가 내부에 공간이 남아있게 되는 문제 | ||
- 외부 단편화 : 세그멘테이션 기법을 통해 프로세스를 할당 후 나갔을 때, 남겨진 공간들에 그것보다 큰 프로세스를 할당하지 못하는 문제 | ||
- replacement : 메모리가 꽉 찼을 때 앞으로 사용하지 않을 프로세스를 찾아 디스크의 swap area로 내보냄 | ||
- 교체 알고리즘 : FIFO, 최적 근접 알고리즘 등을 사용하여 메모리에 어떤 페이지를 swap in할지 정함 | ||
|
||
### 4) 가상 메모리 | ||
|
||
- `가상 메모리는 물리적 메모리 공간 + 디스크의 swap area를 합친 가상의 공간`임 | ||
- MMU의 swap-in과 swap-out을 통해 프로세스를 swap area에 넣는 작업을 통해 이론적으로는 가상 메모리는 무한한 크기의 공간을 가질 수 있음 | ||
- 가상 메모리의 관리는 MMU에 의해 수행됨 | ||
|
||
## 2. 스레싱 | ||
|
||
- 가상 메모리가 swap area를 사용한다고 해서 절대 만능이 아님. 디스크 I/O는 메모리보다 속도가 느려 성능을 저하시키므로. 이를 통해 스레싱이 발생할 수 있음 | ||
- thrashing : 요구된 페이지가 메모리에 없어 swap area 등으로 찾으러 가야되는 경우. 이 때 컴퓨터는 작업이 멈춘 것처럼 보이게 됨 | ||
- 결국 swap area를 과도하게 사용한다는 것은 애플리케이션 성능을 저하하게 됨 | ||
|
||
## 3. 궁금증 : 클라우드 환경의 swap 메모리 | ||
|
||
- 일부 배포판 리눅스의 경우 swap 메로리가 설정이 안된 경우가 있음 -> 이는 swap 메모리 사용으로 인한 성능 저하를 고려한 것 | ||
- 그렇다고하면 클라우드 환경에서 메모리가 부족한 현상을 겪고 있을 때, 메모리를 증가하는 스케일 업을 하는 것이 좋을까 아니면 swap 메모리를 사용하는 것이 좋을까? | ||
- 클라우드 환경에서는 추가적인 고려가 필요하다. Red Hat 블로그에 따르면, 추가 외부 스토리지를 구매하여 swap 메모리를 사용하면 스토리지에 따라 메모리 성능이 좌우될 수 있으며 스토리지 변경에 따라 매니징과 계획이 필요하다. 추가로 자동화를 위해 쿠버네티스 등을 도입하게 되는데, 이 때 메모리 계산에도 혼동을 준다고 한다. | ||
- 결론 : 가상 메모리의 swap을 통해 메모리 공간의 한계를 극복할 수 있다. 하지만 클라우드에서의 인스턴스는 필요에 따라 스펙을 변경할 수 있는 오토 스케일업을 자주 사용하게 된다. swap을 사용할 경우, 추가적인 고려와 성능 저하의 문제로 swap의 사용은 선택이 된다. | ||
|
||
\*출처 : 쉽게 배우는 운영체제, [Analyzing cases for and against setting swap space on cloud instances](https://www.redhat.com/en/blog/cloud-swap) |