OS X Mavericks의 메모리 압축 (Compressed Memory)

– 이 글은 2014년 8월 7일 이글루스 블로그에 올렸던 글인데 서비스 종료로 옮겨 온 글입니다

 

작년 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)을 확보할 수 있다는 개념을 설명하고 있는 장면이지요.

 

 

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

  1. 메모리 압축을 위해 WKdm 알고리즘을 사용
  2. 압축할 페이지는 가장 오래전에 사용된 순서로 선정 (Least Recently Used, LRU).
  3. 압축률은 50% 이상이며 하나의 페이지를 압축하는데, 백만분의 수 초가 걸림.
  4. 디스크를 접근하지 않으므로 전력소모를 줄일 수 있음 (SSD의 경우 수명 연장에도 도움이 됨).
  5. 메모리압축은 멀티코어를 사용하여 수행 됨.

 

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의 이점은 충분하다고 할 수 있겠습니다.

 

 

마지막으로 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의 사용량에 도달할 때 까지 페이지 압축을 전혀 수행하지 않고 있다는 점 입니다. 압축을 수행하기 위해 필요한 메모리 공간이 정말 작다는 것을 보여주는 간접적인 증거가 되겠지요.

이상 긴 글을 읽어 주셔서 감사합니다.

 

 

You may also like...

댓글 남기기