過多的 RPC 連線導致 Web 套接字關閉

過多的 RPC 連線導致 Web 套接字關閉

多個伺服器透過 RPC 連接。有時,作業系統中的應用程式會進行過多的 RPC 調用,導致網路關閉。調試或配置作業系統的最佳方法是什麼?

"msg":"sending ping message: write tcp 127.0.0.1:36802->127.0.0.1:1234: use of closed network connection"
"msg":"handle me:write tcp4 127.0.0.1:1234->127.0.0.1:56244: write: broken pipe"

答案1

您沒有提到您進行了哪些故障排除來得出這是由於 RPC 呼叫過多造成的結論,也沒有提及有關故障點時網路連接狀態的任何詳細資訊。我認為此錯誤是由於缺乏連接池而導致連接埠耗盡造成的。

若要檢查連接埠是否耗盡,請使用 netstat 取得伺服器上連接埠的狀態。如果列出的連接埠數量過多,則可能存在連接埠耗盡問題。

gRPC 自動池化連接,但是編寫不當的程式碼可能會透過過度建立新的 gRPC 通道而不是重複使用現有通道來阻止其正常運作。我參考了 Microsoft 的文檔,因為它描述了建立新通道如何導致建立新的 HTTP/2 連線。

要修正此問題,您需要評估程式碼並修改它以更適當地重複使用通道。

gRPC 的性能最佳實踐

進行 gRPC 呼叫時應重複使用 gRPC 通道。重複使用通道允許透過現有 HTTP/2 連線進行多路復用呼叫。

如果為每個 gRPC 呼叫建立一個新通道,則完成所需的時間可能會顯著增加。每個呼叫都需要在客戶端和伺服器之間進行多次網路往返才能建立新的 HTTP/2 連線:

性能最佳實踐

盡可能重複使用存根和通道。

這樣做時,您可能會考慮 Unix 域套接字而不是 TCP 套接字。如果這些應用程式最終將分佈在多台電腦上運行,您應該堅持使用 TCP 套接字。如果它們總是在同一台機器上執行,您應該考慮 Unix 網域套接字。

如何透過本地套接字而不是 scala/java 中的 inet 來建立 GRPC 服務

Python 中的 gRPC 伺服器,帶有 Unix 域套接字

相關內容