gRPC壓測,HttpClient的連線數問題

  • 659
  • 0
  • 2020-11-27

如題

最近做gRPC的壓測時,發現服務的壓力一直上不去,

經過多方測試後發現是因為HttpClient,導致要求一直沒辦法打到服務上,

測試的方法是利用非同步連續打出10000個要求,然後計算全部完成後的時間,

結果一開始的數據不太理想

全部完成的時間是20秒

一開始一直想不通為什麼沒辦法把壓力壓上去,最後直接找了SocketsHttpHandler的source code來解讀,

dotnet core 3.0後,HttpClient的Handler改成使用SocketsHttpHandler,這個Handler的效能比起以前使用的有效率,

不過看其程式碼,發現其對同一個server的要求會使用同一條連線,

這樣的話,要求會受制於單條連線的消化量。

到此,我想如果我準備多個SocketsHttpHandler的話,應該可以讓要求量提升,

我建立了一個簡易的多連線Handler,TurnAroundSocketsHttpHandler,

首先建立十條連線測試,

總計時間花費剩下2秒多,

看來實驗成功,接下來改成100條連線測試

總算達到秒殺。

 

實驗的程式碼:https://github.com/phoenix-chen-2016/GrpcPerformanceExample

SocketsHttpHandler的原始碼:https://github.com/dotnet/runtime/tree/master/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler

2020/11/27補充:

在.Net 5推出後,看一下gRPC的效能改進,發現預設就能達到高效能的呼叫。

只要在專案中把gRPC的套件更新上去,並且把專案升級到.Net 5,自然就能以多連線處理呼叫。

參考資料:

使用 gRPC 的效能最佳作法 | Microsoft Docs