다음을 통해 공유


성능 향상을 위한 디자인 및 구성

업데이트: 2007년 11월

이 항목에서는 웹 응용 프로그램의 성능을 향상시키기 위해 사용할 수 있는 디자인, 구성, 컴파일 및 메모리 옵션에 대해 설명합니다.

비동기 프로그래밍 모델

ASP.NET은 데이터베이스 쿼리 같이 실행 시간이 긴 작업을 주 응용 프로그램 스레드와 별도로 실행되는 스레드로 이동할 수 있는 비동기 프로그래밍 기술을 지원합니다. 다음과 같은 기술을 사용할 수 있습니다.

  • BackgroundWorker구성 요소   System.ComponentModel 네임스페이스의 BackgroundWorker 클래스를 사용하면 시간이 오래 걸리는 작업의 코드를 DoWork 이벤트 처리기에 추가하고 RunWorkerAsync 메서드를 호출하여 DoWork 이벤트를 발생시킬 수 있습니다. 작업자 메서드가 비동기적으로 실행되는 동안에도 호출 스레드는 계속 실행됩니다. 메서드의 실행이 완료되면 BackgroundWorker 구성 요소에서 RunWorkerCompleted 이벤트를 발생시켜 이 사실을 호출 스레드에 알립니다. 자세한 내용은 BackgroundWorker 구성 요소를 참조하십시오.

  • 이벤트 기반 비동기 프로그래밍   이벤트 기반 비동기 패턴은 특정 클래스에서 지원하는 작업이 어느 정도로 복잡한지에 따라 몇 가지 형태를 취할 수 있습니다. 가장 단순한 클래스에는 하나의 MethodNameAsync 메서드와 이에 상응하는 MethodNameCompleted 이벤트가 있을 수 있습니다. 더 복잡한 클래스에는 여러 개의 MethodNameAsync 메서드와 각각에 상응하는 MethodNameCompleted 이벤트뿐 아니라 이 메서드의 동기 버전도 있을 수 있습니다. 클래스에서는 각 비동기 메서드의 취소, 진행률 보고 및 증분 결과를 선택적으로 지원할 수도 있습니다.

    또한 비동기 메서드는 여러 개의 보류 중인 동시 호출을 지원하므로 보류 중인 다른 작업을 완료하기 전에 코드에서 보류 중인 호출을 원하는 횟수만큼 호출할 수 있습니다. 이 상황을 올바로 처리하려면 응용 프로그램이 각 작업의 완료를 추적해야 합니다.

    이 패턴과 그 구현에 대한 자세한 내용은 이벤트 기반 비동기 패턴 개요를 참조하십시오.

  • IAsyncResult를 사용한 비동기 프로그래밍   IAsyncResult 디자인 패턴을 사용하는 비동기 작업은 BeginOperationName 및 EndOperationName이라는 두 가지 메서드로 구현됩니다. 이들 메서드는 각각 비동기 OperationName을 시작하고 끝냅니다. BeginOperationName은 호출 스레드에 대한 컨트롤을 즉시 반환합니다. EndOperationName 메서드는 비동기 OperationName을 끝냅니다. 중요한 것은 EndOperationName의 호출 시점을 결정하는 일입니다. 이 메서드는 OperationName이 완료되지 않았더라도 호출 스레드를 차단하기 때문입니다. 자세한 내용은 비동기 프로그래밍 개요를 참조하십시오.

  • Clients callbacks   클라이언트 콜백에서 클라이언트 스크립트 함수는 다시 게시하는 데 따른 오버헤드 없이 ASP.NET 웹 페이지에 요청을 보냅니다.

이러한 기술을 사용하는 예제는 이벤트 기반 비동기 패턴 기술 샘플을 참조하십시오.

컴파일 및 구성 옵션

응용 프로그램을 컴파일하고 구성하는 방식에 따라 응용 프로그램의 성능이 좌우됩니다. 다음 지침에서는 하나의 전체 작업으로서 웹 응용 프로그램의 효율성을 높이는 방법을 제안합니다.

  • 웹 응용 프로그램의 크기가 큰 경우 이를 미리 컴파일합니다.

  • IIS(인터넷 정보 서비스) 5.0에서 ASP.NET 웹 응용 프로그램을 실행할 때는 프로세스를 재활용합니다.

  • 필요한 경우 응용 프로그램에 대한 작업자 프로세스별로 스레드의 수를 조정합니다. 응용 프로그램이 외부 리소스에 거의 전적으로 의존하는 경우 다중 프로세서 컴퓨터에서 웹 가든을 사용하는 것도 좋은 방법이 될 수 있습니다.

  • 디버그 모드를 비활성화합니다.

  • 다음과 같은 기술을 사용하여 필요에 맞게 웹 서버 컴퓨터와 특정 응용 프로그램에 대한 구성 파일을 조정합니다.

    • 인증을 필요로 하는 응용 프로그램에 대해서만 인증을 활성화합니다.

    • 요청 및 응답 인코딩 설정을 적절하게 사용하여 응용 프로그램을 구성합니다.

    • 응용 프로그램에서 AutoEventWireup을 해제해 봅니다.

    • 요청 처리 파이프라인에서 사용되지 않는 모듈을 제거합니다.

자세한 내용은 성능 개요를 참조하십시오.

캐시 구성 옵션

다음 수준에서 캐싱을 구성하여 응용 프로그램의 성능을 향상시킬 수 있습니다.

  • 응용 프로그램   응용 프로그램의 Web.config 파일에서 OutputCacheSection 요소를 사용하여 전체 응용 프로그램에 대한 캐싱을 제어할 수 있습니다. OutputCacheSettingsSection 요소를 사용하여 캐시 프로필을 설정한 다음 개별 페이지에 적용할 수 있습니다.

  • 컴퓨터   Web.config 파일에서와 구성할 수 있는 것과 동일한 옵션을 Machine.config 파일에서도 구성할 수 있습니다.

  • 페이지   구성 파일에 정의된 캐시 프로필을 적용하여 개별 페이지에 캐싱을 구성할 수 있습니다. 또는 @ OutputCache 지시문을 사용하거나 페이지의 클래스 정의에 특성을 설정하여 개별 캐시 속성을 구성할 수 있습니다.

  • 컨트롤   사용자 정의 컨트롤 파일에 @ OutputCache 지시문을 설정하거나 컨트롤의 클래스 정의에 PartialCachingAttribute 특성을 설정하여 사용자 정의 컨트롤 캐싱을 구성할 수 있습니다.

자세한 내용은 ASP.NET의 캐시 구성을 참조하십시오.

IIS 6.0을 사용한 메모리 재활용

메모리 누수 문제가 있는 것으로 알려진 COM interop 응용 프로그램과 같이 문제를 일으키는 코드가 응용 프로그램에 포함되어 있지만 코드를 다시 작성하기가 쉽지 않다면 응용 프로그램을 제공하는 작업자 프로세스를 정기적으로 재활용하여 문제의 범위를 제한할 수도 있습니다. 작업자 프로세스를 재활용하면 메모리에 있는 응용 프로그램의 인스턴스가 대체됩니다. IIS 6.0에서는 응용 프로그램 풀에 할당된 하나 이상의 작업자 프로세스를 다시 시작하여 작업자 프로세스를 자동으로 재활용할 수 있습니다. 이렇게 하면 응용 프로그램을 안정적으로 실행하는 데 도움이 됩니다.

재활용 과정에서 상태 유지

상태 데이터에 의존하는 응용 프로그램이 응용 프로그램 풀에 있는 경우 이 응용 프로그램 풀에 할당된 작업자 프로세스를 재활용할지 여부를 결정해야 합니다. 작업자 프로세스를 재활용하면 프로세스에 유지되던 응용 프로그램의 상태 데이터가 소실됩니다. 이 경우 재활용 기능을 사용하지 않도록 선택할 수도 있습니다.

데이터베이스 같은 작업자 프로세스 외부에 상태 데이터를 저장하면 상태 문제를 해결하면서 프로세스를 재활용할 수 있습니다. 그러나 상태 데이터를 프로세스 밖에서 관리하면 재활용으로 인해 서버 성능에 다음과 같은 영향을 줄 수 있습니다.

  • 응용 프로그램과 데이터 저장소 사이에 데이터를 옮기는 데 따른 관리 오버헤드가 필요하므로 성능이 저하됩니다.

  • 재활용 시 in-process 데이터 캐시가 모두 플러시되므로 캐시를 다시 빌드해야 합니다.

ASP.NET에서는 세션 상태 서비스나 SQL 데이터베이스를 사용하여 세션 상태를 유지할 수 있는 옵션을 제공합니다. 자세한 내용은 세션 상태 모드를 참조하십시오.

자세한 내용은 Recycling Worker Processes (IIS 6.0)를 참조하십시오.

네이티브 이미지 서비스

네이티브 이미지 서비스는 네이티브 이미지를 생성하고 관리하는 Windows 서비스입니다. 네이티브 이미지는 컴파일된 프로세서별 컴퓨터 코드가 포함된 파일입니다. 네이티브 이미지 서비스를 사용하면 네이티브 이미지의 설치 및 업데이트를 컴퓨터 작업량이 많지 않은 시간에 진행하도록 미룰 수 있습니다. 네이티브 이미지 생성기(Ngen.exe)는 관리되는 응용 프로그램의 성능을 향상시키는 도구입니다. Ngen.exe는 네이티브 이미지를 만들고 로컬 컴퓨터의 네이티브 이미지 캐시에 이 이미지를 설치합니다. 런타임은 JIT(Just-In-Time) 컴파일러를 사용하지 않고 캐시의 네이티브 이미지를 사용하여 원본 어셈블리를 컴파일할 수 있습니다.

자세한 내용은 MSDN Magazine 웹 사이트에서 NGen Revs Up Your Performance with Powerful New Features 문서를 참조하십시오.

전역 어셈블리 캐시 및 작업 집합

프로세스의 작업 집합은 실제 RAM 메모리에 있는 프로세스에 대해 현재 사용할 수 있는 메모리 페이지의 집합입니다. 이러한 페이지는 메모리에 상주하고 있으며 페이지 폴트를 일으키지 않고 응용 프로그램에 사용할 수 있습니다. PeakWorkingSetWorkingSet 속성을 사용하면 작업 집합의 크기를 모니터링할 수 있습니다. 어셈블리를 전역 어셈블리 캐시에 배치하면 응용 프로그램의 작업 집합을 줄일 수 있습니다. 이 옵션은 주로 중간 계층 및 공유 어셈블리에 사용하는 것이 좋습니다.

참고 항목

기타 리소스

Chapter 4 — Architecture and Design Review of a .NET Application for Performance and Scalability

Chapter 6 — Improving ASP.NET Performance

Microsoft Patterns and Practices