过多的 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 服务

使用 Unix 域套接字的 Python 中的 gRPC 服务器

相关内容