2019/09/05

[筆記] using HttpClient 導致 TCP 連線耗盡問題

最近公司內的大大分享了正確的 HttpClient 使用方法

才知道一直以來 「We are using HttpClient wrong! 」

不過改了寫法,也要知道修改前跟修改後到底改善了哪些地方才行

下面紀錄一下確認的方法:




先檢查當前可用的 tcp dynamicport 數量

netsh int ipv4  show dynamicport tcp

得到如下結果

netsh int ipv4 show dynamicport tcp Protocol tcp

Dynamic Port Range
————————————————
Start Port      : 49152
Number of Ports : 16384

為加速驗證,調整可用的 Ports 數量

 netsh int ipv4 set dynamicport tcp start=49152 num=255

執行成功 console 會回應 Ok.

接著開始執行測試程式,loop 99999 次 using HttpClient 連線存取 http://example.com

測試中可透過 powershell 的 Get-NetTCPConnection 指令觀察, 取得 example.com 的語法部分需用小括號括起來才可以正確的過濾到條件 (不知道沒小括號時 powershell 把他當什麼去了...)

Get-NetTCPConnection | 
where {$_.RemotePort -eq 80 
-and $_.RemoteAddress -eq ([System.Net.Dns]::GetHostAddresses('example.com').IPAddressToString)}



也可以下 measure 來看看取出來的資料總筆數是多少

Get-NetTCPConnection | 
where {$_.RemotePort -eq 80 
-and $_.RemoteAddress -eq ([System.Net.Dns]::GetHostAddresses('example.com').IPAddressToString)} |
measure

繼續觀察測試 console 上的連線進行到第幾次,可以看到在連線進行到 252 次之後出現了 tcp 資源耗盡導致的 exception 的狀況

此時的 tcp 佔用數量是 254







調整寫法後重新進行測試,確認 loop 怎麼跑,確認發起的連線次數已經遠超過上限值 255,但佔用的 tcp 連線永遠只有 1



ref:





沒有留言:

張貼留言