2012-06-06 3 views
4

ASP.NET 응용 프로그램의 초기 시작 시간이 매우 긴 (imho) 원인을 확인하려고합니다.ASP.NET 시작 성능 프로파일 링 웹

응용 프로그램은 다양한 제 3 자 라이브러리를 사용하지만 통합 될 수있는 많은 참고 자료가 있지만 DLL을 식별하고 비난하는 것은 물론 확장 된 시작 프로세스에 기여하는 정도를 확인하려고합니다. .

지금까지 시작 시간은 상자의 다른 용도에 따라 2-5 분입니다. 이것은 사이트의 복잡성에 근거한 제 생각에는 받아 들일 수없는 것이고, 30 초의 범위 내에서 이것을 최소화해야합니다.

내가 원하는 성능의 범위에서 명확히하기 위해 첫 번째 요청에서 초기 Application_Start 메서드가 실행될 때까지의 시간입니다.

어디서 DLL을로드 할 것인지,로드하는 데 걸리는 시간부터 시작해야하므로 비용/이점을 함께 해결할 수 있습니다.이를 해결/통합해야합니다.

능력 관점에서 볼 때, 나는 잠시 동안 JetBrains dotTrace를 사용 해왔고 응용 프로그램에서 일단 응용 프로그램을 벤치마킹하는 방법에 대해서는 명확하지만 응용 프로그램 코드 외부에있는 것처럼 보입니다. 그러므로 내가 현재 알고있는 것 이상으로.

내가 찾고있는 것은 내 코드에 첫 번째 진입 점 앞에 무슨 일이 일어나고 있는지를 알 수있는 방법론입니다.

참고 : 초기로드를 수행하기 위해 리사이클/업그레이드의 기본 페이지를 호출 할 수 있다는 것을 알고 있지만 실제 문제보다는 용지에 인쇄하는 것이 좋습니다.

주 2 : 하드웨어는 기능면에서 충분히 확장되고 분리되어 있으므로이 문제가 아니라고 확신합니다.

+3

대답은 극적으로 다르기 때문에 "이것은 프로젝트 *에서 받아 들일 수 없습니다 *"또는 "이것은 내 생각에는 받아 들일 수 없습니다 *"에서 결정하십시오. 하나는 프로덕션 응용 프로그램의 목표를 달성하기위한 것입니다 , 다른 -로드 성능에 대해 자신을 즐겁게/교육하는 방법. –

+0

2 ~ 5 분의 시작 시간은 아마도 두 가지 기준을 모두 만족시킬 것입니다. 앱 도메인이 재활용되고 서비스가 2-5 분 동안 중단 된 경우 수용 가능한 것으로 판단되는 개발자 * 또는 * 프로젝트를 구상하는 데 어려움이 있습니다. –

+0

질문을 업데이트합니다. Application_Start 메서드가 실행되기 전의 시간입니다. – Martin

답변

2

별도의 답변을 프로파일에 ... 메모리 캐시를 분산 기존 고려하는 경우 여러 서버, 따뜻한 위로 전화와 롤링 다시 시작, 웹 정원을 고려/디버깅 시작 코드 :

w3wp는 .Net 코드를 실행하는 프로세스입니다. 따라서 일반적인 .Net 응용 프로그램에 사용할 프로파일 링 및 디버깅 도구를 모두 사용할 수 있습니다.

하나의 까다로운 점은 w3wp 프로세스가 응용 프로그램에 대한 첫 번째 요청에서 자동으로 시작되고 도구가 시작될 때마다 프로세스에 연결을 지원하지 않으면 응용 프로그램의 시작 코드를 조사하는 데 문제가 있다는 것입니다.

트릭은 동일한 응용 프로그램 풀에 다른 응용 프로그램을 추가하는 것입니다. 이렇게하면 이미 실행중인 프로세스에 대해 도구를 연결/구성하는 것보다 다른 응용 프로그램으로 이동하여 w3wp 생성을 트리거 할 수 있습니다. 마지막으로 기존 응용 프로그램 도구를 트리거하면 기존 w3wp 프로세스에서로드가 발생합니다.

프로필러가 필요하지 않을 수도 있습니다. 위에서 제안한 방식으로 Visual Studio 디버거를 연결하고 사이트를로드하는 동안 무작위로 "모두 중단"을 트리거하면됩니다. 코드의 가장 느린 부분이 많은 스레드 중 하나의 스택에있을 가능성이 큽니다. 또한 디버그 출력에주의하십시오 - 무슨 일이 일어나는지 알 수 있습니다.

또한 비슷한 방식으로 모든 스레드 스택을 캡처하는 데 WinDbg를 사용할 수 있습니다 (VS보다 더 가벼운 방법 일 수 있음).

+0

다음 두 가지를 시도해 보겠습니다. 올바른 정보를 캡처하자마자 바로 표시하겠습니다. – Martin

+0

NH가 문제를 일으키는 것 같습니다 ... 동일한 appPool에 두 번째 응용 프로그램을 추가하면 dotTrace를 사용하여 물건을 볼 수있었습니다. – Martin

0

많은 수의 dll에도 불구하고 나는 합리적인 응용 프로그램 때문에 문제의 원인이 될 수 없다고 거의 확신합니다. 대부분의 경우 정적 객체 초기화로 인해 느린 시작이 발생합니다.

C#에서 정적 변수는 형식에 처음 액세스 할 때 초기화됩니다. SQL 프로파일 러를 사용하고 응용 프로그램의 시작 시간 동안 수행되는 쿼리가 무엇인지 확인하고 거기에서 초기화하기에 비용이 많이 드는 개체가 무엇인지 확인하십시오.

+0

이것은 내가 이미 취한 경로이며, 그렇게 많은 사람들이있는 것처럼 보이지 않으며 거대한 데이터 세트를 얻지도 않습니다. – Martin

2

DLL 참조는 필요에 따라 모두로드되는 것이 아니라 한 번에로드됩니다.

Do external references slow down my ASP.NET application? (VS: Add Reference dialog)

시작 2-5 분 걸리는 경우, 나는 위해 Application_Start에서 일어나는 것을보고, 그리고 DLL을 한 번로드 할 무슨 것이다. 그들은 매우 느린 원격 서비스에 연결하려고합니까? 컴퓨터가 수행하는 작업에 비해 컴퓨터가 너무 작습니까 (예 : 대량의 데이터가있는 DB와 AWS 마이크로 인스턴스 또는 유사한 웹 서버의 실행)?

로딩 시간이 IIS 작업자 프로세스가 참조를 해석하지 않기 때문에 저는 전통적인 응용 프로그램 프로파일 러 (예 : Jetbrains, Antz, dotTrace)를 사용하여 DLL이 초기화 될 때 소요 된 시간과 Application_Start 방법.

+0

나는 dotTrace를 사용하여 Application_Start의 시작 부분에서 코드를 프로파일 링하지만, 그 지점을 치기까지 2-5 분이 소요됩니다. 어쩌면 나는 dll의 초기화를 볼 수있는 설정이 제대로되어 있지 않습니까? – Martin

+0

(주요) DLL의 소스를 제어합니까? 그렇다면 몇 가지 간단한 로깅 문을 추가 할 수 있습니다 ... 불행히도 몇 년 동안 dotTrace를 사용하지 않았습니다. –

+0

사이트 코드를 제어 할 수 있지만 불행히도 사이트 코드 앞에 문제가있는 것 같습니다. 그렇지 않으면 dotTrace가 캡처 할 것이라고 생각했을 것입니다. – Martin

1

엔터테인먼트 옵션을 프로파일 링과 함께 확인 : 시작할 컴파일 할 필요가 많은 ASPX 전망이있는 경우 정보

  • 을 모든 것을 추적 시간을 추가하고, 로그

    • 프로필 모든 것을 (나는 생각 릴리스 구성 기본값)보다 약간의 시간이 걸릴 것입니다.
    • 웹 서비스 또는 다른 XML 직렬화 관련 코드에 대한 참조가없는 경우 직렬화 어셈블리를 컴파일해야합니다.
    • 원격 서비스에 대한 액세스 (lo 포함 서비스는 응용 프로그램에서 너무
    • 적극적인 캐싱을 시작해야 할 수 있습니다 칼 SQL은)/원격 서비스는 캐시
    • 의 단위를 필요로 할 수 있습니다

    제작 :

    • 시작 시간에 대한 목표는 무엇입니까? 먼저 파악하고, 그렇지 않으면 접근 할 수 없습니다.
    • 시작 시간을 줄이기 위해 지불 할 의사가있는 가격은 얼마입니까? 1-10 개의 서버를 더 추가하면 수개월의 개발/테스트 시간을 소비하고 제품을 지연시키는 것보다 비용이 적게 듭니다.
    • DB 객체 또는 일반적으로 캐시가 문제가
  • +0

    +1, nice list ... –

    +0

    나는 목록을 좋아한다. 처음에는 내가 고려하지 않았거나 살펴본 적이없는 것들이있다. (직렬화 어셈블리, ASPX 페이지 컴파일). 그러나 내가 찾고있는 것은 목록의 각 항목이 전체 시작 프로세스와 관련되어 있는지에 대한 가시성을 확보 할 수있는 기능입니다. – Martin

    +0

    팁/디버깅/프로필 ASP.Net 시작에 대한 별도의 답변을 게시했습니다. –

    관련 문제