RPC 연결이 너무 많아 웹 소켓이 닫힙니다.

RPC 연결이 너무 많아 웹 소켓이 닫힙니다.

여러 서버가 RPC를 통해 연결됩니다. OS의 앱에 RPC 호출이 너무 많아 네트워크가 닫히는 경우가 있습니다. 내 OS를 디버깅하거나 구성하는 가장 좋은 방법은 무엇입니까?

"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 채널을 과도하게 생성하면 이 기능이 제대로 작동하지 않을 수 있습니다. 새 채널을 생성하면 새 HTTP/2 연결이 생성되는 방식에 대한 설명이 있는 Microsoft 문서를 참조했습니다.

이 문제를 해결하려면 코드를 평가하고 채널을 보다 적절하게 재사용하도록 수정해야 합니다.

gRPC를 사용한 성능 모범 사례

gRPC 호출을 수행할 때 gRPC 채널을 재사용해야 합니다. 채널을 재사용하면 기존 HTTP/2 연결을 통해 호출을 다중화할 수 있습니다.

각 gRPC 호출에 대해 새 채널이 생성되면 완료하는 데 걸리는 시간이 크게 늘어날 수 있습니다. 각 호출에는 새로운 HTTP/2 연결을 생성하기 위해 클라이언트와 서버 간에 여러 번의 네트워크 왕복이 필요합니다.

성능 모범 사례

가능하면 항상 스텁과 채널을 재사용하세요.

그렇게 하는 동안 TCP 소켓보다는 Unix 도메인 소켓을 고려할 수 있습니다. 이러한 애플리케이션이 결국 여러 시스템에 걸쳐 분산되어 작동하게 된다면 TCP 소켓을 고수해야 합니다. 항상 동일한 시스템에서 실행된다면 Unix 도메인 소켓을 고려해야 합니다.

scala/java에서 inet이 아닌 로컬 소켓을 통해 GRPC 서비스를 생성하는 방법

Unix 도메인 소켓을 사용하는 Python의 gRPC 서버

관련 정보