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를 사용하여 로컬 컴퓨터에서 코드를 프로파일링함으로써 이 영역의 시간을 크게 단축할 수 있었습니다.
제 지역 프로파일링을 통해 몇 가지 사실이 밝혀졌습니다.
- 저는 Ninject를 DI 컨테이너로 사용하고 있었는데, 이로 인해 Object 해상도에서 성능이 저하되었습니다.Simple로 대체했습니다.인젝터 및 성능이 크기 순으로 향상되었습니다.
- 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
'programing' 카테고리의 다른 글
PowerShell의 해시 테이블 값 문자열 보간 (0) | 2023.08.29 |
---|---|
파워셸 함정 (0) | 2023.08.29 |
손상된 Git 저장소를 어떻게 고칠 수 있습니까? (0) | 2023.08.29 |
UIScrollView에서 수직 스크롤 비활성화 (0) | 2023.08.29 |
FileDialog를 사용하여 워크북을 열고 Excel VBA에서 조작합니다. (0) | 2023.08.29 |