한 번 .NET에 크롤러를 작성했습니다. 확장 성을 향상시키기 위해 .NET의 비동기 API를 활용하려고했습니다..NET에는 신뢰할 수있는 Asynchronouos 소켓 통신이 없습니까?
System.Net.HttpWebRequest에는 비동기 API 인 BeginGetResponse/EndGetResponse가 있습니다. 그러나이 API 쌍은 HTTP 응답 헤더와 스트림 인스턴스를 가져 와서 HTTP 응답 내용을 추출 할 수 있습니다. 그래서, 제 전략은 BeginGetResponse/EndGetResponse를 사용하여 비동기 적으로 응답 스트림을 얻은 다음 BeginRead/EndRead를 사용하여 비동기 적으로 응답 스트림 인스턴스에서 바이트를 가져 오는 것입니다.
크롤러가 스트레스 테스트를받을 때까지 모든 것이 완벽하게 보입니다. 스트레스 테스트에서 크롤러는 메모리 사용량이 높습니다. WinDbg + SoS를 사용하여 메모리를 검사하고 많은 바이트 배열이 System.Threading.OverlappedData 인스턴스에 의해 처리되는지 확인합니다. 인터넷에서 일부 검색을 한 후이 KB http://support.microsoft.com/kb/947862을 Microsoft에서 발견했습니다.
KB에 따르면 비동기 I/O의 수에는 "상한"이 있어야하지만 "제안 된"바운드 값은 지정되지 않습니다. 그래서, 내 눈에는이 KB가 아무 도움이되지 않습니다. 분명히 .NET 버그입니다. 마지막으로, 응답 스트림에서 비동기 추출 바이트를 수행하는 아이디어를 삭제하고 동기식으로 수행해야합니다.
는점 순 소켓 비동기 IO를 허용하는 .NET 라이브러리는 (Socket.BeginSend/ Socket.BeginReceive/ NetworkStream.BeginRead/ NetworkStream.BeginWrite)의 양에 상한이 있어야합니다 버퍼 비동기 입출력을 가진 의 미결 (송신 또는 수신).
네트워크 응용 프로그램은 뛰어난 비동기 IO 그게 게시물의 수에 상한이 있어야합니다.
편집 : 몇 가지 물음표를 추가하십시오.
누구나 소켓상의 비동기 입출력을 수행 한 경험이 있습니까? & NetworkStream? 일반적으로 프로덕션 환경의 크롤러는 동기식 또는 비동기식으로 인터넷에서 I/O를 수행합니까?
제목을 제외하고는 물음표가 아닙니다 ... 나쁜 징후입니다. –