매버릭스에 적용된 ‘메모리 압축’…어떻게 구현될까?

 

작년 WWDC 2013 키노트에서 OS X Mavericks가 발표될 때 개인적으로 가장 눈여겨봤던 부분이라 꼭 한번 다루고 싶었는데, 다음 버전인 Yosemite가 발표된 시점에서 밀린 숙제를 하는 느낌으로 포스팅을 하게 되었네요. 이번 글에서 다룰 내용은 Mavericks에서 추가된 새로운 메모리 관리 방법인 Compressed Memory입니다.

Compressed Memory는 주 메모리(RAM)를 여러 개의 페이지로 나누어서 관리하는 가상메모리(virtual memory system)와 관련된 기술입니다. 가상메모리 시스템에서는 애플리케이션에 실제 설치된 RAM 용량보다 많은 메모리 공간을 제공하기 위해서 최근에 자주 사용된 페이지만 RAM 상에 남겨두고 오랫동안 사용되지 않은 페이지는 디스크로 옮겨서 swap 파일의 형태로 저장합니다.  Swap 파일에 저장된 페이지를 다시 사용할 일이 발생하면 RAM 상의 또 다른 오래된 페이지를 swap 파일로 내보내고 필요한 페이지는 다시 RAM 상에 불러오는데 이러한 작업을 페이징이라고 하지요.

Compressed Memory는 디스크의 성능 향상 속도와 CPU의 성능 향상 속도의 차이에 의해서 OS X에 적용되게 되었습니다. 최근 수십 년간 디스크의 성능이 향상되는 속도에 비해 CPU의 성능 향상이 빠른 시절이 계속되다 보니 페이징 동작을 할 때, 느린 디스크로 페이지를 복사하여 이동시키는 것보다 빠른 CPU가 복잡한 계산을 하더라도 디스크를 건드리지 않고 RAM 내부에서만 페이지를 압축해서 공간을 확보하는 방법이 더 빨라지게 되었기 때문이지요.

아래 사진은 WWDC 2013 키노트 영상 중에 Compressed Memory를 가장 잘 설명한다고 생각되는 장면을 캡처한 것입니다. 애플의 페더리기 부사장(Senior Vice President)이 RAM 상에서 사용되고 있지 않은 Inactive 페이지들이 Memory Compression을 통해 작게 줄어들기 때문에 디스크 접근 없이도 RAM 상에 여유공간(Free space)을 확보할 수 있다는 개념을 설명하고 있습니다.

 

▲ WWDC 2013 OS X Mavericks Compressed Memory 발표 장면

 

애플에서 공개한 OS X Mavericks Core Technologies Overview 문서를 보면 Compressed Memory에 대해 아래와 같이 간단히 언급하고 있습니다. 문서에서는 Compressed Memory를 구현한 가장 큰 목적으로 프로그램의 응답성(Responsiveness)과 전력소모 두 가지를 모두 향상시키는 것인데요. 아래의 항목들을 염두에 두면서 각 항목이 어떻게 기여하는지 살펴보도록 하겠습니다.

- 메모리 압축을 위해 WKdm 알고리즘을 사용

- 압축할 페이지는 가장 오래전에 사용된 순서로 선정 (Least Recently Used, LRU).

- 압축률은 50% 이상이며 하나의 페이지를 압축하는데, 백만 분의 수 초가 걸림.

- 디스크에 접근하지 않으므로 전력소모를 줄일 수 있음 (SSD의 경우 수명 연장에도 도움이 됨).

- 메모리압축은 멀티코어를 사용하여 수행 됨.

 

먼저 압축을 위한 알고리즘에 대해 이야기하도록 하겠습니다. Compressed Memory에 사용된 압축 알고리즘인 WKdm 알고리즘은 1999년 usenix 학회에서 발표된 “The Case for Compressed Caching in Virtual Memory Systems“라는 제목의 논문에 자세히 설명되어 있습니다. WKdm 알고리즘은 제1 저자와 제2 저자인 Paul R. Wilson과 Scott F. Kaplan의 첫 글자를 따서 이름이 지어진 걸로 보이며, 저자들은 RAM 상의 페이지를 압축하기 위한 알고리즘은 다음의 조건을 갖춰야 한다고 말합니다.

- 압축하는 속도와 압축을 푸는 데 걸리는 시간이 비슷할 것

- 압축을 하는 데 필요한 메모리의 크기가 작을 것

- 압축 속도가 빠르고 압축 성능이 일정 수준 이상일 것

위의 조건들을 살펴보시면 직관적으로 수긍이 가실 겁니다. 물론 WKdm 알고리즘은 아래 조건을 다 만족하기 때문에 논문의 도입부에서 조건들을 언급한 것이지요.

WKdm 알고리즘은 32-bit data 16개로 이루어진 작은 양의 디렉토리와 압축된 결과를 쓸 메모리 공간만 있으면 압축할 대상의 크기에 상관없이 압축을 수행할 수 있어 다양한 페이지 크기를 지원하는 데 유리합니다. 또한, 동작이 간단하고 압축할 데이터를 한 번만 읽어 들이면 되기 때문에 적은 메모리를 사용하면서도 빠르게 수행될 수 있습니다. (구글링하시면 소스코드도 쉽게 구할 수 있어서 알고리즘 설명은 생략합니다.) 압축률의 경우는 평균적으로 페이지를 반 정도의 크기로 압축할 수 있다고 하니 메모리의 추가 공간을 확보하기 위한 용도로는 충분한 성능이라고 생각합니다. Compressed Memory가 탄생할 수 있었던 기반을 만들어준 논문의 저자들에게 이 글을 통해서 감사의 마음을 전하고 싶습니다.

사실 가상 메모리의 페이지를 디스크의 swap 파일로 내보내지 말고 램(RAM) 내부에서만 압축하자는 생각은 애플이 새로 제안한 것이 아니라 Compressed Memory가 나오기 한참 전부터 있었던 생각입니다. WKdm 알고리즘 자체도 가상 메모리 압축을 효율적으로 구현하기 위해 제안된 알고리즘이지요. 관련된 논문을 검색해 보시면 가상 메모리의 어떤 부분을 어떻게 압축하는 것이 좋은지에 대해 다양한 연구결과들을 찾으실 수 있을 겁니다. 그럼에도 2013년이 되어서야 상용 OS에 이 기술이 적용된 이유는 그동안에는 CPU의 성능이 좋지 못하여 구현하는 노력에 비해 충분한 성능 향상을 얻지 못했기 때문입니다.

Compressed Memory가 사용자 경험에 영향을 주지 않으면서 자연스럽게 동작하려면 특히 CPU가 멀티 코어를 지원하는 것이 중요한데 하나의 코어가 원래 작업을 수행하는 동안 나머지 코어들이 메모리 압축을 도와줄 수 있다면 원래 작업의 진행 속도가 압축 작업에 영향을 받지 않을 수 있기 때문이지요. 인텔의 듀얼 코어 CPU가 2006년 이후에나 보급되기 시작했고 쿼드 코어 이상의 CPU가 널리 퍼진 것도 수년 전이니 애플에서는 지금쯤이 Compressed Memory 기술을 적용하기 알맞은 시점이라고 생각한 듯싶습니다. 이러한 이유로 Compressed Memory는 하드웨어의 변화를 소프트웨어가 잘 따라간 훌륭한 경우라고 생각합니다.

Compressed Memory를 통해 얻어지는 장점인 전력소모 감소와 응답성 향상은 따로 떼어서 생각할 수 없는 동전의 양면과 같습니다. RAM 상에 새로운 페이지들을 할당하는 데 걸리는 시간을 줄이면 응답성이 향상되고 CPU는 그만큼 빨리 작업을 끝내고 대기모드로 들어갈 수 있기 때문에 전력소모는 자연스럽게 감소하게 되는 것이지요. 또한, RAM과 디스크에 동시 접근하는 경우보다 RAM만 접근하면 디스크에서 사용하는 전력을 줄일 수 있다는 부가적인 장점도 있습니다. 다만 전력 소모는 디스크보다 CPU 쪽이 월등히 많으므로 Compressed Memory가 장점을 발휘하려면 페이지를 압축하는 데 걸리는 시간이 페이지를 디스크로 옮기는 시간보다 반드시 빨라야만 합니다.

그래서 대강의 계산이지만, Compressed Memory를 통해 RAM 상에 1GB가량의 여유 공간을 마련하는 시간과 1GB 용량의 페이지들을 디스크로 옮기는 시간을 비교해 보면서 상대적인 장점을 살펴보도록 하겠습니다. 먼저 위에서 언급한 OS X Mavericks Technologies overview 자료에는 4KB 용량의 페이지 하나를 압축하는데 수백만 분의 수초가 걸린다고 합니다. 편의상 4KB 압축에 5마이크로 세컨드가 걸린다고 가정하면 Compressed Memory가 2GB를 1GB로 압축해 1GB 용량을 확보하는 데 걸리는 시간은 다음과 같습니다. (현재 판매되는 모든 PC는 듀얼코어 이상의 사양이니 압축은 듀얼 코어로 수행한다고 가정하겠습니다.)

5 마이크로 세컨드 x (2GB/4KB) / 2(듀얼코어) = 약 1.3초

이번에는 하드디스크에 swap 파일을 생성하는 기존 방식의 페이징으로 1GB의 데이터를 지금까지 출시된 가장 빠른 SSD로 옮긴다고 가정하고 필요한 시간을 계산해 보도록 하겠습니다. Anandtech의 2013 MacBook Air review를 보면 PCIe 기반의 SSD가 최대 714MB/s 속도로 write가 가능하다고 하니 일단 이 값을 사용하면, 1GB / 714MB/s = 약 1.4초 정도의 시간이 필요하다는 계산이 나옵니다. 하지만 714MB/s는 벤치마크에서 최대속도를 측정하기 위해 이상적인 상황을 만든 경우에 나오는 속도이기 때문에 실제 사용의 경우에는 1/2 정도의 속도도 나오기 힘듭니다. 그리고  PCIe 인터페이스가 아닌 기존의 SSD는 다시 속도가 1/2 정도로 떨어지기 때문에 대부분 PC는 Compressed Memory를 사용할 경우보다 페이징에 훨씬 많은 시간을 소모하게 됩니다. 만약에 쿼드 코어 CPU가 사용된다면, 차이는 더욱 벌어질 것이니 Compressed Memory의 이점은 충분하다고 할 수 있겠습니다.

 

Activity_monitor_screen_shot

▲ 이미지 출처 – Ars Technica OS X Mavericks review (첨삭 추가)

 

마지막으로 Compressed Memory의 동작을 Mavericks에서 어떻게 확인할 수 있는지 언급하면서 글을 마무리하도록 하겠습니다. 위의 그림들은 Ars Technica의 OS X Mavericks Review에서 가져왔는데 OS X의 활성 상태 보기에서 메모리 상태창을 캡처한 것입니다. 그림의 위쪽과 같이 메모리 사용량이 설치된 메모리의 크기에 도달하기 직전까지는 swap 파일도 생성하지 않고 메모리도 압축하지 않지만 그림의 아래쪽과 같이 사용량이 메모리의 크기를 넘어서면 Compressed Memory가 동작하면서 압축된 페이지를 생성합니다.

(Compressed 항목) 16GB 메모리에 24GB 정도의 내용을 담을 수 있는 것과 WKdm 알고리즘의 50% 압축률을 고려하면, 8GB는 압축되지 않은 상태로, 나머지 8GB는 압축된 상태로 16GB에 해당하는 페이지들을 담고 있는 것으로 보입니다. Swap 파일이 8GB가 생성되지 않고 26.5MB만 생성된 것이 인상적이네요. 개인적으로는 저 숫자만 봐도 PC가 빨라진 것 같은 느낌이 강하게 듭니다. 그리고 또 한가지 인상적인 점은 16GB 메모리가 있는 상황에서 15.99GB의 사용량에 도달할 때까지 페이지 압축을 전혀 수행하지 않고 있다는 점입니다. 압축을 수행하기 데 필요한 메모리 공간이 정말 작다는 것을 보여주는 간접적인 증거가 되겠지요.

 




Comments

Leave a comment

Your email address will not be published. Required fields are marked *

You may also like