작업 스케줄링을 할 때, 스케줄링의 작업은 HTTP 요청을 시작하는 것을 시뮬레이션하는 것이고, 작업이 더 많아질수록 작업 스케줄링이 마치 가짜 죽음처럼 보인다는 것을 발견합니다.
일반 윈도우 시스템에서 요청된 최대 기본 연결 수는 2개이며, 서버 운영체제에서는 기본값이 10개입니다. 이 동시 연결 제한을 수정하지 않으면,그러면 클라이언트가 동시에 만들 수 있는 http 연결 수는 2개에서 10개뿐입니다。
System.Net.ServicePointManager.DefaultConnectionLimit 이는 아래 그림과 같이 현재 기본 설정을 받을 수 있는 최대 연결 수입니다:
HttpClient에 기본 동시성 제한이 있나요?
.Net 4.0 이전에는 Http 작업은 HttpWebRequest에 의존했습니다. 기본적으로 같은 사이트에 대해 최대 2개의 동시성 제한을 매우 보수적으로 설정해 두어, 이로 인해 HttpWebRequests가 기본적으로 이상적인 속도를 얻지 못하는 경우가 많습니다(이 전략이 많은 개발자들을 답답하게 만드는 것 같습니다). 또한 App.config나 ServicePointManager.DefaultConnectionLimit의 값도 수정해야 합니다.
MS는 .Net 4.5에서 Http 작업을 처리하는 HttpClient 클래스를 도입했고, 저는 HttpClient와 HttpWebRequest가 같은 정책을 따른다고 생각했습니다. 오늘 멀티스레드 다운로드 프로그램을 작성할 때 10개의 동시 연결을 사용했는데, HttpClient에는 기본적으로 동시 연결 수 제한이 없다는 것을 알게 되었습니다.
처음에는 그렇다고 생각했어요. Net 4.5는 이 동시성 제한을 제거했는데(사실 지금은 아무도 이 표준을 따르지 않기 때문입니다), 관련 코드를 WebRequest로 다시 작성했더니 여전히 동시성 제한이 2였고 ServicePointManager.DefaultConnectionLimit의 값도 2였습니다. 즉, HttpClient는 HttpWebRequest 동시성 정책에 의해 제어되지 않으며, 시스템 수준의 동시성 제한도 없습니다.
또한 테스트 중에 HttpWebRequest가 모든 주소에 대해 최대 2개의 동시성을 기본값으로 설정하지 않는다는 것을 발견했습니다. 예를 들어로컬 HTTP 주소 연결(http://localhost/*)에는 동시성 제한이 없습니다.。
C# 멀티스레드 환경이 HttpWebRequest 동시 연결 한계를 호출합니다
.net의 HttpWebRequest 또는 WebClient는 멀티스레딩의 경우 동시 연결 제한이 있으며, Windows XP와 Windows 7과 같은 데스크톱 운영체제에서는 기본적으로 2, 서버 운영체제에서는 기본적으로 10입니다. 이 동시 연결 제한을 변경하지 않으면, 클라이언트가 한 번에 할 수 있는 HTTP 연결 수는 2개나 10개뿐입니다. 브라우저나 스파이더와 같은 일부 애플리케이션에서는 2회 또는 10회 동시성 수가 너무 적어 애플리케이션 성능에 큰 영향을 미칩니다. 이 동시 연결 제한은 HTTP 1.0과 HTTP 1.1 표준이 최대 2개의 동시 연결을 명시하기 때문입니다. 하지만 주류 브라우저들은 더 이상 이 규칙을 따르지 않지만, .NET 프레임워크는 여전히 기본적으로 이 규칙을 따릅니다.
많은 글에서 HttpWebRequest 비동기 접근이 동시 성능을 향상시킬 수 있다고 하지만, 저는 동시 연결 개수를 바꾸지 않으면 동기식 또는 비동기식 접근 성능이 좋지 않다는 것을 테스트해봤습니다.
app.config에서 최대 동시 연결 수를 다음과 같이 설정할 수도 있습니다:
참고 기사
하이퍼링크 로그인이 보입니다.
하이퍼링크 로그인이 보입니다.
|