programing

BeginProcessRequest()에서는 어떻게 됩니까?

closeapi 2023. 8. 29. 20:39
반응형

BeginProcessRequest()에서는 어떻게 됩니까?

우리는 서버 측 응용 프로그램 추적을 제공하기 위해 NewRelic을 사용하고 있습니다.

는 일부 으로 약 를 일부애플케이은방지 방식으로 한다는 것을 .System.Web.Mvc.MvcHandler.BeginProcessRequest().

이는 사용자 지정 컨트롤러 코드가 호출되기 전에 발생합니다(누적되지 않고 별도로 기록됨). 이 방법에 시간이 많이 소요되는 이유는 분명하지 않습니다.

MVC는 이 방법으로 어떤 일을 할 것입니까?단순히 요청 대기열일 수 있습니까?

[EDIT:] 의심한 대로 - 아래 스칼라의 답변은 정확했습니다. 모든 세션 종속성을 제거하고 최적화했으며 애플리케이션 확장성과 안정성이 크게 향상되었습니다.

에서 흔히 볼 수 있는 것을 스레드 민첩성이라고 합니다.그물.

주제 레이블 아래에 있는 결과(예: 응용 프로그램 코드)까지 볼 수 있습니다.System.Web.HttpApplication.BeginRequest()문제입니다. 가 실행되는 잠금에서 웹 는 스레드 민첩성 문제입니다. 대부분의 경우 코드가 실행되는 것이 아니라 읽기-쓰기 잠금에서 스레드가 다시 릴리스되기를 기다리는 웹 컨텍스트입니다.

Application_BeginRequest() 중지는 ASP에 퍼져 있는 입니다."라고 말합니다.NET 웹 스택.일반적으로 BeginRequest에서 로드 시간이 긴 경우 ASP를 처리합니다.NET 스레드 민첩성 및/또는 스레드 잠금 - 특히 IO 및 세션 기반 작업을 처리하는 경우.이것이 나쁜 것이 아니라 .net이 당신의 스레드를 동시에 유지하는 방법입니다.

차이는 합니다.실니다합행. 애플리케이션이 세션을 위해 여러 가지를 작성하는 경우 ASP.은 NET의 입니다.HttpContext.Current.Session.

이 문제가 발생할 수 있는 경우 스레드 ID를 확인하여 민첩성이 문제인지 확인하는 것이 좋습니다. 즉, 특정 요청에 대해 ID가 다릅니다.

, 아마도 당신의 디버깅에 다음과 같이 할 수 입니다.Global.asax.cs:

protected void Application_BeginRequest(Object sender, EventArgs e) { 
      Debug.WriteLine("BeginRequest_" + Thread.CurrentThread.ManagedThreadId.ToString()); 
   }

디버깅 출력 창을 엽니다(Visual Studio에서:출력을 보고 "출력 표시 위치" 드롭다운에서 "디버그"를 선택합니다.

디버깅하는 동안 오랫동안 본 페이지를 누릅니다.그런 다음 출력 로그를 확인합니다. 여러 ID가 표시되면 이로 인해 문제가 발생할 수 있습니다.

따라서 애플리케이션 코드가 세션을 약간 다르게 사용하거나 세션 또는 IO 작업이 페이지마다 높거나 낮을 수 있습니다.

이 경우 사이트 또는 각 페이지에서 세션이 사용되는 방법에 따라 속도를 높일 수 있습니다.

세션을 수정하지 않는 페이지의 경우:

   <% @Page EnableSessionState="ReadOnly" %>

세션 상태를 사용하지 않는 페이지의 경우:

<% @Page EnableSessionState="False" %>

앱이 세션(web.config)을 사용하지 않는 경우:

<configuration>
    <system.web>
      <sessionState mode="Off" />
    </system.web>
</configuration>

다음 예를 들어 보겠습니다.

사용자는 페이지를 로드한 다음 첫 번째 요청이 ASP 로드를 완료하기 전에 다른 페이지로 이동하기로 결정합니다.NET은 첫 번째 페이지 요청이 완료될 때까지 새 페이지 요청 로드를 대기하도록 세션 잠금을 강제합니다.ASP와 함께.NET MVC 각 작업은 동기화를 위해 사용자 세션을 잠급니다. 동일한 문제가 발생합니다.

사용자가 세션을 포기하고 반환되는 스레드가 더 이상 존재하지 않는 사용자를 찾는 것은 말할 것도 없고 잠금이 해제되기까지 걸린 모든 시간은 새 유물을 통해 보고됩니다.

그런데 UpdatePanel 컨트롤이 동일한 동작을 일으킵니다.

http://msdn.microsoft.com/en-us/magazine/cc163413.aspx

수행할 수 있는 작업:

이 잠금 문제는 Microsoft가 SessionStateUtility 클래스를 갖는 이유 중 하나입니다.

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx

이 Redis 구현에서 볼 수 있듯이 이 문제가 발생할 경우 기본 동작을 재정의할 수 있습니다. https://github.com/angieslist/AL-Redis

.net 기반 웹 사이트에서 사용하는 기본 상태 공급자에는 여러 가지 옵션이 있습니다.그러나 일반적으로 이 트랜잭션 시간은 스레드가 잠겨 있고 서버에 대한 요청이 완료될 때까지 대기하고 있음을 나타냅니다.

특정 컨트롤러가 단일 사용자의 요청을 병렬로 처리할 수 있도록 하려면 버전 3부터 MVC에 도입된 SessionState라는 특성을 사용할 수 있습니다.병렬화를 수행하기 위해 세션 없는 컨트롤러를 사용할 필요는 없습니다. SessionStateBehavior의 Ready-only 옵션을 사용하면 세션 데이터를 기반으로 구현한 보안 검사를 통과할 수 있습니다.

[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class ParallelController : Controller
{
    ...
}

저는 또한 지연이 있었습니다.System.Web.Mvc.MvcHandler.BeginProcessRequest()몇 가지 장기적인 행동을 하려고 시도했을 때, 나는 그것을 보았습니다.NewRelic이 특성은 문제를 해결하고 이 컨트롤러에 대한 작업을 병렬로 처리할 수 있는 기능을 제공합니다.

세션 사용이 매우 적은 앱에서 이와 같은 문제를 발견했습니다.승인된 답변을 고려하고 진단 목적으로 일시적으로 SessionState를 완전히 제거한 후에도 여전히 이 'Method'의 성능에 상당한 문제가 있었습니다.

이 스레드에서 todd_saylor의 코멘트를 바탕으로, 저는 제 자신의 사이트에서 많은 조사를 했고 그것을 발견했습니다.BeginProcessRequest다른 코드 영역에 나타나는 다양한 성능 손실에 대해 New Relic의 캐치올 역할을 할 수 있습니다.Red Gate의 ANTs Performance Profiler를 사용하여 로컬 컴퓨터에서 코드를 프로파일링함으로써 이 영역의 시간을 크게 단축할 수 있었습니다.

제 지역 프로파일링을 통해 몇 가지 사실이 밝혀졌습니다.

  1. 저는 Ninject를 DI 컨테이너로 사용하고 있었는데, 이로 인해 Object 해상도에서 성능이 저하되었습니다.Simple로 대체했습니다.인젝터 및 성능이 크기 순으로 향상되었습니다.
  2. AutoMapper의 IQueryable Extensions 사이 어딘가에서Project().To<>()프로젝트의 동적 컴파일 및 JITing이 제 요청 시간의 50%를 담당한 Linkq의 SQL Server 공급자입니다.컴파일된 쿼리로 대체하는 것은 또 다른 중요한 손상을 입혔습니다.

이것이 다른 누군가에게 도움이 되기를 바랍니다!

설명할 수 없는 높은 CPU 사용률을 경험하고 있는 IIS를 읽는 모든 사람에게, 제가 연 NewRelic 지원 포럼의 이 스레드를 살펴보십시오.

저는 이 문제의 근본 원인이 그들의 대리인이라는 것을 깨달을 때까지 일주일 넘게 이 문제를 처리해 왔습니다.

.NET 에이전트로 인해 IIS에서 CPU 사용량이 높음

그래서 제가 가장 먼저 제안하는 것은 그것을 제거하는 것입니다.더 복잡한 실험을 시작하기 전에 NET 에이전트가 변화가 있는지 확인합니다.

제가 이 질문에 대한 답을 올리게 된 것은 제가 이 문제를 해결하는 동안 먼저 여기에 왔기 때문입니다. 그리고 스레드 민첩성이 저를 잘못된 길로 이끌었기 때문입니다.(매우 흥미롭긴 하지만).

언급URL : https://stackoverflow.com/questions/17064380/what-happens-in-beginprocessrequest

반응형