Windows 7의 성능(Performance)은 어떻게 향상되었을까요? 더 빠른 시스템 응답(Responsiveness) 속도를 위해! (1)
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 확장자를 가지고 저장되게 됩니다.
이러한 맵 파일이 생성된 후, 캐시 관리자는 시스템 부팅, 응용 프로그램 로딩시에 이를 사용하게 됩니다. 즉, 캐시 관리자는 응용 프로그램이나 프로세스가 실행될 때, 이를 인터셉트(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 장치를 연결하였을 때, 아래와 같은 메시지를 보신적이 있으시죠?
지금까지 이야기를 잘 읽어오셨다면(짝짝짝), 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 기술은 시스템의 속도 향상을 위해, 사용자의 사용 형태에 따라, 미리 필요한 것들을 메모리에 로딩한다! 정도는 이제 이해하셨을 것입니다. 모든 문제의 근원은 어디서 시작된 것인가요?
바로 “메모리보다 매우 느린 하드 디스크의 속도.. 즉 페이징 파일에서 기인” 한 것입니다. 만약 디스크의 속도가 무지무지 빠르다면? 오히려 이러한 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 최적화 작업이 바로 이루어지게 됩니다.
SSD가 아니시라면, Superfetch를 사용하시길 권장합니다. 해당 서비스를 중지하셨을 경우, USB 메모리와 함께는 ReadyBoost에도 영향을 주게 되며, Prefetch에도 영향을 주어, 전반적인 Windows 7의 성능 하락에 원인이 될 수 있습니다. Fetch 기술은 사용자의 이용 형태에 따라 학습을 하게 되므로, Windows 7의 경우에는 적절한 사용자의 이용 시간이 지난 이후에 더욱 최적화된 시스템 응답 속도를 보여주게 됩니다. (자동차의 ECU도 학습이 필요한거 아시나요? ^^)
시스템 응답 속도에 관련된 부분에는 Windows Internet Explorer 8도 포함됩니다. 오늘 포스팅은 앞선 역사를 이야기를 하다보니 길어졌네요~!. 다음 편에도 이어서 시스템 응답 속도에 대한 이야기를 이어가겠습니다. 전 세션을 들으러 총총총~
Comments
Anonymous
May 14, 2009
좋은 글 감사합니다. 그런데. 윈도우 7 빌드 7127이 몇몇 테스터들에게 공개되었다는 게 사실인가요? 소식만 알려주세요..Anonymous
May 14, 2009
7127?님 안녕하세요. 공식 테스터분들에게는 7127이 배포된 적이 없는 걸로 알고 있습니다. :)Anonymous
May 15, 2009
일반 사용자들은 알 수 없는 고급 정보네요... 잘 보고 갑니다~Anonymous
May 15, 2009
5일간의 TechED 2009의 대장정이 이제 막바지로 흘러가고 있습니다. 다들 호텔도 체크아웃하고, 짐을 Registration에 맡긴 채(2불이나 합니다.) 마지막 세션을 듣던지,Anonymous
May 25, 2011
가상메모리와 pagefile.sys에 대해서 질문드리고 싶습니다. 가상메모리와 pagefile.sys의 정확한 개념을 알기 위해 이곳 저곳 많은 검색을 해봤지만 누구 하나 명확하게 알지 못하는 것 같고 문서들도 다 부정확한 듯 하고 다들 pagefile.sys의 크기 관련에만 관심이 있습니다. 가상메모리가 pagefile.sys인가요? 아니면 가상메모리는 개략적으로 RAM + pagefile.sys인가요? 본 블로그 글의 삽입된 그림에서 좌측 Virtual addresses가 virtual memory이고 우측 하단의 Disk addresses가 pagefile.sys인가요? 저는 xp 시절때 부터 pagefile.sys의 존재를 알았고 이 것이 가상메모리와 정확히 동일한 개념인줄 알았습니다. 그런데 본 블로그 글에선 다소 다르게 설명이 되어있습니다. "가상 메모리는 실제 Windows가 사용할 수 있는 메모리를 이야기하며, 밑단에는 물리적인 메모리 + 페이징 파일(Paging File)이 되게 됩니다." 제가 이 글을 보고나서 여태 제가 갖고 있던 지식에 의심을 품고 알아보기 시작했습니다. (꼬알라님 다른 글 보니깐 영문 윈도우 쓰시기도 하고 영문 링크도 거시던데 영어 읽으시는데 불편함이 없으신것 같아서 변역없이 영문 인용할게요. :D)
- Windows Help and Support (Start key + F1) 1.1 What is virtual memory? 항목을 보면 "Virtual memory combines your computer’s RAM with temporary space on your hard disk."라고 나옵니다. 1.2 paging file이라고 색이 들어간 단어를 클릭해보면 "A hidden file or files on the hard disk that Windows uses to hold parts of programs and data files that do not fit in memory. The paging file and physical memory, or random acces memory (RAM), comprise virtual memory. Windows moves data from the paging file to memory as needed and moves data from memory to the paging file to make room for new data. Also known as a swap file."라고 나옵니다. 상기 두 경우에선 마치 가상메모리 = RAM + pagefile.sys라고 설명하죠. 특히 'The paging file and RAM comprise virtual memory.'라고 매우 명확하게 못 박았습니다. 그런데, 1.3 Preventing low memory problems 항목을 보면 "Your computer has two types of memory, random access memory (RAM) and virtual memory." "The amount of information temporarily stored in a paging file is also referred to as virtual memory."라고 나옵니다. 1.4 virtual memory이라고 색이 들어간 단어를 클릭해보면 "Temporary storage used by a computer to run programs that need more memory than the computer has."라고 나옵니다. 상기 두 경우에선 마치 가상메모리 = pagefile.sys처럼 설명합니다.
- Wikipedia: Virtual memory 본 블로그 글에 삽입된 그림과 매우 흡사한 그림이 삽입되어 있습니다. 이 위키는 전문 용어들이 많고 제가 전문 지식어 없어서 뭔말인지 잘 모르겠습니다. 3.RAM, Virtual Memory, PageFile and all that stuff (members.shaw.ca/.../RAMVirtualMemoryPageFileEtc.htm) (support.microsoft.com/.../en-us 여기서 타고 들어간 것입니다.) "Windows only assigns space in the pagefile when a virtual memory page must be paged out. Thus the total available virtual memory is approximately the sum of installed RAM and the size of the pagefile(s)." "The main thing is that space in the page file will be allocated to virtual memory pages for which no corresponding RAM page is available."이라고 나옵니다. 이 글에서 제가 이해한 바는, 보통의 프로그램과 RAM 사이에는 virtual memory가 있습니다. 보통의 프로그램은 virtual address를 갖고 작업을 하며 OS가 이 virtual address를 RAM에 할당할지 pagefile.sys에 할당할지 적절히 정합니다. RAM이 충분해도 pagefile.sys를 조금 쓸 수도 있긴 하지만 무시할만 하고 일반적으로 RAM이 충분하면 거의 모든 virtual address를 RAM에 할당하고 RAM이 부족할 시에만 paging out을 하여 RAM의 정보를 pagefile.sys로 보냅니다. 즉 RAM이 부족할 때 virtual address를 pagefile.sys로 연결시키는 것이겠죠. 그리고 따라서 virtual memory의 크기는 RAM+pagefile.sys까지 가능한 것입니다. 신뢰할 수 있는 꼬알라님의 글이나 잘 이해는 안되지만 위키의 그림이나 3번의 글을 봐도 역시 virtual memory는 pagefile.sys과 다른것 같습니다. 그렇다고 virtual memory는 RAM과 pagefile.sys를 함께 이르는 말은 아닌 것 같고, 병렬적으로 놓은 RAM과 pagefile.sys를 덮어서 실제 프로그램과 이 두 RAM과 pagefile.sys를 연결해 주는 하나의 layer같다는 생각이 듭니다. 좀 추상적이죠. 제가 컴퓨터를 공부해 본적이 없어서요. 하하. :D 제 결론이 맞는건가요? 그렇다면 윈도우 도움말의 1.3과 1.4는 틀린 게 되겠군요. 그리고 저야 보급형 노트북에 램은 2기가밖에 안되서 xp의 윈도우 도움말에서 나온대로 pagefile.sys크기를 1.5배인 3기가 정도 고정해 놓을 것이지만 호기심에 궁금한 게 마지막으로 하나 있습니다. 그렇다면 극단적인 예로 특별한 작업을 하지 않는 평범한 컴퓨터에 램을 100GB 설치하면 pagefile.sys은 0 byte로 만들어도 전혀 문제가 없는 건가요? (0으로 만들면 재부팅시 자동으로 16MB인가 생기는 듯 하지만 레지스트리를 수정해서 자동생성도 막는 경우가 있는 것 같습니다.) 아니면 3번의 글에서도 나오듯 RAM이 충분해도 미약하지만 OS가 약간의 pagefile.sys를 사용한다고 하기 때문에 정말 조금, 즉 16MB정만 설정해놔도 이번엔 정말 전혀 문제가 없는건가요? 글이 좀 길어졌는데요. 서두에서도 언급했듯이 국내 블로그 돌아다녀봤자 pagefile.sys == virtual memory이고 적정 크기에 대한 논의밖에 없습니다. 꼬알라님은 정확히 알고 계실 것 같아 길지만 이렇게 질문 드립니다. :D 답변 부탁드립니다.
Anonymous
May 25, 2011
봄봄님 // 안녕하세요. 미약하지만, 제가 아는 한도에서 몇자 적어보겠습니다. :) Windows는 말씀하신 데로, 실제 메모리(RAM)을 사용하는 것이 아니라, 실제 메모리 + 페이징 파일 윗단에 가상 메모리 레이어를 만들고, 주소를 할당받아 사용합니다. 이를 일반적으로 가상 메모리라고 부르고 있습니다. 말씀하셨던 부분은 해석하기에 따라서 Virtual Memory라는 단어를 페이징 파일이란 의미보단, 실제 물리적인 메모리가 아닌, 가상의 메모리라는 의미로 적어놓은 것 같습니다. 언급하셨던 부분대로 메모리가 100G라면.. 물리적인 메모리에서 모든 것이 해결이 되겠지만, OS 입장에선 어떤 일이 발생할지 모르기에(101G를 요구하는 상황이 안생긴다는 보장이 없기에), 페이징 파일을 준비하는 것이라고 생각됩니다. :) 날카로운 지적 감사드리며, 기회가 된다면 좀더 구체적인 표현을 하도록 해당 팀에 전달해보도록 하겠습니다. 감사합니다!Anonymous
May 26, 2011
꼬알라님, 답변 감사합니다. :D 제가 추상적으로 이해한 게 맞는 것이군요. 그리고 제 기억에 xp의 윈도우 도움말에 권장 페이징파일의 크기가 1.5배였기 때문에 페이징파일의 크기가 우선 설치된 램보다 커야 하는가라는 생각을 좀 했었는데 이 역시 아니군요. 즉 '페이징파일의 크기 = 설치된램용량 + 알파'가 아니라 '페이징파일의 크기 = 0 + 알파'인거요. :D 가상메모리에 관련해서 제 지식 수준에서 거의 모든 것이 속시원하게 해결 되었습니다. VHD, 비트라커 등 종종 글을 봐왔는데 다른 글에서도 간간히 질문 남기겠습니다.Anonymous
September 15, 2015
SSD를 Windows가 설치되는 Primary Disk로 사용하지 않고, Secondary Disk로 사용하는 환경에서 Superfetch의 사용여부를 고민중인데, 참 아리송하네요. 혹시 저와 같은 경우의 케이스도 경험해 보신적이 있으신지요.....