Слишком много RPC-соединений приводят к закрытию веб-сокета
Несколько серверов подключены через 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.
Как создать службу GRPC через локальный сокет, а не через inet в scala/java