我曾經在.NET中寫過一個Crawler。爲了提高可伸縮性,我試圖利用.NET的異步API。.NET沒有可靠的異步套接字通信?
System.Net.HttpWebRequest具有異步API BeginGetResponse/EndGetResponse。但是,這對API只是獲取HTTP響應頭文件和Stream實例,我們可以從中提取HTTP響應內容。所以,我的策略是使用BeginGetResponse/EndGetResponse異步獲取響應Stream,然後使用BeginRead/EndRead從響應Stream實例異步獲取字節。
一切似乎都是完美的,直到履帶車進行壓力測試。在壓力測試中,Crawler遭受高內存使用。我用WinDbg + SoS檢查了內存,並發現大量的字節數組是由System.Threading.OverlappedData實例引起的。在互聯網搜索後,我發現這個KB http://support.microsoft.com/kb/947862從微軟。
根據知識庫,異步I/O的數量應該有一個「上限」,但它不會告訴「建議」的限制值。所以,在我看來,這個KB無濟於事。這顯然是一個.NET錯誤。最後,我不得不放棄從響應Stream中進行異步提取字節的想法,只是以同步的方式進行。
在.NET庫,允許 異步IO用點網插座 (Socket.BeginSend/ Socket.BeginReceive/ NetworkStream.BeginRead/ NetworkStream.BeginWrite)必須對量的 上限緩衝區 未完成(發送或接收) 與他們的異步IO。
網絡應用應當具有 上限 優秀異步IO,它的帖子的數量。
編輯:添加一些問號。
任何人有任何經驗在Socket & NetworkStream上做異步I/O? 一般來說,生產中的爬蟲是否使用帶有同步或異步的互聯網進行I/O?
不是一個單獨的問號,除了在主題...一個壞的標誌。 – 2008-10-25 10:02:19