2011-05-04 5 views
11

나는 고성능을 대상으로 경량 웹 서비스를 구현하는 HttpHandler을 사용했다. 내용 유형이 application/x-www-form-urlencodedPOST이 필요합니다. 웹 서비스는 암호 해독, 데이터베이스 작업, 비즈니스 로직 등 많은 작업을 수행합니다. 로드 테스트 중에 성능 모니터 (ANTS 및 Visual Studio)는 대부분 67 %의 시간이 걸리는 한 줄의 코드를 가리 킵니다. 코드, 성능 모니터,이 라인에 대한 호출 스택의 맨 아래에 는 ASP.NET으로 Request.Form 성능

string value = context.Request.Form[MY_FORM_KEY]; 

이 전화를 말한다 :

System.Web.Hosting.UnsafeIISMethods.MgdSyncReadRequest(); 

가 범인입니다. 누구든지 도움이

을 설명시겠습니까?! 응용 프로그램은, 릴리스로 게시 닷넷 4에 윈도우 서버에서, 7.0 2008 년

감사합니다, 조이 J. 바렛

+4

병목 현상이 Request.Form 인덱서 인 경우 크게 놀랐습니다. 설명했던 모든 작업과 비교하면 무시할 수 있어야합니다. –

+0

아마도 context.Request.Form을 너무 많이 참조하는 대신, 로컬 변수에 값을 복제해야 할 수도 있습니다. –

+1

Form 변수 대신 헤더로 보내보십시오. 나는 폼 컬렉션이 더 많은 가치를 가지고 있다고 생각하고 그것을 가져 오는 것은 부피가 큰 콜을 만들고있다. 또한 솔루션을 빌드 할 때 대상 CPU를 확인할 수 있습니다. 때때로 x86으로 변경하면 System.Web.Hosting.UnsafeIISMethods.MgdSyncReadRequest() ...에서 병목 현상이 제거됩니다. – sajoshi

답변

2

System.Web.Hosting.UnsafeIISMethods.MgdSyncReadRequest() 

가져온 IIS 기능 (이다 짐작할 수 있듯이). HTTP.SYS 때문에, IIS에 대한 모든 HTTP의 작업을 수행하는 비트는 아니지만 직접 응용 프로그램이 얘기를해야합니다 어떤 점에서, 관리되지 않는 코드입니다. 양식 모음을 읽을 때

는 내가 무슨 일이 일어나고 추측하는 것은 .NET은 IIS에서 원시 요청에서이 문제를 읽고있다. 병 목으로 판명되면 양식 데이터를 비동기 적으로 읽고 네이티브 데이터 구조에 필요한 값을 저장하도록 코드를 리팩터링합니다. IIS 양식 값을 검색하기 위해 클라이언트에서 요청 스트림을 읽으려고하기 때문에

사이먼

6

시간 지연이 발생합니다. 이 스트림은 클라이언트 연결의 대상이되며 일부 원인은 반환되지 않습니다. Request.Form이 5 분 이상 차단되어 IIS가 결국 ThreadAbortException을 던질 수있는 경우를 보았습니다.

우리의 경우 우리는 Request.Form 값을 통해 읽어야하는 HttpModule을 가지고 있었고 (또는 폼 값을 반복하는 [ "key"를 요청했습니다) 서버에서 임의로 차단되어 반환되지 않습니다. 이 HttpModule을 사용하여 서버 측에서 응용 프로그램 성능을 추적 했으므로이 모듈을 사용하여 추적 한 내용이 클라이언트의 연결에 종속되어 서버 측 실행 결과가 왜곡된다는 것을 알게되었습니다.

당신은 응용 프로그램의 앞에 역 HTTP 프록시를 설치할 수 있습니다,이 문제를 해결하려면. 역방향 프록시는 클라이언트 스트림 읽기 (및 응용 프로그램에서 값 비싼 스레드 차단)의 책임을 덜어주고 서버에 완전한 요청을 보냅니다. 이렇게하면 클라이언트 스트림에서 읽기 위해 블로킹하지 않고 주 워크로드를 처리하기 위해 소중한 응용 프로그램 스레드를 저장할 수 있기 때문에 응용 프로그램의로드가 줄어 듭니다.

또한 HTTP (역방향 프록시)에서 일부 정적 콘텐츠 (사용중인 HTTP 유형에 따라 다름)를로드 해제하고로드 균형을 조정할 수 있습니다.

0

MgdSyncReadRequest 차단 된 내부 관리되지 않는 IIS API입니다. 그러나 제기 된 관리는 ThreadAbortException입니다. 다른 관리 스레드 Thread.Abort() 호출 될 수 있다는 것을 의미
.

http://referencesource.microsoft.com/#System.Web/RequestTimeoutManager.cs,177

thread.Abort(new HttpApplication.CancelModuleException(true)); 

솔루션 (검사 할 수 없습니다) :

나는 " RequestTimeoutManager"그것을 가지고, referencesource을 검색 구현하는 비동기 기반의 리더로, 수동으로 시간을 아웃 처리 ..