Windows 7의 성능(Performance)은 어떻게 향상되었을까요? 더 빠른 시스템 응답(Responsiveness) 속도를 위해! (1)

Windows7_h_rgb

TechED 2009 3일째 행사가 진행중입니다. Windows 7, Windows Server 2008 R2, Exchange Server 2010 등 다양한 기술에 대한 세션이 절찬리(?)에 진행되고 있습니다. 자세한 포스팅은 시간이 될 때마다, 정보 공유를 위해서 할 예정입니다. 드려야할 이야기가 참 많아서, 한동안 포스팅 거리는 안떨어질거 같습니다. (그냥 주말에 하루 날잡아서, 꼬알라 TechED를 진행해버릴까도 혼자 고민중입니다. :) )

IT에 종사하시는 분들뿐만 아니라, Windows를 사용하시는 많은 분들께서 한결같이 원하시는 플랫폼의 요소는 빠른 속도일거라 생각합니다. 시스템 부팅/종료와 관련되어서는 간략하지만 Windows 7의 어떤 면이 향상 및 개선되고, 추가되어서 빠른 속도를 보여주는지에 대해서 아실 수 있으셨을 거라 생각합니다. 오늘은 시스템 사용시 응답 속도에 대해서 살펴보죠.

성능 관련 포스팅의 1편인 시스템 부팅에 대한 포스팅에서 부팅 시간을 확인하시기 위해서는 클린 인스톨 후 최소 5번의 부팅을 하셔야 합니다. 왜냐면, 시스템 부팅 최적화를 위해서 Windows는 Prefetch이 필요하기 때문입니다. Prefetch가 무슨 말이냐고요? 오늘 한번 살펴보죠~!

시스템의 응답 속도라는 것은 실제 플랫폼을 사용할 경우, 얼마나 빠르게 Windows가 응답을 하느냐입니다. 이 역시 사용자층이 워낙 다양하기 때문에, 시스템의 사용 형태에 따라서, 최적화를 해야할 요소가 다 달라지게 됩니다. 시스템의 응답 속도에 대한 시도는 Windows XP의 Prefetch, 그리고 Windows Vista의 Superfetch에서부터 이야기를 드려야 합니다. Fetch라는 단어를 영한 사전에서 찾아보면 불러오다.. 이런 의미를 가지고 있고요. Pre라는 단어가 붙는 걸로 봐서는 미리 불러오는 기술이겠죠?

아주 간단하게, Windows의 메모리 관리 기술을 살펴보면, 가상 메모리(Virtual Memory)부터 이야기를 해야 합니다. MS-DOS 시절까지는 운영 체제가 실제 메모리를 사용하였고, 메모리 부족시에는 프로그램이나 운영 체제에서 더이상 추가적인 동작을 할 수 없습니다만, 가상 메모리라는 컨셉이 나오면서, 물리적인 메모리의 부족에 대한 한계를 넘어섰습니다.

가상 메모리는 실제 Windows가 사용할 수 있는 메모리를 이야기하며, 밑단에는 물리적인 메모리 + 페이징 파일(Paging File)이 되게 됩니다. 메모리가 512MB이고, 페이징 파일을 3.5GB를 잡게 되면, Windows가 사용할 수 있는 메모리는 4G가 되는 것이죠. 이해되셨죠? Windows는 모든 프로세스를 실제 메모리에 직접 할당하는 것이 아니라, 가상 메모리에 할당하게 되며, 이는 내부적으로 실제 메모리와 페이징 파일로의 배치가 일어나게 됩니다. 물리적인 메모리가 모두 찼을 경우엔 페이징 파일에 배치시키는 것이죠. 당연히 메모리 속도와 페이징 파일이 저장된 하드 디스크의 속도는 어마어마하게 속도차가 나므로, 메모리가 부족하면 하드 디스크를 벅벅 긁고, 속도가 느려지는 것도 이에 기인한 결과입니다. 또한 물리적인 메모리에 있었던 데이터를 필요시 페이징 파일로 이동하고(이를 Swapping한다고 하죠.), 다시 페이징 파일에서 메모리로 옮기는 경우도 발생합니다. 이 역시 시스템의 부하로 작용하게 됩니다. 따라서 물리적인 메모리가 많을수록 플랫폼의 속도가 빠르게 느껴지시는 것이죠.

다시 Prefetch 이야기로 돌아가서… PreFetch 작업이 시스템의 성능에 영향을 주기 위해, Windows XP의 캐시 관리자(Cache Manager)는 응용 프로그램 실행시, 그리고 운영 체제 부팅시에 디스크와 메모리, 메모리와 가상 메모리 사이에 이동되는 데이터들을 모니터링합니다. 캐시 관리자가 이러한 일들을 모니터링하면서, 각각의 응용 프로그램이나 프로세스가 사용하는 모든 디렉터리와 파일에 대해서 맵(Map) 파일을 작성하게 됩니다. 이러한 맵 파일은 \Windows\Prefetch라는 폴더에 .pf 확장자를 가지고 저장되게 됩니다.

image

이러한 맵 파일이 생성된 후, 캐시 관리자는 시스템 부팅, 응용 프로그램 로딩시에 이를 사용하게 됩니다. 즉, 캐시 관리자는 응용 프로그램이나 프로세스가 실행될 때, 이를 인터셉트(Intercept)하여, \Windows\Prefetch 폴더에 해당되는 맵 파일이 있는지 확인합니다. 만약 있다면 캐시 관리자는 메모리 관리자(Memory Manager)를 호출하여, 맵 파일내 정보를 이용하여 데이터와 코드를 메모리로 로딩할 것을 요청합니다. 이러한 Prefetch 작업이 완료되게 되면, 캐시 관리자는 응용 프로그램이나 프로세스의 로딩을 계속하게 됩니다.

실제로 응용 프로그램이나 프로세스가 데이터나 코드가 필요해졌을 경우, Windows에 의해서 미리 메모리로 로딩되어져 있기 때문에, 디스크에서 읽을 필요가 없으므로, 빠른 로딩 처리 및 응답을 보여주게 됩니다. 그리고, 이러한 Prefetch 작업의 효율성을 위해, Windows는 주기적으로 맵 파일내 내용을 분석하여, 순서에 따라 디렉터리와 파일들을 정리해 놓습니다. 이러한 정보를 \Windows\PreFetch 폴더내 Layout.ini파일에 저장해 놓고, 이 정보를 이용하여 디스크 조각 모음은 해당 폴더와 파일이 연속된 공간을 차지하게 하죠.

Windows Vista에서는 Superfetch라는 기술을 선보였습니다. Superfetch는 Prefetch에서 부족했던 몇몇 요소들을 훌륭하게 보완하여, 시스템의 응답 속도 향상에 도움을 주었습니다. Windows XP의 Prefetch 기술은 몇가지 큰 문제점이 있습니다. Prefetch 기술은 파일과 데이터를 응용 프로그램 요청 전에 미리 로딩해 놓는 기술이었습니다. 그러나, 가상 메모리는 한정된 용량을 가지고 있기 때문에, 다른 응용 프로그램이 메모리를 필요로 할 경우, Prefetch해놓은 데이터를 하드 디스크내 페이징 파일로 이동시켜야만 합니다.(시스템에 부하가 걸린다고 언급했죠?) 이 데이터가 다시 필요하다면, 다시 페이징 파일로 부터 메모리로 로딩해야 되고, 결국 성능 향상에 약점으로 이어지게 되었다는 것입니다.

Superfetch는 이를 위해 몇가지 데이터를 더 가지고 데이터를 메모리로 로딩하게 됩니다. 앞서 설명드렸던 맵 파일에 사용자가 해당 프로그램을 얼마나 종종, 언제, 얼마동안 사용하는지 등의 사용자의 사용 패턴을 기록한다는 것입니다. Superfetch는 또한 Prefetch된 데이터가 메모리에서 페이징 파일로 스와핑되었을 경우, 이를 감지하고, 페이징을 야기한 응용 프로그램이 종료되었을 경우, 다시 해당 데이터를 메모리로 이동시키게 됩니다. 따라서, 실제 응용 프로그램이 해당 데이터를 접근하려 했을 경우, 메모리에서 빠르게 찾을 수 있게 도와준다는 것입니다.

하암~ Windows 7의 시스템 응답 속도 향상 이야기를 하는데 뭐가 그리 사전 이야기가 많냐고 되물으실 수도 있을 것 같습니다. :) 원래.. 뭐든지 개선점을 살펴보려면, 기존에 어떤 역사를 가지고 있었는지도 중요하지 않나요? 이제 하나 남았습니다. 바로 ReadyBoost입니다. 일정 속도 상의 읽기/쓰기 접근을 보이는 USB 장치를 연결하였을 때, 아래와 같은 메시지를 보신적이 있으시죠?

image

지금까지 이야기를 잘 읽어오셨다면(짝짝짝), Windows는 가상 메모리 구조를 사용하기에, 물리적인 메모리와 시스템의 페이징 파일을 이용하고, 필요시 이를 왔다리 갔다리 한다는 것을 이해하셨을 것입니다. 시스템의 하드 디스크의 속도가 페이징 파일의 처리를 늦게 하는 요소가 되었다는 것도 이해가 되셨을 것입니다. 그렇다면 이 페이징 파일을 속도가 빠른 USB 플래시 메모리에 담는다면 어떨까요? 바로 그 기술이 Windows ReadyBoost입니다. Superfetch가 메모리 페이지를 하드 디스크의 페이징 파일로 이동시키는 것이 아니라, USB 메모리로 이동하는 것이 Windows ReadyBoost입니다. Windows ReadyBoost 기술을 사용하시던 도중, USB 메모리를 제거하시더라도 이를 Windows Vista는 감지하기에 시스템의 안정성에는 전혀 영향을 주지 않습니다. 또한 USB 메모리에 저장되는 데이터는 암호화가 되므로, 보안에도 문제가 없습니다.

ReadyBoost를 활용해서 메모리가 적은 머신이나 성능이 낮은 머신의 경우에는 시스템의 메인 보드에 적절한 용량의 USB 메모리를 기본 탑재하여 시스템의 성능을 향상하도록 PC 제조사에선 시도하고 있습니다.

이제 Windows 7의 이야기를 할 수 있게 되었습니다. Windows 7도 여전히 Superfetch 기술을 사용하고 있습니다. Windows 7에서 개선된 Superfetch는 아래와 같이 정리할 수 있습니다.

  • 더욱 조용해졌다?
    사용자가 실제 작업을 하는 경우(Active인 경우), 시스템이 Prefetch하는 작업을 최소화하였습니다. 좀더 많은 리소스를 사용자에게 할당할 수 있는 것이죠.
  • 좀더 실제 사용자의 사용 형태를 더 잘 추적 가능하도록 최적화.
  • SSD에 최적화.
    아래에서 추가 설명드리죠 :)
  • 불필요한 파일에 대한 Prefetch을 전반적으로 줄였음.
    매우 큰 파일, 쓰기 전용 파일(예를 들어 로그파일), 낮은 메모리를 가진 시스템

Fetch 기술은 시스템의 속도 향상을 위해, 사용자의 사용 형태에 따라, 미리 필요한 것들을 메모리에 로딩한다! 정도는 이제 이해하셨을 것입니다. 모든 문제의 근원은 어디서 시작된 것인가요?

image

바로 “메모리보다 매우 느린 하드 디스크의 속도.. 즉 페이징 파일에서 기인” 한 것입니다. 만약 디스크의 속도가 무지무지 빠르다면? 오히려 이러한 Fetch 기술이 시스템 부팅 후에는 사용자의 사용 가능한 리소스의 일부를 차지하고 있겠죠? 네! 맞습니다. 기존 하드 디스크보다 더 빠른 하드 디스크.. 즉 SSD(Solid State Drive)에 대한 이야기입니다. Windows 7은 SSD에 대해서도 최적화되어져 있습니다. Fetch 기술이 필요한 SSD? 필요하지 않은 SSD? 대략 어느선에서 구분할 수 있을까요? TechED 2009에서 본사 Performance 팀의 PM인 “Bill Karagounis”에 따르면(꼬알라도 사실 궁금했었거든요) Windows 체험 지수의 주 하드 디스크 인덱스가 6.5이상인 경우에는 Superfetch 서비스를 사용 중지할 것을 권장하였습니다. 꼬알라의 경우엔 7.5가 나왔기에.. 서비스에서 Superfetch 서비스를 중단하여, Fetch 기술을 사용하지 않고 있습니다. Windows 7에서 SSD의 경우에는 이를 인지하여, 별도의 디스크 조각 모음도 필요하지 않도록 설정되는 것과 같은 SSD 최적화 작업이 바로 이루어지게 됩니다.

image image

SSD가 아니시라면, Superfetch를 사용하시길 권장합니다. 해당 서비스를 중지하셨을 경우, USB 메모리와 함께는 ReadyBoost에도 영향을 주게 되며, Prefetch에도 영향을 주어, 전반적인 Windows 7의 성능 하락에 원인이 될 수 있습니다. Fetch 기술은 사용자의 이용 형태에 따라 학습을 하게 되므로, Windows 7의 경우에는 적절한 사용자의 이용 시간이 지난 이후에 더욱 최적화된 시스템 응답 속도를 보여주게 됩니다. (자동차의 ECU도 학습이 필요한거 아시나요? ^^)

시스템 응답 속도에 관련된 부분에는 Windows Internet Explorer 8도 포함됩니다. 오늘 포스팅은 앞선 역사를 이야기를 하다보니 길어졌네요~!. 다음 편에도 이어서 시스템 응답 속도에 대한 이야기를 이어가겠습니다. 전 세션을 들으러 총총총~