2012-02-23 2 views
1

ASP.NET MVC3 응용 프로그램에서 메모리 사용을 확인하는 가장 좋은 방법은 무엇입니까?MVC3 메모리 관리

사이트 호스팅 속도를 높이기 위해 호스팅 공급자가 IIS 응용 프로그램 풀을 너무 자주 다시 읽도록 요청 받았습니다. 이것이 '권장 관행'입니까? 당연히 모든 응용 프로그램을 자주 다시 시작할 필요는 없습니다. 나는 오히려 내 응용 프로그램의 메모리 사용 문제가 있는지 확인하고이를 수정해야합니다. 따라서 사용하는 모든 팁 & 모범 사례도 매우 유용 할 것입니다.

응용 프로그램은 ASP.NET MVC3, C# 및 EF Code First를 기반으로합니다. 어떤 지침, 링크 감사.

편집 : 게시 후이 페이지를 발견했습니다. 매우 유용합니다. 그러나 나는 여전히 다른 견해를 듣고 싶습니다.

ASP.NET MVC and EF Code First Memory Usage

은 IIS가 (내가 그렇게 29시간 또는 생각) 간격으로 자동으로 응용 프로그램 풀을 재활용 기본적으로 당신에게

+0

매우 유용한, 발견 한 링크 – MikeSW

답변

0

감사하지만은 확실히 아무리 작은 방법이나 호스트에 의해 설정되어 있지 않은 당신이 사용하고있는 많은 메모리가 사용 중입니다. 재활용 트리거는 시간 간격이거나 프로세스가 특정 메모리 사용 제한을 초과 할 수 있습니다. 나는 어떤 공유 호스트도 그들 둘다를 가지고 있다고 확신한다.

메모리 사용량과 관련하여 대략적인 사용법을 알려주는 GC.GetTotalMemory 메서드를 사용할 수 있습니다. Perfmon을 사용하는 경우에도 판독 값이 정확하지는 않지만 아이디어가 있습니다.

//global.asax.cs 
void Application_EndRequest(object o,EventArgs a) 
{ 
    var ctype=Context.Response.Headers["Content-Type"]; 
    if (ctype == null || !ctype.Contains("text/html")) return; 
    Context.Response.Write(string.format("<p>Memory usage: {0}</p>",GC.GetTotalMemory(false))); 
} 

는 사용량이의 GC 차기까지 증가 증가 및 사용량이 더 '현실적인'값으로 떨어질 볼 수 있습니다주의하십시오. 의

  • 적절한 레이어 : 당신은 돈이있는 경우

    나는 같은 응용 프로그램이 메모리 나 성능 문제가있는 경우 적어도 준비를 할 수있는 Memory profiler

    다른 것들과 같은 전문 도구를 권장합니다 응용 프로그램은 다른 사람에게 영향을 미치지 않으면 서 더 비효율적 인 부분을 리팩터링 할 수 있음을 의미합니다.

  • 리포지토리 패턴은 매우 유용합니다. EF를 사용하여 시작할 수 있기 때문에 EF가 많은 메모리 (예 : 발견 한 링크)에서 사용하지만 Petapoco 또는 Dapper를 사용하도록 저장소 구현을 전환 할 수 있습니다 .그물.
  • 일반적으로 OR \ M은 많은 라이브러리입니다. 응용 프로그램에 ORM 기능이 필요하지 않지만 db로 작업하는 빠른 방법은 위에서 언급 한 mico-Orm을 처음부터 사용하십시오.
  • 항상 IDisposable을 구현하는 개체를 처리하십시오.
  • 큰 DB 레코드를 다룰 때는 페이지 매김을 사용하십시오. 그것은 가능한 한 서버 리소스 사용과 사용자 경험
  • (이 필요한 당신 아닌가요 후끈)을 YAGNI 적용 원칙 모두를위한 좋은이 어떻게 든 TDD :
3

의 비트를 의미 나는 결코 사이트를 재활용 (매주 컴퓨터를 재부팅 할 때까지)

응용 프로그램은 일반적으로 정상적으로 작동해야합니다. 그렇지 않으면 누출이 있습니다.

  1. 캐시가 결코
  2. 캐시가 결코
  3. 세션 저장이 성장하고
  4. ObjectContexts가 배치 결코 세션에 보관 절대 시간 초과 유지 만료되지 만료 없기 때문에 이러한 경우가 발생할 수 등
  5. 객체 처분해야하는 것은 없습니다

  6. 종속성 주입 컨테이너를 통해 생성 된 객체 ar 각 요청 후에 해제하도록 설정하지 않아도되므로 잠재적으로 계속 성장하는 내부 컬렉션이있을 수 있습니다.

더 많은 원인이 있지만 몇 가지 주요 사항이 있습니다.

그래서 질문은 정말 '아무 가장 좋은 방법은 없다 - 그것은 당신의 응용 프로그램에 따라 다릅니다'당신이 다시 시작 빠르게 할 수 있고 현재 요청이 허용됩니다 명심 다시 시작하는 동안 현재의 세션에 대한 고민하는 경우에

(때로는) 끝내고 인증 토큰을 구성하여 다시 시작한 후에도 유지되지만 아웃 프로세스 상태 서버를 구성하지 않는 한 세션은 유지되지 않습니다.

메모리 사용량이 계속 증가하면 다시 시작 일정을 설정하십시오. 그렇지 않으면 일주일에 한 번 또는 전혀하지 마십시오. 또는 메모리가 XYZ로 이동 한 다음 다시 설정하십시오. Hoster가 메모리에 설정 한 내용을 기반으로 특정 임계 값에 도달하면 ASP.NET이 자동으로 다시 시작됩니다 .Limit : http://msdn.microsoft.com/en-us/library/7w2sway1.aspx