close
這次給客戶的程式中,有一段是以MultiThread 方式以http post 資料到後端的系統
無奈一直有timeout 的發生,原本以為是後端系統採同步處理機制而其處理時間太久所產生的。
在客戶以Ethreal 抓封包下來一看的結果,原來是我的程式並沒有真的把資料post 出去。
在這幾天的debug 後,終於有了一些心得。這主要是底層tcp connection 的限制。
原因是http1.1 的標準:RFC2616(8.1.4節) 中有制訂了 預設的情況下,client 只能有2個connection
使用( A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. )
哇~ 真象終於大白。就是這個限制,造成我的multithread 程式在執行http post 遠端程式時不能成功的原因
解決的方法很簡單,可以參考這個討論串:http://www.themssforum.com/Framework/HttpWebRequest-Multi/
剛好就是我遇到的這個case
以.Net 來說。
就是要設HttpWebRequest.ServicePoint.ConnectionLimit = XX;
來突破這個限制。
但起太多的tcp connection 也是會耗系統資源的,如何拿捏得好,也是要以系統本身的loading 來計算。
以我來說一舜間最多是同時發出42 個request 。在4核心的hp 刀鋒serve二上,我就先設個42 ,理論上我認為只要20個就足夠使用了。
以下是我自已的一個測試。當一次post 出10筆request 資料時,是否在tcp 層真的建了10個connection
從畫面上看到,真的有建10個唷。哈~ 成功。
TCPView_Result

 參考資料:
 
arrow
arrow
    全站熱搜

    Chen Chris 發表在 痞客邦 留言(0) 人氣()