2009-03-25 3 views
6

내장 된 ServiceHost와 함께 호스팅되는 WCF net.tcp 서비스가 있으며 일부 스트레스 테스트를 수행 할 때 이상한 동작이 발생합니다. 처음으로 요청을 보내면 5 ~ 10 건의 요청에 신속하게 응답하고 나머지는 약 2 초 간격으로 반환합니다. 두 번째로 요청을 보내면 10-20이 신속하게 반환되고 2 초 간격으로 휴식을 취합니다.net.tcp로 WCF의 성능

위의 내용은 100 개 이상의 요청을 신속하게 반환 할 때까지 반복되지만, 잠깐 기다리면 서비스의 메모리 사용량이 줄어들고 요청이 다시 5-10으로 돌아갑니다.

내가 테스트하고있는 서비스에는 약간의 지연이 있으므로 동시에 많은 연결을 열 수 있습니다. 지연이 제거되면 요청이 너무 빨리 반환되어 동시에 2-5 개의 연결이 동시에 열립니다 . 이 지연은 DB 연결 및 기타 보내는 물건을 시뮬레이션하는 것입니다.

ServiceHost가 무언가, 스레드, 클래스 인스턴스를 할당하는 것처럼 보이지만 그게 무엇인지 알 수는 없습니다.

나는 서비스를 계속 호출하기 위해 서비스를 호출하는 타이머를 클라이언트에 가질 수 있지만, 이는 나쁜 해결책으로 보입니다.

서비스에 지속적으로 많은 부하가 걸리면 모든 요청이 신속하게 처리되지만, 활동이 적을 때 서비스의 서지가 급증하면 서비스 속도가 느려집니다.

제가 궁금한 점은 WCF 서비스의 부하가 높을 때 할당되는 것입니다. 할당 된 것보다 더 많은 것을 미리 할당하도록 서비스를 구성 할 수 있습니다.

EDIT : 나는 더 많은 테스트를했는데 프로세스에 대한 taskmgr을 보면 servicehost가 '쉬고있는'경우 10 개의 스레드가 열려 있지만 요청을 보내면 threadcount가 올라간다는 것을 알 수 있습니다. threadcount가 높으면 서비스 호스트는 들어오는 요청을 빠르게 처리 할 수 ​​있습니다. 그러나 요청 전송을 일시 중지하면 열린 스레드 수는 감소하고 후속 요청은 처리하는 데 더 오랜 시간이 걸리기 시작합니다.

이제 서비스 호스트에게 스레드 묶음을 열어 둘 것을 어떻게 알릴 수 있습니까? 또는 기본적으로 10-12 이상 유지됩니까?

답변

1

요청 방법을 결정하는 사항은 ServiceThrottlingBehavior입니다. 처리중인 요청의 양을 제한하는 다양한 threashold가 있습니다. 이것은 또한 바인딩에 따라 달라집니다. 예를 들어 wsHttpBinding은 세션을 기본으로 설정하고 basicHttpBinding은 세션을 사용하지 않으며 기본 세션 제한 인 10은 문제가되지 않습니다.

자세한 내용은 http://msdn.microsoft.com/en-us/library/ms735114.aspx을 참조하십시오.

+0

감사합니다, 나는 사이트를 확인하고, 설정, 높은 한계 내 설정 파일에 이미 난 한 번 대신 먼저 5 ~ 10과의에서 들어오는 모든 연결을 처리 할 수 ​​있어야 너무 높아서있다 2 초에 1 번. – Kim

6

글쎄, 인터넷 검색을 많이 한 후에는 문제가 스레드 풀인 것으로 보입니다. CLR 스레드 풀은 몇 개의 스레드를 할당하고 사용되면 새로운 스레드 생성을 제한하고 잠시 후에 사용되지 않는 스레드를 할당 해제합니다.

ThreadPool이 SetMinThreads 호출을 따르지 않았 음을 의미하는 버그에 대해 혼란이 있습니다.

http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx

나는 ThreadPool이 설정을 수정할 때, 문제가 계속 있기 때문에이 버그가 해결, 또는 어떤 경우 확실하지 않다.

1

참조한 버그는 .NET 3.5 SP1에서 수정되었습니다.그게 문제와 관련이 있을지도 모릅니다. 모리스가 열쇠를 쥐고 있기보다는 조절이 문제가 될 확률이 훨씬 더 높습니다.

<system.serviceModel> 
    <service name="???" > 
    <endpoint ... /> 
    </service> 
</system.serviceModel> 

"빈"구성의 스로틀 제한은 무엇입니까? 10 세션, 16 동시 통화! 조심하십시오.

여기 스레딩에 더 : http://www.michaelckennedy.net/blog/2008/08/20/ThreadPoolBugInNET20SP1IsFixed.aspx

0

이 해킹 같은 느낌하지만이 문제를 해결할 것으로 보인다. 문제는 스레드 풀이 새 스레드를 시작하는 데 시간이 걸리므로 실제로 필요한 것은 대기중인 스레드입니다. 서비스에 생성자를 추가하고 원하는 최소 스레드 수를 설정하십시오.

public YourService() 
    { 
     int workerThreads; 
     int portThreads; 
     ThreadPool.GetMinThreads(out workerThreads, out portThreads); 
     ThreadPool.SetMinThreads(200, portThreads); 
    }