多个服务器通过 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 通道。重用通道允许通过现有的 HTTP/2 连接多路复用调用。
如果为每个 gRPC 调用创建一个新通道,则完成所需的时间会显著增加。每次调用都需要客户端和服务器之间进行多次网络往返以创建新的 HTTP/2 连接:
尽可能时始终重复使用存根和通道。
在此过程中,您可能会考虑使用 Unix 域套接字而不是 TCP 套接字。如果这些应用程序最终将在多台机器上分布运行,则应坚持使用 TCP 套接字。如果它们将始终在同一台机器上运行,则应考虑使用 Unix 域套接字。