ASP.NET MVC 응용 프로그램 성능을 개선하려면 어떻게합니까?


답변:


311

가능한 개선 소스 목록은 다음과 같습니다.

일반

  • 프로파일 러를 사용하여 응용 프로그램의 메모리 누수 및 성능 문제를 발견하십시오. 개인적으로 나는 dotTrace를 제안합니다
  • 프로덕션 환경이나 성능 프로파일 링 중에는 디버그 모드가 아닌 릴리스 모드로 사이트를 실행하십시오. 릴리스 모드가 훨씬 빠릅니다. 디버그 모드는 자체 코드에서 성능 문제를 숨길 수 있습니다.

캐싱

  • CompiledQuery.Compile() 쿼리 표현식의 재 컴파일을 피하면서 재귀 적으로 사용
  • OutputCacheAttribute 불필요하고 행동적인 실행을 저장하기 위해 사용 하기 쉬운 변경하지 않는 컨텐츠 캐시
  • 자주 액세스하는 중요하지 않은 정보에 쿠키 사용
  • ETag 및 만료 활용 - ActionResult필요한 경우 사용자 정의 방법 작성
  • 를 사용 RouteName하여 경로를 구성한 다음이를 사용하여 링크를 생성하고 표현식 트리 기반 ActionLink 메소드를 사용하지 마십시오.
  • 경로 확인 캐싱 전략 구현 고려
  • 에 반복적 인 코드를 넣고 xxxxPartialViews렌더링하지 마십시오 . 동일한 뷰에서 동일한 부분을 300 번 호출하면 문제가있을 수 있습니다. 설명 및 벤치 마크

라우팅

보안

  • 양식 인증 사용, 인증 티켓에 자주 액세스하는 중요한 데이터 유지

DAL

부하 분산

  • 리버스 프록시를 활용하여 앱 인스턴스에 클라이언트로드를 분산시킵니다. 스택 오버플로는 HAProxy ( MSDN )를 사용합니다.

  • 사용 비동기 컨트롤러를 외부 자원 처리에 의존하는 작업을 구현합니다.

고객 입장에서

  • 당신의 클라이언트 측 최적화와 같은 도구를 사용 YSlow에를 제안 성능을 개선 할 수
  • AJAX를 사용하여 UI 구성 요소를 업데이트하십시오. 가능하면 전체 페이지 업데이트를 피하십시오.
  • 시간 초과에 따른 재로드에 대한 컨텐츠 전달을 위해 펍 서브 아키텍처 (예 : 혜성)를 구현하는 것을 고려하십시오.
  • 가능하면 차트 및 그래프 생성 로직을 클라이언트 측으로 이동하십시오. 그래프 생성은 값 비싼 활동입니다. 클라이언트 측에서 불필요한 부담으로 서버를 연기하고 새로운 요청 (예 : Flex charting, jqbargraph , MoreJqueryCharts ) 없이 로컬로 그래프 작업을 수행 할 수 있습니다 .
  • 스크립트 및 미디어 컨텐츠에 CDN을 사용하여 클라이언트 측 (예 : Google CDN )의 로드를 향상시킵니다.
  • 작게하다 - 컴파일 - 자바 스크립트 스크립트의 크기를 개선하기 위해
  • 쿠키는 모든 요청에 ​​따라 서버로 전송되므로 쿠키 크기를 작게 유지하십시오.
  • 가능하면 DNS 및 링크 프리 페치 를 사용하십시오.

글로벌 구성

  • Razor를 사용하는 경우 기본적으로 global.asax.cs에 다음 코드를 추가하십시오. 기본적으로 Asp.Net MVC는 aspx 엔진 및 면도기 엔진으로 렌더링합니다. 이것은 RazorViewEngine 만 사용합니다.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • web.config에 gzip (HTTP 압축) 및 정적 캐시 (이미지, CSS 등)를 추가하십시오 <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • 사용하지 않는 HTTP 모듈 제거
  • web.config에서 HTML을 생성하자마자 플러시하고 사용하지 않는 경우 viewstate를 비활성화하십시오. <pages buffer="true" enableViewState="false">

6
예를 들어 IList를 통해 자극하여 결과 집합을 표시하는 뷰가 있고 각 목록 항목에 대해 Render.PartialView ( "Row", item)을 호출하는 경우 성능이 저하된다는 의미입니까? 내가 얼마나 잃을까요? 또는 성능 향상을 어떻게 측정 할 수 있습니까?
marc.d

@SDReyes -pub-sub 아키텍처 의 의미는 무엇 입니까?
Mohammed Zameer

1
이것은 멋지다. Uber Profiler 링크는 죽었습니다. 대신 ORM 특정 프로파일 러 중 하나에 연결해야합니까?
shanabus

12

기본 제안은 REST 원칙 을 따르는 것이며 다음 요점은 이러한 원칙 중 일부를 ASP.NET MVC 프레임 워크에 연결합니다.

  1. 컨트롤러를 상태 비 저장 상태로 만듭니다. 이는 ' 성능 / 확장 성'제안 (마이크로 / 머신 수준 성능과 반대) 및 향후 응용 프로그램에 영향을 미칠 주요 디자인 결정 (특히 인기가 있거나 필요한 경우) 예를 들어 내결함성.
    • 세션을 사용하지 마십시오
    • 세션을 사용하는 tempdata를 사용하지 마십시오
    • 모든 것을 '미숙하게' '캐시'하려고하지 마십시오.
  2. 양식 인증 사용
    • 인증 티켓에 자주 액세스하는 중요한 데이터를 보관하십시오
  3. 자주 액세스하는 중요하지 않은 정보에 쿠키 사용
  4. 웹에서 리소스를 캐싱 가능하게 만들기
  5. JavaScript를 컴파일하십시오. 클로저 컴파일러 라이브러리 도 있습니다 ( 다른 것들이 있는지 확인하십시오 .'JavaScript 컴파일러 '검색 하십시오 )
  6. 특히 대용량 미디어 파일 등에 CDN (Content Delivery Network)을 사용하십시오.
  7. 파일, 키 / 값 저장소 등과 같은 데이터의 다른 유형의 저장소를 고려하십시오. SQL Server뿐만 아니라
  8. 마지막으로 웹 사이트의 성능을 테스트하십시오.

10

코드 산악인이 블로그 항목은 응용 프로그램의 성능을 향상 자세한 방법을 제공합니다.

컴파일 된 쿼리는 응용 프로그램의 성능을 향상 시키지만 ASP.NET MVC와 공통점이 없습니다. 모든 db 응용 프로그램의 속도를 높이므로 실제로 MVC는 아닙니다.


8

이것은 명백해 보일 수 있지만 프로덕션 환경이나 성능 프로파일 링 중에는 디버그 모드가 아닌 릴리스 모드에서 사이트를 실행하십시오. 릴리스 모드가 훨씬 빠릅니다. 디버그 모드는 자체 코드에서 성능 문제를 숨길 수 있습니다.



6

획기적인 최적화는 아니지만 jQuery 등에 CDN을 사용하십시오 .

ScottGu 자신의 인용문 : Microsoft Ajax CDN을 사용하면 ASP.NET AJAX 또는 jQuery를 사용하는 ASP.NET Web Forms 및 ASP.NET MVC 응용 프로그램의 성능을 크게 향상시킬 수 있습니다. 이 서비스는 무료로 제공되며 등록이 필요하지 않으며 상업 및 비상업적 목적으로 모두 사용할 수 있습니다.

jQuery를 사용하는 Moss의 웹 파트에 CDN도 사용합니다.


6

또한 NHibernate 를 사용하는 경우 조회를 위해 2 차 레벨 캐시를 켜고 설정하고 조회 범위 및 시간 종료에 추가 할 수 있습니다. 그리고 EF , L2S 및 NHibernate ( http://hibernatingrhinos.com/products/UberProf)에 대한 킥 엉덩이 프로파일 러가 있습니다. 쿼리를 조정하는 데 도움이됩니다.


Ayende는 최근 EF 프로파일 러가 샘플 MVC 앱을 튜닝하는 데 어떻게 도움이되었는지 블로그를 작성했습니다 : ayende.com/Blog/archive/2010/05/17/…
Frank Schwieterman

5

나는 또한 추가 할 것이다 :

  1. 스프라이트 사용 : 스프라이트는 요청을 줄이는 좋은 방법입니다. 모든 이미지를 하나의 이미지로 병합하고 CSS를 사용하여 스프라이트의 좋은 부분을 얻습니다. Microsoft는 좋은 라이브러리를 제공합니다 : Sprite 및 Image Optimization Preview 4 .

  2. 서버 개체 캐시 : 거의 변경되지 않는 참조 목록이나 데이터가있는 경우 매번 데이터베이스를 쿼리하지 않고 메모리에 캐시 할 수 있습니다.

  3. Entity Framework 대신 ADO.NET을 사용하십시오 . EF4 or EF5개발 시간을 줄이는 데는 좋지만 최적화하는 데 어려움이 있습니다. Entity Framework보다 저장 프로 시저 를 최적화하는 것이 더 간단합니다 . 따라서 저장 프로 시저를 가능한 많이 사용해야합니다. Dapper는 매우 우수한 성능으로 SQL을 쿼리하고 매핑하는 간단한 방법을 제공합니다.

  4. 캐시 페이지 또는 부분 페이지 : MVC는 일부 매개 변수에 따라 페이지를 캐시하는 쉬운 필터를 제공하므로 사용하십시오.

  5. 데이터베이스 호출 감소 : 여러 개체를 반환하는 고유 한 데이터베이스 요청을 만들 수 있습니다. Dapper 웹 사이트를 확인하십시오.

  6. 항상 깨끗한 아키텍처 유지 : 소규모 프로젝트에서도 깨끗한 n 계층 아키텍처를 갖습니다 . 코드를 깨끗하게 유지하는 데 도움이되며 필요한 경우 최적화하는 것이 더 쉬울 것입니다.

  7. 이 템플릿 " Neos-SDI MVC 템플릿 "을 보면 기본적으로 성능이 많이 향상되어 깔끔한 아키텍처를 만들 수 있습니다 ( MvcTemplate 웹 사이트 확인 ).


하나의 저장 프로 시저를 실행하여 더 많은 결과 집합을 반환 한 다음 비동기 모드에서 더 많은 저장 프로 시저를 실행하는 것이 더 낫다고 생각하십니까?
Muflix

4

서버 측에서 응용 프로그램을 최적화하는 데 대한 모든 훌륭한 정보 외에도 YSlow를 살펴보아야한다고 말하고 싶습니다 . 클라이언트 측에서 사이트 성능을 향상시키는 데 유용한 리소스입니다.

이는 ASP.NET MVC뿐만 아니라 모든 사이트에 적용됩니다.


3

가장 쉬운 방법 중 하나는 페이지에 원하는 데이터에 액세스 할 때 비동기 적으로 생각하는 것입니다. 웹 서비스, 파일, 데이터베이스 등에서 읽을 때 가능한 한 비동기 모델을 사용하십시오. 한 페이지가 더 빠를 수는 없지만 서버의 전반적인 성능을 향상시키는 데 도움이됩니다.


2

1 : 타이밍을 얻으십시오. 둔화의 위치를 ​​알기 전까지는 질문에 대한 답변이 너무 광범위합니다. 내가 작업하고있는 프로젝트에는이 정확한 문제가 있습니다. 어떤 일이 얼마나 오래 걸리는지를 알기위한 기록은 없습니다. 프로젝트에 타이밍을 추가 할 때까지 앱의 느린 부분에 대해서만 추측 할 수 있습니다.

2 : 순차적 작업이있는 경우 가볍게 멀티 스레드를 두려워하지 마십시오. 특히 차단 작업이 관련된 경우. PLINQ는 당신의 친구입니다.

3 : 게시 할 때 MVC 뷰를 미리 생성합니다. '첫 페이지 조회수'에 도움이됩니다.

4 : 일부는 저장 프로 시저 / ADO 속도의 장점을 주장합니다. 다른 사람들은 EF의 개발 속도와 계층의 명확한 분리 및 목적에 대해 주장합니다. SQL 및 해결 방법이 데이터 검색 및 저장을 위해 Sprocs / Views를 사용하는 경우 실제로 디자인이 느립니다. 또한 테스트하기가 어렵습니다. 현재 ADO에서 EF로 변환하는 현재 코드베이스는 이전 수동 롤링 모델보다 성능이 떨어지거나 성능이 저하되는 경우가 있습니다.

5 : 애플리케이션 워밍업에 대해 생각해보십시오. 대부분의 EF 성능 문제를 해결하기 위해 수행하는 작업 중 하나는 특수 예열 방법을 추가하는 것이 었습니다. 쿼리 또는 아무것도 미리 컴파일하지 않지만 많은 메타 데이터로드 / 생성에 도움이됩니다. 이것은 Code First 모델을 다룰 때 더욱 중요 할 수 있습니다.

6 : 다른 사람들이 말했듯이 가능하면 세션 상태 또는 ViewState를 사용하지 마십시오. 반드시 개발자가 생각하는 성능 최적화는 아니지만보다 복잡한 웹 응용 프로그램을 작성하기 시작하면 응답 성이 필요합니다. 세션 상태가이를 배제합니다. 오래 실행되는 쿼리를 상상해보십시오. 새 창을 열고 덜 복잡한 창을 사용하기로 결정했습니다. 서버가 세션의 다음 요청으로 이동하기 전에 첫 번째 요청이 완료 될 때까지 서버가 대기하기 때문에 세션 상태가 켜진 상태로 대기했을 수도 있습니다.

7 : 데이터베이스로의 왕복을 최소화하십시오. 자주 사용하지만 실제로는 .Net Cache로 변경되지 않는 항목을 저장하십시오. 가능하면 삽입물 / 업데이트를 일괄 처리하십시오.

7.1 : 좋은 이유없이 Razor보기에서 데이터 액세스 코드를 피하십시오. 나는 그것을 보지 않았다면 이것을 말하지 않을 것입니다. 그들은 모델을 만들 때 이미 데이터에 액세스하고 있었는데 왜 모델에 모델을 포함시키지 않았습니까?


2
  1. Gzip을 구현하십시오.
  2. 부분 뷰에는 비동기 렌더링을 사용하십시오.
  3. 데이터베이스 적중을 최소화하십시오.
  4. 컴파일 된 쿼리를 사용하십시오.
  5. 프로파일 러를 실행하고 불필요한 적중을 찾으십시오. 응답을 반환하는 데 1 초 이상 걸리는 모든 저장 프로 시저를 최적화하십시오.
  6. 캐싱을 사용하십시오.
  7. 번들링 최소화 최적화를 사용하십시오 .
  8. 읽기 전용 컨텐츠에는 세션 캐시 및 로컬 스토리지와 같은 HTML 5 유틸리티를 사용하십시오.

2

방금 2 센트를 추가하고 싶었습니다. MVC 애플리케이션에서 URL 경로 생성을 최적화하는 가장 효과적인 방법은 전혀 생성하지 않는 것입니다.

우리 대부분은 어쨌든 앱에서 URL이 어떻게 생성되는지 알고 있으므로 가능한 Url.Content("~/Blahblah")대신 Url.Action()또는 Url.RouteUrl()가능한 경우 정적을 사용 하면 다른 모든 방법을 거의 20 배 이상 능가합니다.

추신. 나는 수천 번의 반복 벤치 마크를 실행하고 관심이 있다면 내 블로그 에 결과 게시했습니다 .


1

클라이언트 측을 최적화하기 위해 데이터베이스 계층을 잊지 마십시오. 우리는 밤새 5 초에서 최대 50 초까지로드되는 응용 프로그램을 가지고있었습니다.

검사를 통해 스키마를 완전히 변경했습니다. 통계를 새로 고치면 갑자기 이전처럼 반응이 빨라졌습니다.


0

다음은해야 할 일입니다

  1. 커널 모드 캐시
  2. 파이프 라인 모드
  3. 사용하지 않는 모듈 제거
  4. runAllManagedModulesForAllRequests
  5. wwwroot에 쓰지 마십시오
  6. 사용하지 않는보기 엔진 및 언어 제거

0

번들링 및 축소를 사용하면 성능을 향상시키는 데 도움이됩니다. 기본적으로 페이지 로딩 시간이 줄어 듭니다.


0

Microsoft Azure (IaaS 또는 PaaS)에서 ASP.NET MVC 응용 프로그램을 실행중인 경우 적어도 첫 번째 배포 전에 다음을 수행하십시오.

  • 정적 코드 분석기로 코드를 스캔하여 모든 유형의 코드 부채, 복제, 복잡성 및 보안을 확인하십시오.
  • Application Insight를 항상 활성화하고 성능, 브라우저 및 분석을 자주 모니터링하여 응용 프로그램의 실시간 문제를 찾으십시오.
  • 이미지, 자산, 공통 레이아웃 등과 같이 정적이면서 빈도가 적은 변경 데이터에 대해 Azure Redis Cache를 구현합니다.
  • 항상 Azure에서 제공하는 APM (Application Performance Management) 도구를 사용하십시오.
  • 응용 프로그램 내부 부분 간의 통신 성능을 조사하려면 응용 프로그램 맵을 자주 참조하십시오.
  • 데이터베이스 / VM 성능도 모니터링하십시오.
  • 필요한 경우 예산 내에서로드 밸런서 (수평 스케일)를 사용하십시오.
  • 응용 프로그램에 전 세계에 대상 사용자가있는 경우 Azure Trafic Manager를 사용하여 들어오는 요청을 자동으로 처리하고 가장 사용 가능한 응용 프로그램 인스턴스로 전환합니다.
  • 성능이 낮을 때 경고를 작성하여 성능 모니터링을 자동화하십시오.

0

.Net 버전에 따라 최신 버전의 Task Parallel Library (TPL)를 사용하십시오 . 다른 목적을 위해 올바른 TPL 모듈을 선택해야합니다.


0

위의 모든 답변을 수행했지만 문제가 해결되지 않았습니다.

마지막으로, 나는 설정으로 내 느린 사이트 로딩 문제를 해결 PrecompileBeforePublish을프로필을 게시사실 . 당신이 사용하려는 경우 를 msbuild를 이 인수를 사용할 수 있습니다 :

 /p:PrecompileBeforePublish=true

정말 많은 도움이됩니다. 이제 내 MVC ASP.NET이 10 배 빠르게로드됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.