다음을 통해 공유


메모리 및 디스크 공간 사용을 줄여 앱 성능 향상

본 가이드에서는 크게 두 가지 방법으로 Windows 애플리케이션의 성능을 개선하는 방법을 설명합니다:

메모리 사용량 최소화

Windows 앱에서 사용하는 메모리 양을 최소화하는 데는 다음과 같은 여러 가지 방법아 있습니다.

  • 포그라운드 메모리 사용량 절감
  • 백그라운드 작업 최소화
  • 백그라운드에 있는 동안 리소스 해제
  • 애플리케이션에서 메모리 누수 방지

메모리 사용량을 제대로 최소화하기 위해서는 먼저 다음을 이해하는 것이 중요합니다.

분석할 시스템 추적이 확보되면 메모리 사용량을 절감하기 위해 추적 분석을 적용하기 위한 지침을 권장합니다.

작업 집합, 동적 메모리 및 가상 할당

애플리케이션의 작업 집합(현재 메모리에 상주하는 가상 주소 공간의 페이지 집합)은 앱의 메모리 사용량을 측정하는 한 가지 척도입니다.

애플리케이션이 사용하는 메모리의 양은 런타임 성능과 시스템 전체의 반응성에 영향을 미칩니다. 메모리 사용을 최소화하면 더 많은 메모리에 액세스하는 데 드는 CPU 비용을 줄여 앱의 성능을 향상시키는 데 도움이 됩니다. 메모리 사용량이 적으면 애플리케이션이 다른 메모리 콘텐츠를 대체하지 않기 때문에 시스템 반응성과 전반적인 앱 사용자 경험에도 유리합니다.

메모리 변위는 시스템이 최근에 액세스한 메모리 내 콘텐츠를 유지하려고 시도할 때 발생할 수 있으며, 필요한 경우 이전에 사용한 콘텐츠를 잘라내고 페이지 아웃합니다. 사용자가 셸 또는 다른 애플리케이션으로 다시 전환할 때 필요한 데이터가 메모리 내에 상주하지 않으면 디스크에서 데이터를 읽어야 합니다. 이 프로세스로 인해 사용자가 속도 저하를 느낄 수 있습니다.

애플리케이션에서 사용하는 메모리에는 두 가지 핵심 요소인 1) 동적 메모리와 2) 파일 지원 메모리가 있습니다. 파일 백업 메모리 사용량은 애플리케이션에서 사용하는 데이터베이스와 같은 이진 및 데이터 파일에서 발생합니다. 이는 대개 애플리케이션의 메모리 사용량에서 큰 비중을 차지하지 않으며, 상수인 경우가 많습니다. (데이터 처리 애플리케이션, 코드 컴파일 등은 예외입니다.) 메모리 사용량의 더 중요한 근원이자 누수가 나타나는 곳은 동적 메모리입니다.

동적 메모리는 애플리케이션이 메모리 할당 규칙을 사용하여 할당하는 가상 메모리에 해당합니다. 시스템 재부팅 시에도 지속되는 파일 백업 메모리와 다르게, 동적 메모리는 애플리케이션의 수명 기간에만 존재합니다. 동적 메모리는 일반적으로 메모리 사용량의 중요한 근원이며 메모리 누수가 발생하는 위치입니다.

가상 할당 루틴 (VirtualAlloc)은 메모리 할당에 사용되는 애플리케이션 계층 루틴과는 별개로 Windows 애플리케이션의 메모리 할당 요청을 처리합니다. 애플리케이션에 할당된 모든 메모리가 항상 메모리에 상주하는 것은 아니지만, 이러한 할당을 분석하면 애플리케이션의 메모리 사용량을 일관성 있게 파악할 수 있습니다.

애플리케이션의 메모리 사용량을 파악하고 개선할 부분을 찾으려면 아래에 명시된 대로 VirtualAllocation 추적을 캡처하는 것이 좋습니다.

메모리 사용량 분석을 위한 시스템 추적 캡처

일정 기간 중 장치 활동을 기록하는 것을 시스템 추적이라고 합니다. 시스템 추적은 보고서를 생성하고 앱의 성능을 개선하는 방법을 파악하는 데 도움이 되는 추적 파일을 생성합니다.

추적의 길이는 다양할 수 있습니다.

  • 짧은 실행 추적으로 애플리케이션의 시작을 캡처할 수 있습니다. 여기에는 앱이 비활성 상태로 전환되어 애플리케이션 창이 최소화되거나 애플리케이션 프로세스가 지속되는 동안 애플리케이션 창이 닫히는 경우가 포함될 수 있습니다.
  • 일반적으로 몇 분 동안의 긴 실행 추적은 메모리 누수를 진단하는 데 유용합니다. 시간이 지나도 메모리 사용량이 계속 증가하는 추세를 보인다면, 일반적으로 메모리 누수를 암시합니다.

메모리 사용량 모니터링에 사용할 수 있는 여러 도구:

이 문서의 목적에 따라 Windows 성능 분석기 사용에 중점을 두겠습니다. Visual Studio 성능 프로파일러, Windows 성능 도구 키트 및 PerfView 중 선택에서 애플리케이션 성능 프로파일링을 위한 도구 선택에 관해 자세히 알아보세요.

추적 캡처 방법:

  1. 명령줄(PowerShell 또는 명령 프롬프트)을 관리자 모드에서 엽니다. 관리자 모드에서 실행하지 않으면 오류 코드: 0xc5585011, "시스템 성능을 프로파일링하기 위해 정책을 활성화하지 못했습니다"가 표시될 수 있습니다.)

  2. wpr -start VirtualAllocation -filemode 명령을 입력합니다.

  3. 조사 중인 시나리오를 실행합니다. (가령 애플리케이션을 시작합니다.)

  4. wpr -stop Trace.etl 명령을 입력합니다.

시스템 추적 분석

앱의 어느 기능에 메모리가 할당되어 있고 줄일 수 있는지 확인하려면, 이제 캡처한 시스템 추적을 분석해야 합니다 추적 분석 방법:

  1. 다음 명령을 입력하여 성능 분석기로 추적을 엽니다. wpa.exe Trace.etl

  2. 그래프 탐색기 창에서 메모리 섹션을 확장하고 총 커밋를 마우스 오른쪽 단추로 클릭한 다음 새 분석 보기에 그래프 추가를 선택합니다.

  3. 보기 편집기를 열려면 설정 기어를 클릭하고 다음 열 배열: 프로세스, 커밋 형식, 커밋 스택크기를 선택합니다.

  4. 크기 열 머리글을 클릭하면 결과가 내림차순으로 정렬됩니다. 커밋 스택은 메모리가 할당되는 코드 경로를 표시합니다. 이러한 결과는 할당 이유 이해에 도움이 될 수 있습니다. 규모별로 정렬하면 더 큰 할당에 집중하고 최적화할 기회가 있는지 조사할 수 있습니다.

  5. 마우스 오른쪽 단추로 프로세스를 클릭하고 선택 항목으로 필터링을 선택하여 분석하려는 프로세스로 필터링합니다.

  6. 뷰포트에서 관심 지역을 확대하려면 범위를 선택하고 그래프를 마우스 오른쪽 단추로 클릭한 다음 확대/축소를 선택합니다.

  7. 커밋 스택을 탐색하여 어떤 함수가 메모리를 할당받았는지 파악합니다. 커밋 스택에는 로드된 기호가 필요합니다. 기호를 로드하려면 상단 탐색 메뉴 모음에서 추적할>로드 기호를 선택합니다.

    Windows 성능 분석기 메모리 추적 스크린샷

메모리 사용량을 감소를 위해 추적 분석 적용

할당된 메모리를 분석할 때 메모리 사용량을 최소화할 수 있는 위치를 결정하는 데 유용한 단서를 찾을 수 있습니다.

메모리 사용량을 절감하기 위해 코드 업데이트에 추적 분석을 적용할 때 고려해야 할 몇 가지 영역은 다음과 같습니다.

  • 포그라운드에서 메모리 사용량 줄이기: 메모리 추적을 분석하면 포그라운드에서 불필요한 메모리 사용량을 파악하고 코드를 업데이트하여 해당 사용량을 줄이거나 제거할 수 있습니다.

  • 백그라운드에서 작업 최소화하기: 시스템에는 프로세스 작업 집합에서 페이지를 노후화시키는 정책이 있습니다. 백그라운드에서 메모리를 더 적게 사용하면 애플리케이션 메모리를 더 적게 유지하여 시스템의 효율성을 높입니다. 백그라운드 작업을 최소화하여 전력 소비와 배터리 수명을 개선하는 방법을 자세히 알아두면 백그라운드 작업 중에도 메모리 사용량을 줄일 수 있습니다.

  • 백그라운드에서 리소스 해제: 런타임에 애플리케이션은 일부 메모리 캐시를 생성하고 UI를 지원하기 위해 그래픽 할당을 만들 수 있습니다. 애플리케이션이 최소화되거나 표시되지 않을 때 이러한 할당의 해제가 가능합니다. 애플리케이션은 메모리 부족 알림을 등록하여 이러한 조치를 취할 수 있지만, 일정 기간 사용하지 않은 후 애플리케이션이 비활성 상태라고 판단되면 메모리를 해제하는 것이 더 나은 전략일 수 있습니다. 이 비사용 기간은 애플리케이션에 따라 다를 수 있으므로, 비활성 사용의 가능한 지표는 몇 분에서 1/2시간 이상까지 다를 수 있습니다. 이러한 메모리 절약과 반응성의 균형을 맞추는 데 주의를 기울여야 합니다. 캐시를 다시 빌드하는 데 비용이 많이 소요되면, 애플리케이션이 해당 캐시를 애플리케이션의 수명 기간 중 유지하도록 선택할 수 있습니다.

  • 애플리케이션에서 메모리 누수가 없도록 확인: 메모리 누수를 확인하려면 먼저 애플리케이션 메모리 사용량이 정체되거나 특정 값 이상으로 증가하지 않는 정상 상태 벤치마크를 설정합니다. 애플리케이션을 계속 사용하거나 백그라운드에서 유휴 상태로 두어 이 정상 상태를 확립할 수 있습니다. 캡처한 추적을 사용하여 메모리 누수 가능성을 식별하면 코드에서 해당 메모리가 할당되는 위치와 용도가 다한 후 메모리를 해제할 방법을 찾을 수 있습니다. 애플리케이션이 실행되는 동안 메모리가 계속 증가한다면, 이는 메모리 누수일 가능성이 높습니다. 추적 내 증가에 해당하는 지역을 확대하고 커밋 스택을 주의 깊게 분석합니다.

효율적인 디스크 공간 사용

디스크 공간은 애플리케이션이 비활성 상태(코드를 실행하지 않음)에 저장되어 있을 때의 크기를 나타냅니다. 애플리케이션이 디스크 공간을 많이 차지한다면 최적화의 기회가 될 수 있습니다.

앱의 디스크 공간을 줄이면 성능을 향상시킬 수 있는 몇 가지 방법이 있습니다.

  • 디스크가 가득 차면 파일 시스템은 더 이상 새 콘텐츠를 연속적인 방식으로 저장할 수 없습니다. 전체 디스크가 조각화되어 인접하지 않은 섹터에 새 콘텐츠가 저장됩니다. 이는 해당 콘텐츠가 디스크에서 액세스될 때 대기 시간이 길어진다는 의미입니다. 콘텐츠가 연속적이고 순차적으로 또는 더 큰 IO를 사용하여 액세스할 수 있는 경우, IO 시스템은 훨씬 더 나은 디스크 처리량을 보장합니다.

  • 디스크가 가득 차면 SSD 기반 시스템에서 쓰기 대기 시간이 길어질 수 있습니다. 쓰기를 흡수할 빈 셀이 적으면 쓰기 시 읽기-수정-쓰기 작업이 발생하여 성능 저하가 생길 수 있습니다.

  • 디스크가 가득 차면 애플리케이션을 업데이트하는 데 방해가 될 가능성이 있습니다. OS는 복원력이 뛰어나고 시스템을 최신 상태로 안전하게 유지할 수 있지만, 사용 가능한 디스크 공간이 부족하더라도 앱 업데이트를 위한 콘텐츠를 준비할 수 있는 디스크 공간이 충분하면 더 빠르고 원활한 업데이트 환경을 만들 수 있습니다.

  • 런타임에 상당한 대용량 디스크에 액세스해야 한다면 메모리 사용량도 증가하게 됩니다. 이는 보통 애플리케이션과 시스템 전반의 반응성에 영향을 미칩니다. 더불어 런타임에 디스크 공간의 일부만 필요한 경우 애플리케이션이 디스크 공간을 비효율적으로 사용하고 있을지 모릅니다.

디스크 공간을 줄이거나 더 효율적으로 활용하는 몇 가지 방법은 다음과 같습니다.

  • 디스크 공간에 "비례 지불" 원칙 적용(필요한 기능만 다운로드):: 애플리케이션에는 다양한 기능이 포함될 수 있으며, 모든 사용자에게 모든 기능이 다 적용되는 것은 아닙니다. 이는 디스크 사용량이 많은 이유 중 하나이기도 합니다. "비례 지불" 원칙을 적용하면 사용자가 필요한 기능만 다운로드 요청을 할 수 있으므로, 앱을 다운로드할 때 디스크 공간을 더 적게 차지하게 됩니다. 추가 콘텐츠는 사용자가 더 풍부한 기능을 필요로 하는 경우에만 다운로드할 수 있는 선택 사항입니다. 기능 외에 언어 지원에도 동일한 "비례 지불" 원칙을 적용할 수 있습니다. 애플리케이션에는 기본적으로 자주 사용하는 언어의 하위 집합이 포함될 수 있으며, 사용자 시스템에 설정된 위치에 따라 추가 언어가 선택적으로 포함되거나 달라지기도 합니다.

  • 효율적인 캐시 크기 조정 기능 적용: 경우에 따라 애플리케이션이 디스크 내 캐시를 통해 사용자 환경의 반응성을 향상시킬 수 있습니다. 디스크 용량에 따라 캐시 크기에 상한을 설정하고 디스크의 사용 가능한 공간이 부족할 때 캐시 크기를 조정하는 등 애플리케이션에서 캐시를 관리하는 방식에 관해 정책을 설정할 수 있습니다.

  • 효율적인 자산 활용 적용: 애플리케이션에는 이미지 자산이 포함되는 경우가 많으며 여러 해상도를 지원하기 위해 다양한 이미지 크기로 구성되기도 합니다. 일부 해상도에 맞게 이미지 크기, 차원, 형식, 압축을 최적화하고 크기 조정을 활용하여 나머지 해상도를 지원하면 디스크 사용 공간을 크게 절감할 수 있습니다.

  • 이진 최적화 기회 조사: 애플리케이션 작성자는 SizeBench와 같은 도구로 이진 공간의 원인을 조사하고 디스크 공간 사용량을 절감할 기회를 찾을 수 있습니다.

추가 리소스