내용으로 건너뛰기
ASP.NET 앱의 성능을 향상시키는 12가지 팁 – 1부

ASP.NET 앱의 성능을 향상시키는 12가지 팁 – 1부

웹 서버에서 웹 응용 프로그램을 구축하고 호스팅하는 것은 ASP.NET 와 IIS를 사용하면 매우 쉽습니다. 그러나 많은 기회와 숨겨진 구성을 조정하여 고성능 웹 응용 프로그램으로 만들 수 있습니다. 이 시리즈 게시물에서는 모든 웹 응용 프로그램에 쉽게 적용할 수 있는 가장 많이 사용되지 않거나 무시되는 트릭에 대해 설명합니다.

8min read

웹 서버에서 웹 응용 프로그램을 구축하고 호스팅하는 것은 ASP.NET 와 IIS를 사용하면 매우 쉽습니다. 그러나 많은 기회와 숨겨진 구성을 조정하여 고성능 웹 응용 프로그램으로 만들 수 있습니다. 이 시리즈 게시물에서는 모든 웹 응용 프로그램에 쉽게 적용할 수 있는 가장 많이 사용되지 않거나 무시되는 트릭에 대해 설명합니다.

1. 커널 모드 캐시

작성에 널리 사용되는 기본 도구 중 하나이며 웹 응용 프로그램을 더 빠르게 만듭니다. 그러나 대부분의 경우 최적으로 사용하지 않아 몇 가지 주요 이점이 있습니다.  각 asp.net 요청이 다양한 단계를 거치면서 아래와 같이 여러 수준에서 캐싱을 구현할 수 있습니다.

 request response

요청이 HTTP.sys에 의해 먼저 수신되는 것을 볼 수 있으므로 커널 수준에서 캐시되면 OS 커널에 있고 TCP 계층에서 직접 요청을 수신하는 HTTP 리스너이므로 서버에서 보내는 대부분의 시간을 절약할 수 HTTP.sys. IIS/ASP.NET 파이프라인, 페이지 수명 주기, 사용자 지정 코드, DB에 소요된 시간 등에 소요되는 모든 시간을 절약할 수 있습니다. 어떻게 구현할 수 있는지 살펴 보겠습니다.

a)      IIS로 이동하여 웹 사이트를 선택합니다.

b)      IIS 섹션 오른쪽 아래에 있는 출력 캐시 아이콘을 클릭합니다.

c)       오른쪽 패널의 Actions(작업)에서 Add(추가)를 클릭합니다. 다음 대화 상자가 열립니다.

여기에서 빨간색으로 원으로 둘러싸인 영역에서 커널에서 캐시하려는 파일 확장자를 정의해야 합니다. 두 번째 원으로 둘러싸인 영역의 경우 확인란을 선택해야 합니다. 세 번째 원으로 둘러싸인 영역은 캐시를 무효화하기 위해 제공되는 세 가지 옵션이 있음을 보여줍니다. 요구 사항에 따라 구성할 수 있습니다.

참고 – 커널 수준에서 과다 캐싱하는 데는 몇 가지 제한 사항이 있습니다. IIS의 모든 기능은 사용자 수준에서 구현되므로 이러한 기능을 활용할 수 없습니다. 구현할 수 없는 커널 캐싱의 전체 목록은 이 MSDN 문서를 참조하십시오.

2. 파이프라인 모드(IIS 7+에서 사용 가능)

응용 프로그램 풀 수준에서 사용할 수 있는 두 가지 파이프라인 모드(클래식 및 통합)입니다. 클래식은 IIS6에서 마이그레이션된 애플리케이션을 지원하는 데 사용할 수 있습니다. 먼저 이러한 모드를 이해합시다. IIS는 IIS에서 모듈로 구현되는 많은 기능을 제공하며, 유사한 방식으로 많은 기능이 ASP.NET 파이프라인의 일부인 HTTP 모듈로 구현됩니다. 클래식 모드에서 각 요청은 IIS 파이프라인을 거친 다음 ASP.NET 파이프라인을 거친 다음 제공되기 전에 처리됩니다.

인증 등과 같은 두 파이프라인의 일부인 많은 기능이 있습니다. 통합 모드의 경우 이러한 두 파이프라인이 하나로 병합되고 모든 모듈(IIS 및 ASP.NET)이 단일 이벤트에서 호출되므로 중복성이 줄어들고 애플리케이션 성능에 매우 유용합니다.

파이프라인 모드를 설정/업데이트하려면 원하는 애플리케이션 풀을 선택하고 속성을 마우스 오른쪽 버튼으로 클릭합니다.

edit app pool

위 그림과 같이 파이프라인 모드를 설정할 수 있습니다.

참고 – 응용 프로그램이 IIS6에서 마이그레이션 된 경우 맹목적으로 변경하지 마십시오. 변경 후 진행하기 전에 철저히 테스트하십시오.

3. Remove Unused Modules

각 요청은 많은 HTTP 모듈을 포함하는 ASP.NET 파이프라인을 거쳤으며, 마지막에는 아래와 같이 요청을 처리하는 하나의 HTTP 핸들러가 있습니다.

여기에서 요청이 각 모듈을 통과하고 핸들러에 의해 처리된 다음 동일한 모듈을 통해 다시 들어오는 것을 볼 수 있습니다. ASP.NET Application에서 기본적으로 활성화되어 있는 모듈의 수를 살펴보겠습니다. 모든 모듈을 가져 오기 위해 아래 코드를 추가했습니다.

HttpApplication httpApps = HttpContext.ApplicationInstance;
 
//Get list of active modules
HttpModuleCollection httpModuleCollections = httpApps.Modules;
ViewBag.ModulesCount = httpModuleCollections.Count;

이 컬렉션은 모든 컨트롤에 바인딩할 수 있으며 다음과 같이 표시됩니다.

여기에는 18개의 모듈이 표시되며, 그 중 일부는 사용하지 않을 수 있지만 각 요청은 이러한 모듈을 거쳐야 합니다. 따라서 파이프라인에서 이러한 모듈을 제거할 수 있습니다. 모듈을 제거하려면 web.config에 구성을 다음과 같이 추가해야 합니다.

 <system.webServer>
    <modules>
      <remove name="FormsAuthentication" />
      <remove name="DefaultAuthentication" />
      <remove name="OutputCache" />
      <remove name="AnonymousIdentification" />
      <remove name="RoleManager" />
    </modules>
  </system.webServer>

여기에서는 remove 태그로 제거하려는 모듈을 나열합니다. 이제 여기에 5 개의 모듈을 추가했으므로 다음에 활성 모듈을 확인할 때 13 개가 될 것입니다.

참고 –이 데모에서는 VS 2013을 사용했으며 다른 버전을 사용할 때 다른 번호를 얻을 수 있지만 요점은 필요하지 않은 모든 모듈을 제거해야한다는 것입니다.

4. runAllManagedModulesForAllRequests

web.config 또는 applicationHost.config에서 보았어야 하는 또 다른 구성으로, 해당 IIS의 모든 응용 프로그램에 대해 다음과 같이 전역적으로 설정됩니다.

<modules runAllManagedModulesForAllRequests="true">

즉, 응용 프로그램에 들어오는 모든 요청에 대해 모든 모듈이 실행되지만 CSS, js, jpg, HTML 등과 같은 다른 파일이 아닌 ASP.NET 파일만 실행해야 하기 때문에 일반적으로 필요하지 않습니다. 이는 파이프라인을 통과하는 이러한 리소스의 요청조차도 이러한 파일에 필요하지 않으며 추가 오버헤드를 추가할 뿐입니다. 그러나 응용 프로그램 수준에서 단순히 거짓으로 만들 수는 없습니다. 따라서 두 가지 방법이 있을 수 있습니다.

a)      이러한 정적 리소스를 제공하기 위해 다른 응용 프로그램을 만들고 web.config에서이 설정을 false로 설정하십시오.

b)      또는 동일한 응용 프로그램에서 모든 정적 리소스를 폴더에 넣고 해당 폴더와 관련된 web.config 파일을 추가하고 false로 만듭니다.

 

5. c:\inetpub\wwwroot 폴더에 아무 것도 쓰지 마십시오.

파일 감시자는 폴더를 조사하고 이 폴더에 변경 내용이 있는 경우 해당 응용 프로그램 풀을 다시 시작합니다. 이 기능은 IIS에서 사용할 수 있습니다. web.config 또는 파일에 변경 내용이 있는 경우 수정된 응용 프로그램이 요청을 처리할 수 있도록 응용 프로그램 풀을 다시 시작합니다. 이제 각 요청에 몇 가지 항목을 만드는 응용 프로그램 폴더 내의 일부 텍스트 파일에 응용 프로그램 로그를 작성한다고 가정하면 응용 프로그램 풀이 여러 번 다시 시작되어 응용 프로그램에 위험 할 수 있습니다. 따라서 응용 프로그램 이진 파일의 일부가 아닐 때까지 이 폴더에 아무 것도 쓰거나 변경하지 마십시오.

6. Extra View 엔진 제거

a) 아시다시피 뷰 엔진은 MVC 요청 라이프 사이클의 일부이며 뷰를 찾아 처리 할 책임이 있습니다. 이를 통해 자체 사용자 지정 보기 엔진도 추가할 수 있습니다. 기본 MVC 응용 프로그램을 만들고 솔루션에 존재하지 않는 뷰를 반환해 보겠습니다. 이제 이 응용 프로그램을 실행하면 다음 오류가 표시됩니다.

가능한 모든 위치에서 면도기 및 aspx 파일을 찾고 있음을 보여줍니다. 그러나 아시다시피 우리는 면도기 뷰 엔진을 사용하고 있으므로 솔루션의 일부가 아니라는 것을 이미 알고 있기 때문에 다른 aspx 파일을 보는 데 시간을 낭비해서는 안됩니다. 따라서 모든 추가 뷰 엔진을 제거해야합니다.  Global.asax에서 사용할 수 있는 Application_Start 메서드에 다음 코드를 추가해야 합니다.

// Removing all the view engines
ViewEngines.Engines.Clear();
 
//Add Razor Engine (which we are using)
ViewEngines.Engines.Add(new RazorViewEngine());

이제 다시 실행해 보겠습니다

이제 면도기 파일 만 찾고 있습니다

나)      위의 화면이 뜨거워지는 것을 주의 깊게 보면 C# 및 vb 파일을 찾고 있다는 것을 알 수 있으며 솔루션에서 vb를 사용한 적이 없으므로 다시 vbhtml 파일을 찾는 데 아무 소용이 없다고 말합니다. 이 문제를 해결하려면 자체 사용자 정의 ViewEngine을 작성해야 합니다. 이제 Custom RazorViewEngine을 다음과 같이 작성해 보겠습니다.

    public class MyCustomViewEngine : RazorViewEngine
    {
        public MyCustomViewEngine()
        {
            base.AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml"};
            base.AreaMasterLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.cshtml" };
            base.AreaPartialViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.cshtml","~/Areas/{2}/Views/Shared/{0}.cshtml"};
            base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
            base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
            base.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" };
            base.FileExtensions = new string[] { "cshtml" };
        }
    }

여기, 나는 RazorViewEngine에서 그것을 상속 받았으며, 우리가 생성자를 본다면, 우리는 가능한 파일 확장자를 포함하여 파일이 존재할 수있는 모든 가능한 위치를 정의했음을 알 수 있습니다.이제 Global.asax에서 이 뷰 엔진을 사용하겠습니다.

그리고 응용 프로그램을 실행하십시오.

이제 의미가 있고 성능 친화적인 csharp 면도기 파일을 찾습니다.

결론

이 게시물에서는 모든 ASP.NET 응용 프로그램에 쉽게 적용할 수 있는 다음 6가지 팁에 대해 논의했습니다.

1 –   커널 모드 캐시

2 – Pipeline mode

3 –  Remove unused modules

4 –   runAllManagedModulesForAllRequests

5 –  Don’t write in wwwroot

6 –  사용하지 않는 보기 엔진 및 언어 제거

시리즈의 다음 게시물에서는 응용 프로그램의 성능 향상 장치 역할을 하는 5가지 팁에 대해 더 논의할 것입니다.

 

데모 요청