본문 바로가기

Linux is..../Algorithm

Virtual Memory가상메모리란?

요즘 이런저런 생각이 든다. 과연 내가 하고 싶은 일(Role)이 무엇일까?

레드햇이 좋아 이 바닥에 뛰어들었지만 과연 내가 리눅스를 좋아하는 걸까. 솔루션이 좋은걸까...


사실 기존에 S** 상주업무 PM업무를 하기전에는 레드햇솔루션이 좋았다. 클러스터링, 가상화, 배포 등등 묘미를 자극하는 요소가 많았지만 엔터프라이즈 시장에서 위 솔루션의 경험이 주어지지 않는다면 소프트어플라이언스 형태의 요소만 알고 있을뿐, 그이상 그이하도 아니라고 보는게 내 시각이다.

그러던중 리눅스운영을 맡았고 그 시점에 성능분석, 장애조치, 알고리즘, 아키텍쳐 등등 리눅스자체만으로도 무궁무진한 캐미가 있다는 걸 조금씩 알아갔고, 이 또한 내가 하고 싶은 분야가 되어버리기도 했다.

 

여기서 작성한 내용은 시스템운영을 하다가 성능이슈 또는 장애디버깅에 낮닿뜨렸을 경우, 소프트웨어적인 입장에서 검증하기란 쉽지 않다. 그중 메모리관련이슈가 가장 많이 일어날것이고 또한 분석하기에도 난이도가 필요로 하다고 볼수 있다. 그 이유는 여러가지가 있겠지만 본 페이지에는 가상메모리(Virtual memory)에 대해서 논하도록 하겠다.


리눅스는 가상 메모리(virtual memory)란 것을 지원한다. 

이것은 메모리 사용량이 늘어남에 따라, 디스크의 일부를 마치 확장된 RAM처럼 사용할 수 있게 해주는 기술이다. 이 기술에 따르면, 커널은 실제 메모리(RAM)에 올라와 있는 메모리 블록들 중에 당장 쓰이지 않는 것을 디스크에 저장하는데, 이를 통해 사용가능한 메모리 영역을 훨씬 늘릴 수 있게 된다. 만일 디스크에 저장되었던 메모리 블록이 다시 필요하게 되면 그것은 다시 실제 메모리 안으로 올려지며, 대신 다른 블록이 디스크로 내려가게 된다. 그러나 이런 과정이 일어나고 있다는 것이 사용자에게는 전혀 보이지 않으며, 프로그램들에게도 그저 많은 양의 메모리가 있는 것처럼 보일 뿐이어서, 점유하고 있는 메모리가 디스크에 있는지 실제 메모리에 있는지 전혀 신경쓸 필요가 없게 된다. 그러나, 하드디스크를 읽고 쓰는 시간은 RAM보다 훨씬 느리기 때문에(보통 천배쯤 느리다), 프로그램의 실행은 그만큼 더디게 된다. 이렇듯 가상적인 메모리로 쓰이는 하드디스크의 영역을 `스왑 영역(swap space)'이라고 한다(swap은 바꿔치기를 한다는 뜻).


리눅스는 스왑 영역으로 일반적인 파일을 사용할 수도 있고 별도의 스왑을 위한 파티션을 사용할 수도 있다. 스왑 파티션은 속도가 빠른 반면에, 스왑 파일은 그 크기를 자유롭게 조절할 수 있다(또한 스왑 파일을 사용하면, 리눅스 설치시에 파티션을 다시 해야 할 필요없이 모든 것을 그냥 설치할 수 있다). 스왑 영역이 얼마나 많이 필요한지를 미리 알고 있다면 그만큼 스왑 파티션을 잡으면 된다. 그러나 스왑 영역이 얼마나 필요할지 확실히 모른다면, 우선 스왑 파일을 사용해서 시스템을 가동해 보고 필요한 공간이 얼마인지 파악한 후에 스왑 파티션을 잡도록 하자.

또한 리눅스에서는 여러개의 스왑 파티션과 스왑 파일을 섞어서 사용할 수 있다. 이 방법을 이용하면, 언제나 큰 용량의 스왑 영역을 잡을 필요없이 그때 그때 필요한 만큼만 스왑을 늘려줄 수 있으므로 편리하다.


여기서, 메모리 스와핑은 두가지 면에서 중요하다고 볼수 있다.

첫째, 시스템에서 특정 어플리케이션이나 프로세스가 현재 가용한 피지컬 메모리보다 많은 양의 메모리를 요청할 경우, 커널은 적은 빈도율로 사용되는 메모리 페이지를 스왑아웃해서 가용 메모리 공간을 확보한 뒤 이를 해당 프로세스에 할당해 줌으로써 프로세스 실행이 가능하게 된다. 둘째, 특정 어플리케이션이 실행되기 시작할 때 초기화를 위해서만 필요하고 이후에는 사용되지 않는 메모리 페이지들은 시스템에 의해 스왑아웃되며, 이로인해 가용해진 메모리 공간은 다른 어플리케이션이나 디스크캐쉬 용도로 활용된다. 스와핑의 단점은 아래와 같다. 메모리는 나노초 단위로 수행되는 반면, 디스크는 밀리초단위로 수행되기 때문에 상대적으로 속도가 느리다. 스왑아웃된 데이터를 메모리대신 디스크에서 액세스할 경우, 메모리에서 해당 데이터를 액세스하는 것에 비해 상대적으로 느리게되므로 결론적으로, 퍼포먼스 저하가 발생하게 된다.