2010-05-11 5 views
0

2 가지 주요 목표를 가진 winservice를 실행 중입니다.다르게 WCF 스레드를 설정하는 방법

  1. 노출 된 웹 메소드 실행/처리.
  2. 실행 CPU 할당량을 사용하는 내부 프로세스. 스레드 풀 또는 TaskPool을에 대기하고 있습니다 (작업 등) WCF는 같은 스레드에 그것의 실행을 큐 같이 webMethods의 실행이 훨씬 더 많은 시간이 걸립니다 |

문제는 그 많은 내부 프로세스를 실행할 때이다. 내부 프로세스 작업 우선 순위를 가장 낮게 설정하고 webmethod 스레드 우선 순위를 높이로 설정하는 경우에도 이러한 상황이 발생합니다.

프레임 워크 4.0에서이 기능이 향상되기를 기대했지만 CPU가 다른 내부 작업을 처리하는 경우 WCF 대기열에있는 작업을 시스템이 처리하는 데 많은 시간이 걸립니다.

  1. WCF에서 사용하는 스레드 풀을 다른 것으로 변경할 수 있습니까?
  2. 작업 큐를 수동으로 변경할 수 있습니까 (글로벌 작업 큐, 로컬 작업 큐)?
  3. 다르게 동작하는 2 개의 작업 대기열을 수동으로 처리 할 수 ​​있습니까?

이 주제에 대한 도움이 필요합니다.

길래드.

답변

1

ThreadPool에는 작업자 스레드와 I/O 완료 스레드라는 두 가지 유형의 스레드가 있습니다. WCF 요청은 I/O 스레드에 의해 처리됩니다. ThreadPool.QueueUserWorkItem을 통해 실행하는 작업은 작업자 스레드에서 실행됩니다. 따라서 WCF 요청과 다른 CPU 작업은 이미 다른 대기열에서 작동하고 있습니다.

일부 성능 문제는 ThreadPool 설정으로 인해 발생할 수 있습니다. MSDN에서 :

스레드 풀은 최소 유휴 스레드 수를 유지합니다. 작업자 스레드의 경우이 최소값의 기본값은 프로세서 수입니다. GetMinThreads 메서드는 유휴 작업자 및 I/O 완료 스레드 수를 최소값으로 가져옵니다. 모든 스레드 풀 스레드가 작업에 할당되면 스레드 풀이 새로운 유휴 스레드 생성을 즉시 시작하지 않습니다. 스레드에 대한 스택 공간을 불필요하게 할당하지 않으려면 간격으로 새 유휴 스레드를 만듭니다. 이 간격은 현재 .NET Framework의 이후 버전에서 변경 될 수 있지만 현재 0.5 초입니다. 많은 수의 스레드 풀 작업이 대기중인 작업이 갑자기 발생하는 응용 프로그램이있는 경우 SetMinThreads 메서드를 사용하여 유휴 스레드의 최소 수를 늘립니다. 그렇지 않으면, 새로운 유휴 스레드를 생성 할 때 내장 된 지연으로 인해 병목 현상이 발생할 수 있습니다.

필자는 과거에 분명히 위의 병목 현상을 경험했습니다.이러한 설정을 변경할 수있는 SetMinThreads라는 메서드가 있습니다. 그건 그렇고, 당신은 스레드 우선 순위를 설정 언급; 그러나 ThreadPool의 스레드 우선 순위를 변경하는 메커니즘에 익숙하지 않습니다. 정교하게 제발 주시겠습니까? 또한, 내가 설정 한 스레드 우선 순위가 위험으로 가득차있을 수 있습니다 읽었습니다. 그런데

Coding Horror : Thread Priorities are Evil

는 얼마나 많은 프로세서/코어 컴퓨터가 실행되고?

+0

저는 ThreadSpool이 기본적으로 더 많은 스레드를 생성하도록하는 SetMinThreads를 사용했습니다. 이것은 부분적으로는 문제를 해결하지만로드가 매우 낮을 때에도 프로세스가 스레드 할당을 활성화합니다. 스레드 풀 대기열을 차단하는 작은 작업이 할당되어있을 때이 문제를 완전히 해결하지 못합니다. 스레드 우선 순위를 변경하면 모든 내부 스레드를 억제하고 사용자의 요청에 우선 순위를 부여 할 수 있지만 스레드 풀이 작업을 실행 한 경우에만 가능합니다. Thread.CurrentThread.Priority = ThreadPriority.Highest – Gilad

0

.NET 4.0을 사용하고 있으므로 TPL을 통해 장기 실행 프로세스를 실행할 수 있습니다. 기본적으로 TPL은 .NET 스레드 풀을 사용하여 작업을 실행하지만 자신의 TaskScheduler 구현을 제공 할 수도 있습니다. samples for the TPL의 예제 스케줄러 구현을 살펴보십시오. 개인적으로 사용하지는 않았지만 QueuedTaskScheduler는 작업을 대기열에 할당하고 자체 스레드 풀을 사용하여 작업을 처리합니다. 이를 사용하여 장기 실행 태스크에 사용할 최대 스레드 수를 정의 할 수 있습니다.

관련 문제